'; foreach ($terms as $t) { $url = get_term_link($t->term_id, BASE.$term); $out .= '
  • '; } $out .= ''; } return $out; } /** * Clear taxonomy list caches when terms are saved * @param int $term_id * @param int $tt_id * @param string $taxonomy * * @return void */ add_action('edited_term', 'jvbClearTermListCache', 10, 3); add_action('created_term', 'jvbClearTermListCache', 10, 3); add_action('delete_term', 'jvbClearTermListCache', 10, 3); function jvbClearTermListCache(int $term_id, int $tt_id, string $taxonomy):void { // Check if this taxonomy has a corresponding list $types = jvbGlobalDirectoryInfo(); foreach ($types as $type) { if ($type['slug'] === $taxonomy) { // Delete the option to force regeneration delete_option(BASE . $type['slug'] . '_list'); break; } } // If this is a city and it's linked to other taxonomies, clear those too if ($taxonomy === BASE.'city') { foreach ($types as $type) { if (!empty($type['links']) && in_array(BASE.'_city', $type['links'])) { delete_option(BASE . $type['slug'] . '_list'); } } } } /** * Clear list caches when post types are saved */ add_action('save_post', 'jvbClearListCache', 10, 2); function jvbClearListCache(int $post_id, \WP_Post $post):void { // SAFETY: Skip attachments and other non-content post types if (in_array($post->post_type, jvbIgnoredPostTypes())) { return; } if (jvbNoSaveIt($post_id, $post)) { return; } // Get post type $post_type = get_post_type($post_id); // Check if this post type has a corresponding list $types = jvbGlobalDirectoryInfo(); foreach ($types as $type) { if ($type['slug'] === $post_type) { // Delete the option to force regeneration delete_option(BASE . $type['slug'] . '_list'); break; } } } /** * @param int $artistID * @param string $taxonomy * * @return array */ function jvbGetArtistTerm(int $artistID, string $taxonomy):array { $taxonomy = (str_starts_with($taxonomy, BASE)) ? $taxonomy : BASE.$taxonomy; $terms = get_the_terms($artistID, $taxonomy); if ($terms && !is_wp_error($terms)) { $ID = $terms[0]->term_id; $name = $terms[0]->name; return [ 'id' => $ID, 'name' => $name, 'url' => get_term_link($ID, $taxonomy) ]; } return []; } /** * Gets the artist type taxonomy name * @param int $ID * * @return string */ function jvbArtistType(int $ID):string { $types = get_the_terms($ID, BASE.'type'); $type = ''; if ($types && !is_wp_error($types)) { $type = $types[0]->term_id; $type = get_term_meta($type, BASE.'singular', true); } return ($type == '') ? 'Tattoo Artist' : $type; } /** * Gets the first name of city listed * @param int $ID * * @return string */ function jvbArtistCity(int $ID):string { $cities = get_the_terms($ID, 'jvb_city'); if ($cities && !is_wp_error($cities)) { return $cities[0]->name; } return 'Edmonton'; } function jvbGetContentUsers(int $termID, $user = BASE.'artist'):array { $users = get_term_meta($termID, BASE.'users', true); if ($users === '') { $term = get_term($termID); $taxonomy = $term->taxonomy; if (taxIsJVBContentTax($taxonomy)) { $posts = new WP_Query([ 'post_type' => jvbCheckBase($user), 'posts_per_page' => -1, 'tax_query' => [ [ 'taxonomy' => $taxonomy, 'terms' => $term ] ] ]); if (!empty($posts->posts)) { $users = array_map( function ($post) { return $post->post_author; }, $posts->posts ); } $users = implode(',', $users); update_post_meta($termID, BASE.'users', $users); } } return explode(',', $users); }