diff -r c7c34916027a -r 177826044cd9 wp/wp-includes/taxonomy.php --- a/wp/wp-includes/taxonomy.php Mon Oct 14 18:06:33 2019 +0200 +++ b/wp/wp-includes/taxonomy.php Mon Oct 14 18:28:13 2019 +0200 @@ -25,7 +25,11 @@ global $wp_rewrite; if ( ! did_action( 'init' ) ) { - $rewrite = array( 'category' => false, 'post_tag' => false, 'post_format' => false ); + $rewrite = array( + 'category' => false, + 'post_tag' => false, + 'post_format' => false, + ); } else { /** @@ -36,118 +40,138 @@ * @param string $context Context of the rewrite base. Default 'type'. */ $post_format_base = apply_filters( 'post_format_rewrite_base', 'type' ); - $rewrite = array( - 'category' => array( + $rewrite = array( + 'category' => array( 'hierarchical' => true, - 'slug' => get_option('category_base') ? get_option('category_base') : 'category', - 'with_front' => ! get_option('category_base') || $wp_rewrite->using_index_permalinks(), - 'ep_mask' => EP_CATEGORIES, + 'slug' => get_option( 'category_base' ) ? get_option( 'category_base' ) : 'category', + 'with_front' => ! get_option( 'category_base' ) || $wp_rewrite->using_index_permalinks(), + 'ep_mask' => EP_CATEGORIES, ), - 'post_tag' => array( + 'post_tag' => array( 'hierarchical' => false, - 'slug' => get_option('tag_base') ? get_option('tag_base') : 'tag', - 'with_front' => ! get_option('tag_base') || $wp_rewrite->using_index_permalinks(), - 'ep_mask' => EP_TAGS, + 'slug' => get_option( 'tag_base' ) ? get_option( 'tag_base' ) : 'tag', + 'with_front' => ! get_option( 'tag_base' ) || $wp_rewrite->using_index_permalinks(), + 'ep_mask' => EP_TAGS, ), 'post_format' => $post_format_base ? array( 'slug' => $post_format_base ) : false, ); } - register_taxonomy( 'category', 'post', array( - 'hierarchical' => true, - 'query_var' => 'category_name', - 'rewrite' => $rewrite['category'], - 'public' => true, - 'show_ui' => true, - 'show_admin_column' => true, - '_builtin' => true, - 'capabilities' => array( - 'manage_terms' => 'manage_categories', - 'edit_terms' => 'edit_categories', - 'delete_terms' => 'delete_categories', - 'assign_terms' => 'assign_categories', - ), - 'show_in_rest' => true, - 'rest_base' => 'categories', - 'rest_controller_class' => 'WP_REST_Terms_Controller', - ) ); - - register_taxonomy( 'post_tag', 'post', array( - 'hierarchical' => false, - 'query_var' => 'tag', - 'rewrite' => $rewrite['post_tag'], - 'public' => true, - 'show_ui' => true, - 'show_admin_column' => true, - '_builtin' => true, - 'capabilities' => array( - 'manage_terms' => 'manage_post_tags', - 'edit_terms' => 'edit_post_tags', - 'delete_terms' => 'delete_post_tags', - 'assign_terms' => 'assign_post_tags', - ), - 'show_in_rest' => true, - 'rest_base' => 'tags', - 'rest_controller_class' => 'WP_REST_Terms_Controller', - ) ); - - register_taxonomy( 'nav_menu', 'nav_menu_item', array( - 'public' => false, - 'hierarchical' => false, - 'labels' => array( - 'name' => __( 'Navigation Menus' ), - 'singular_name' => __( 'Navigation Menu' ), - ), - 'query_var' => false, - 'rewrite' => false, - 'show_ui' => false, - '_builtin' => true, - 'show_in_nav_menus' => false, - ) ); - - register_taxonomy( 'link_category', 'link', array( - 'hierarchical' => false, - 'labels' => array( - 'name' => __( 'Link Categories' ), - 'singular_name' => __( 'Link Category' ), - 'search_items' => __( 'Search Link Categories' ), - 'popular_items' => null, - 'all_items' => __( 'All Link Categories' ), - 'edit_item' => __( 'Edit Link Category' ), - 'update_item' => __( 'Update Link Category' ), - 'add_new_item' => __( 'Add New Link Category' ), - 'new_item_name' => __( 'New Link Category Name' ), - 'separate_items_with_commas' => null, - 'add_or_remove_items' => null, - 'choose_from_most_used' => null, - 'back_to_items' => __( '← Back to Link Categories' ), - ), - 'capabilities' => array( - 'manage_terms' => 'manage_links', - 'edit_terms' => 'manage_links', - 'delete_terms' => 'manage_links', - 'assign_terms' => 'manage_links', - ), - 'query_var' => false, - 'rewrite' => false, - 'public' => false, - 'show_ui' => true, - '_builtin' => true, - ) ); - - register_taxonomy( 'post_format', 'post', array( - 'public' => true, - 'hierarchical' => false, - 'labels' => array( - 'name' => _x( 'Format', 'post format' ), - 'singular_name' => _x( 'Format', 'post format' ), - ), - 'query_var' => true, - 'rewrite' => $rewrite['post_format'], - 'show_ui' => false, - '_builtin' => true, - 'show_in_nav_menus' => current_theme_supports( 'post-formats' ), - ) ); + register_taxonomy( + 'category', + 'post', + array( + 'hierarchical' => true, + 'query_var' => 'category_name', + 'rewrite' => $rewrite['category'], + 'public' => true, + 'show_ui' => true, + 'show_admin_column' => true, + '_builtin' => true, + 'capabilities' => array( + 'manage_terms' => 'manage_categories', + 'edit_terms' => 'edit_categories', + 'delete_terms' => 'delete_categories', + 'assign_terms' => 'assign_categories', + ), + 'show_in_rest' => true, + 'rest_base' => 'categories', + 'rest_controller_class' => 'WP_REST_Terms_Controller', + ) + ); + + register_taxonomy( + 'post_tag', + 'post', + array( + 'hierarchical' => false, + 'query_var' => 'tag', + 'rewrite' => $rewrite['post_tag'], + 'public' => true, + 'show_ui' => true, + 'show_admin_column' => true, + '_builtin' => true, + 'capabilities' => array( + 'manage_terms' => 'manage_post_tags', + 'edit_terms' => 'edit_post_tags', + 'delete_terms' => 'delete_post_tags', + 'assign_terms' => 'assign_post_tags', + ), + 'show_in_rest' => true, + 'rest_base' => 'tags', + 'rest_controller_class' => 'WP_REST_Terms_Controller', + ) + ); + + register_taxonomy( + 'nav_menu', + 'nav_menu_item', + array( + 'public' => false, + 'hierarchical' => false, + 'labels' => array( + 'name' => __( 'Navigation Menus' ), + 'singular_name' => __( 'Navigation Menu' ), + ), + 'query_var' => false, + 'rewrite' => false, + 'show_ui' => false, + '_builtin' => true, + 'show_in_nav_menus' => false, + ) + ); + + register_taxonomy( + 'link_category', + 'link', + array( + 'hierarchical' => false, + 'labels' => array( + 'name' => __( 'Link Categories' ), + 'singular_name' => __( 'Link Category' ), + 'search_items' => __( 'Search Link Categories' ), + 'popular_items' => null, + 'all_items' => __( 'All Link Categories' ), + 'edit_item' => __( 'Edit Link Category' ), + 'update_item' => __( 'Update Link Category' ), + 'add_new_item' => __( 'Add New Link Category' ), + 'new_item_name' => __( 'New Link Category Name' ), + 'separate_items_with_commas' => null, + 'add_or_remove_items' => null, + 'choose_from_most_used' => null, + 'back_to_items' => __( '← Back to Link Categories' ), + ), + 'capabilities' => array( + 'manage_terms' => 'manage_links', + 'edit_terms' => 'manage_links', + 'delete_terms' => 'manage_links', + 'assign_terms' => 'manage_links', + ), + 'query_var' => false, + 'rewrite' => false, + 'public' => false, + 'show_ui' => true, + '_builtin' => true, + ) + ); + + register_taxonomy( + 'post_format', + 'post', + array( + 'public' => true, + 'hierarchical' => false, + 'labels' => array( + 'name' => _x( 'Formats', 'post format' ), + 'singular_name' => _x( 'Format', 'post format' ), + ), + 'query_var' => true, + 'rewrite' => $rewrite['post_format'], + 'show_ui' => false, + '_builtin' => true, + 'show_in_nav_menus' => current_theme_supports( 'post-formats' ), + ) + ); } /** @@ -164,14 +188,14 @@ * @param string $operator Optional. The logical operation to perform. Accepts 'and' or 'or'. 'or' means only * one element from the array needs to match; 'and' means all elements must match. * Default 'and'. - * @return array A list of taxonomy names or objects. + * @return string[]|WP_Taxonomy[] An array of taxonomy names or objects. */ function get_taxonomies( $args = array(), $output = 'names', $operator = 'and' ) { global $wp_taxonomies; - $field = ('names' == $output) ? 'name' : false; - - return wp_filter_object_list($wp_taxonomies, $args, $operator, $field); + $field = ( 'names' == $output ) ? 'name' : false; + + return wp_filter_object_list( $wp_taxonomies, $args, $operator, $field ); } /** @@ -198,9 +222,10 @@ function get_object_taxonomies( $object, $output = 'names' ) { global $wp_taxonomies; - if ( is_object($object) ) { - if ( $object->post_type == 'attachment' ) + if ( is_object( $object ) ) { + if ( $object->post_type == 'attachment' ) { return get_attachment_taxonomies( $object, $output ); + } $object = $object->post_type; } @@ -208,11 +233,12 @@ $taxonomies = array(); foreach ( (array) $wp_taxonomies as $tax_name => $tax_obj ) { - if ( array_intersect($object, (array) $tax_obj->object_type) ) { - if ( 'names' == $output ) + if ( array_intersect( $object, (array) $tax_obj->object_type ) ) { + if ( 'names' == $output ) { $taxonomies[] = $tax_name; - else + } else { $taxonomies[ $tax_name ] = $tax_obj; + } } } @@ -235,17 +261,22 @@ function get_taxonomy( $taxonomy ) { global $wp_taxonomies; - if ( ! taxonomy_exists( $taxonomy ) ) + if ( ! taxonomy_exists( $taxonomy ) ) { return false; - - return $wp_taxonomies[$taxonomy]; + } + + return $wp_taxonomies[ $taxonomy ]; } /** - * Checks that the taxonomy name exists. + * Determines whether the taxonomy name exists. * * Formerly is_taxonomy(), introduced in 2.3.0. * + * For more information on this and similar theme functions, check out + * the {@link https://developer.wordpress.org/themes/basics/conditional-tags/ + * Conditional Tags} article in the Theme Developer Handbook. + * * @since 3.0.0 * * @global array $wp_taxonomies The registered taxonomies. @@ -256,27 +287,32 @@ function taxonomy_exists( $taxonomy ) { global $wp_taxonomies; - return isset( $wp_taxonomies[$taxonomy] ); + return isset( $wp_taxonomies[ $taxonomy ] ); } /** - * Whether the taxonomy object is hierarchical. + * Determines whether the taxonomy object is hierarchical. * * Checks to make sure that the taxonomy is an object first. Then Gets the * object, and finally returns the hierarchical value in the object. * * A false return value might also mean that the taxonomy does not exist. * + * For more information on this and similar theme functions, check out + * the {@link https://developer.wordpress.org/themes/basics/conditional-tags/ + * Conditional Tags} article in the Theme Developer Handbook. + * * @since 2.3.0 * * @param string $taxonomy Name of taxonomy object. * @return bool Whether the taxonomy is hierarchical. */ -function is_taxonomy_hierarchical($taxonomy) { - if ( ! taxonomy_exists($taxonomy) ) +function is_taxonomy_hierarchical( $taxonomy ) { + if ( ! taxonomy_exists( $taxonomy ) ) { return false; - - $taxonomy = get_taxonomy($taxonomy); + } + + $taxonomy = get_taxonomy( $taxonomy ); return $taxonomy->hierarchical; } @@ -297,6 +333,7 @@ * @since 4.5.0 Introduced `publicly_queryable` argument. * @since 4.7.0 Introduced `show_in_rest`, 'rest_base' and 'rest_controller_class' * arguments to register the Taxonomy in REST API. + * @since 5.1.0 Introduced `meta_box_sanitize_cb` argument. * * @global array $wp_taxonomies Registered taxonomies. * @@ -339,6 +376,9 @@ * post_categories_meta_box() is used for hierarchical taxonomies, and * post_tags_meta_box() is used for non-hierarchical. If false, no meta * box is shown. + * @type callable $meta_box_sanitize_cb Callback function for sanitizing taxonomy data saved from a meta + * box. If no callback is defined, an appropriate one is determined + * based on the value of `$meta_box_cb`. * @type array $capabilities { * Array of capabilities for this taxonomy. * @@ -372,8 +412,9 @@ function register_taxonomy( $taxonomy, $object_type, $args = array() ) { global $wp_taxonomies; - if ( ! is_array( $wp_taxonomies ) ) + if ( ! is_array( $wp_taxonomies ) ) { $wp_taxonomies = array(); + } $args = wp_parse_args( $args ); @@ -389,7 +430,6 @@ $taxonomy_object->add_hooks(); - /** * Fires after a taxonomy is registered. * @@ -495,35 +535,37 @@ function get_taxonomy_labels( $tax ) { $tax->labels = (array) $tax->labels; - if ( isset( $tax->helps ) && empty( $tax->labels['separate_items_with_commas'] ) ) + if ( isset( $tax->helps ) && empty( $tax->labels['separate_items_with_commas'] ) ) { $tax->labels['separate_items_with_commas'] = $tax->helps; - - if ( isset( $tax->no_tagcloud ) && empty( $tax->labels['not_found'] ) ) + } + + if ( isset( $tax->no_tagcloud ) && empty( $tax->labels['not_found'] ) ) { $tax->labels['not_found'] = $tax->no_tagcloud; + } $nohier_vs_hier_defaults = array( - 'name' => array( _x( 'Tags', 'taxonomy general name' ), _x( 'Categories', 'taxonomy general name' ) ), - 'singular_name' => array( _x( 'Tag', 'taxonomy singular name' ), _x( 'Category', 'taxonomy singular name' ) ), - 'search_items' => array( __( 'Search Tags' ), __( 'Search Categories' ) ), - 'popular_items' => array( __( 'Popular Tags' ), null ), - 'all_items' => array( __( 'All Tags' ), __( 'All Categories' ) ), - 'parent_item' => array( null, __( 'Parent Category' ) ), - 'parent_item_colon' => array( null, __( 'Parent Category:' ) ), - 'edit_item' => array( __( 'Edit Tag' ), __( 'Edit Category' ) ), - 'view_item' => array( __( 'View Tag' ), __( 'View Category' ) ), - 'update_item' => array( __( 'Update Tag' ), __( 'Update Category' ) ), - 'add_new_item' => array( __( 'Add New Tag' ), __( 'Add New Category' ) ), - 'new_item_name' => array( __( 'New Tag Name' ), __( 'New Category Name' ) ), + 'name' => array( _x( 'Tags', 'taxonomy general name' ), _x( 'Categories', 'taxonomy general name' ) ), + 'singular_name' => array( _x( 'Tag', 'taxonomy singular name' ), _x( 'Category', 'taxonomy singular name' ) ), + 'search_items' => array( __( 'Search Tags' ), __( 'Search Categories' ) ), + 'popular_items' => array( __( 'Popular Tags' ), null ), + 'all_items' => array( __( 'All Tags' ), __( 'All Categories' ) ), + 'parent_item' => array( null, __( 'Parent Category' ) ), + 'parent_item_colon' => array( null, __( 'Parent Category:' ) ), + 'edit_item' => array( __( 'Edit Tag' ), __( 'Edit Category' ) ), + 'view_item' => array( __( 'View Tag' ), __( 'View Category' ) ), + 'update_item' => array( __( 'Update Tag' ), __( 'Update Category' ) ), + 'add_new_item' => array( __( 'Add New Tag' ), __( 'Add New Category' ) ), + 'new_item_name' => array( __( 'New Tag Name' ), __( 'New Category Name' ) ), 'separate_items_with_commas' => array( __( 'Separate tags with commas' ), null ), - 'add_or_remove_items' => array( __( 'Add or remove tags' ), null ), - 'choose_from_most_used' => array( __( 'Choose from the most used tags' ), null ), - 'not_found' => array( __( 'No tags found.' ), __( 'No categories found.' ) ), - 'no_terms' => array( __( 'No tags' ), __( 'No categories' ) ), - 'items_list_navigation' => array( __( 'Tags list navigation' ), __( 'Categories list navigation' ) ), - 'items_list' => array( __( 'Tags list' ), __( 'Categories list' ) ), + 'add_or_remove_items' => array( __( 'Add or remove tags' ), null ), + 'choose_from_most_used' => array( __( 'Choose from the most used tags' ), null ), + 'not_found' => array( __( 'No tags found.' ), __( 'No categories found.' ) ), + 'no_terms' => array( __( 'No tags' ), __( 'No categories' ) ), + 'items_list_navigation' => array( __( 'Tags list navigation' ), __( 'Categories list navigation' ) ), + 'items_list' => array( __( 'Tags list' ), __( 'Categories list' ) ), /* translators: Tab heading when selecting from the most used terms */ - 'most_used' => array( _x( 'Most Used', 'tags' ), _x( 'Most Used', 'categories' ) ), - 'back_to_items' => array( __( '← Back to Tags' ), __( '← Back to Categories' ) ), + 'most_used' => array( _x( 'Most Used', 'tags' ), _x( 'Most Used', 'categories' ) ), + 'back_to_items' => array( __( '← Back to Tags' ), __( '← Back to Categories' ) ), ); $nohier_vs_hier_defaults['menu_name'] = $nohier_vs_hier_defaults['name']; @@ -563,21 +605,34 @@ * @param string $object_type Name of the object type. * @return bool True if successful, false if not. */ -function register_taxonomy_for_object_type( $taxonomy, $object_type) { +function register_taxonomy_for_object_type( $taxonomy, $object_type ) { global $wp_taxonomies; - if ( !isset($wp_taxonomies[$taxonomy]) ) + if ( ! isset( $wp_taxonomies[ $taxonomy ] ) ) { return false; - - if ( ! get_post_type_object($object_type) ) + } + + if ( ! get_post_type_object( $object_type ) ) { return false; - - if ( ! in_array( $object_type, $wp_taxonomies[$taxonomy]->object_type ) ) - $wp_taxonomies[$taxonomy]->object_type[] = $object_type; + } + + if ( ! in_array( $object_type, $wp_taxonomies[ $taxonomy ]->object_type ) ) { + $wp_taxonomies[ $taxonomy ]->object_type[] = $object_type; + } // Filter out empties. $wp_taxonomies[ $taxonomy ]->object_type = array_filter( $wp_taxonomies[ $taxonomy ]->object_type ); + /** + * Fires after a taxonomy is registered for an object type. + * + * @since 5.1.0 + * + * @param string $taxonomy Taxonomy name. + * @param string $object_type Name of the object type. + */ + do_action( 'registered_taxonomy_for_object_type', $taxonomy, $object_type ); + return true; } @@ -595,17 +650,31 @@ function unregister_taxonomy_for_object_type( $taxonomy, $object_type ) { global $wp_taxonomies; - if ( ! isset( $wp_taxonomies[ $taxonomy ] ) ) + if ( ! isset( $wp_taxonomies[ $taxonomy ] ) ) { return false; - - if ( ! get_post_type_object( $object_type ) ) + } + + if ( ! get_post_type_object( $object_type ) ) { return false; + } $key = array_search( $object_type, $wp_taxonomies[ $taxonomy ]->object_type, true ); - if ( false === $key ) + if ( false === $key ) { return false; + } unset( $wp_taxonomies[ $taxonomy ]->object_type[ $key ] ); + + /** + * Fires after a taxonomy is unregistered for an object type. + * + * @since 5.1.0 + * + * @param string $taxonomy Taxonomy name. + * @param string $object_type Name of the object type. + */ + do_action( 'unregistered_taxonomy_for_object_type', $taxonomy, $object_type ); + return true; } @@ -636,7 +705,7 @@ * @param string|array $taxonomies String of taxonomy name or Array of string values of taxonomy names. * @param array|string $args Change the order of the object_ids, either ASC or DESC. * @return WP_Error|array If the taxonomy does not exist, then WP_Error will be returned. On success. - * the array can be empty meaning that there are no $object_ids found or it will return the $object_ids found. + * the array can be empty meaning that there are no $object_ids found or it will return the $object_ids found. */ function get_objects_in_term( $term_ids, $taxonomies, $args = array() ) { global $wpdb; @@ -654,20 +723,20 @@ } $defaults = array( 'order' => 'ASC' ); - $args = wp_parse_args( $args, $defaults ); + $args = wp_parse_args( $args, $defaults ); $order = ( 'desc' == strtolower( $args['order'] ) ) ? 'DESC' : 'ASC'; - $term_ids = array_map('intval', $term_ids ); + $term_ids = array_map( 'intval', $term_ids ); $taxonomies = "'" . implode( "', '", array_map( 'esc_sql', $taxonomies ) ) . "'"; - $term_ids = "'" . implode( "', '", $term_ids ) . "'"; + $term_ids = "'" . implode( "', '", $term_ids ) . "'"; $sql = "SELECT tr.object_id FROM $wpdb->term_relationships AS tr INNER JOIN $wpdb->term_taxonomy AS tt ON tr.term_taxonomy_id = tt.term_taxonomy_id WHERE tt.taxonomy IN ($taxonomies) AND tt.term_id IN ($term_ids) ORDER BY tr.object_id $order"; $last_changed = wp_cache_get_last_changed( 'terms' ); - $cache_key = 'get_objects_in_term:' . md5( $sql ) . ":$last_changed"; - $cache = wp_cache_get( $cache_key, 'terms' ); + $cache_key = 'get_objects_in_term:' . md5( $sql ) . ":$last_changed"; + $cache = wp_cache_get( $cache_key, 'terms' ); if ( false === $cache ) { $object_ids = $wpdb->get_col( $sql ); wp_cache_set( $cache_key, $object_ids, 'terms' ); @@ -675,7 +744,7 @@ $object_ids = (array) $cache; } - if ( ! $object_ids ){ + if ( ! $object_ids ) { return array(); } return $object_ids; @@ -771,28 +840,31 @@ return null; } + // Ensure for filters that this is not empty. + $taxonomy = $_term->taxonomy; + /** - * Filters a term. + * Filters a taxonomy term object. * * @since 2.3.0 - * @since 4.4.0 `$_term` can now also be a WP_Term object. + * @since 4.4.0 `$_term` is now a `WP_Term` object. * - * @param int|WP_Term $_term Term object or ID. - * @param string $taxonomy The taxonomy slug. + * @param WP_Term $_term Term object. + * @param string $taxonomy The taxonomy slug. */ $_term = apply_filters( 'get_term', $_term, $taxonomy ); /** - * Filters a taxonomy. + * Filters a taxonomy term object. * * The dynamic portion of the filter name, `$taxonomy`, refers - * to the taxonomy slug. + * to the slug of the term's taxonomy. * * @since 2.3.0 - * @since 4.4.0 `$_term` can now also be a WP_Term object. + * @since 4.4.0 `$_term` is now a `WP_Term` object. * - * @param int|WP_Term $_term Term object or ID. - * @param string $taxonomy The taxonomy slug. + * @param WP_Term $_term Term object. + * @param string $taxonomy The taxonomy slug. */ $_term = apply_filters( "get_{$taxonomy}", $_term, $taxonomy ); @@ -883,17 +955,17 @@ ); switch ( $field ) { - case 'slug' : + case 'slug': $args['slug'] = $value; break; - case 'name' : + case 'name': $args['name'] = $value; break; - case 'term_taxonomy_id' : + case 'term_taxonomy_id': $args['term_taxonomy_id'] = $value; - unset( $args[ 'taxonomy' ] ); + unset( $args['taxonomy'] ); break; - default : + default: return false; } @@ -933,20 +1005,22 @@ $term_id = intval( $term_id ); - $terms = _get_term_hierarchy($taxonomy); - - if ( ! isset($terms[$term_id]) ) + $terms = _get_term_hierarchy( $taxonomy ); + + if ( ! isset( $terms[ $term_id ] ) ) { return array(); - - $children = $terms[$term_id]; - - foreach ( (array) $terms[$term_id] as $child ) { + } + + $children = $terms[ $term_id ]; + + foreach ( (array) $terms[ $term_id ] as $child ) { if ( $term_id == $child ) { continue; } - if ( isset($terms[$child]) ) - $children = array_merge($children, get_term_children($child, $taxonomy)); + if ( isset( $terms[ $child ] ) ) { + $children = array_merge( $children, get_term_children( $child, $taxonomy ) ); + } } return $children; @@ -970,14 +1044,17 @@ */ function get_term_field( $field, $term, $taxonomy = '', $context = 'display' ) { $term = get_term( $term, $taxonomy ); - if ( is_wp_error($term) ) + if ( is_wp_error( $term ) ) { return $term; - - if ( !is_object($term) ) + } + + if ( ! is_object( $term ) ) { return ''; - - if ( !isset($term->$field) ) + } + + if ( ! isset( $term->$field ) ) { return ''; + } return sanitize_term_field( $field, $term->$field, $term->term_id, $term->taxonomy, $context ); } @@ -997,13 +1074,15 @@ function get_term_to_edit( $id, $taxonomy ) { $term = get_term( $id, $taxonomy ); - if ( is_wp_error($term) ) + if ( is_wp_error( $term ) ) { return $term; - - if ( !is_object($term) ) + } + + if ( ! is_object( $term ) ) { return ''; - - return sanitize_term($term, $taxonomy, 'edit'); + } + + return sanitize_term( $term, $taxonomy, 'edit' ); } /** @@ -1069,13 +1148,13 @@ * (a) a second non-empty parameter is passed, or * (b) the first parameter shares no keys with the default array (ie, it's a list of taxonomies) */ - $_args = wp_parse_args( $args ); + $_args = wp_parse_args( $args ); $key_intersect = array_intersect_key( $term_query->query_var_defaults, (array) $_args ); $do_legacy_args = $deprecated || empty( $key_intersect ); if ( $do_legacy_args ) { - $taxonomies = (array) $args; - $args = wp_parse_args( $deprecated, $defaults ); + $taxonomies = (array) $args; + $args = wp_parse_args( $deprecated, $defaults ); $args['taxonomy'] = $taxonomies; } else { $args = wp_parse_args( $args, $defaults ); @@ -1135,23 +1214,11 @@ * False on failure. */ function add_term_meta( $term_id, $meta_key, $meta_value, $unique = false ) { - // Bail if term meta table is not installed. - if ( get_option( 'db_version' ) < 34370 ) { - return false; - } - if ( wp_term_is_shared( $term_id ) ) { - return new WP_Error( 'ambiguous_term_id', __( 'Term meta cannot be added to terms that are shared between taxonomies.'), $term_id ); + return new WP_Error( 'ambiguous_term_id', __( 'Term meta cannot be added to terms that are shared between taxonomies.' ), $term_id ); } - $added = add_metadata( 'term', $term_id, $meta_key, $meta_value, $unique ); - - // Bust term query cache. - if ( $added ) { - wp_cache_set( 'last_changed', microtime(), 'terms' ); - } - - return $added; + return add_metadata( 'term', $term_id, $meta_key, $meta_value, $unique ); } /** @@ -1165,19 +1232,7 @@ * @return bool True on success, false on failure. */ function delete_term_meta( $term_id, $meta_key, $meta_value = '' ) { - // Bail if term meta table is not installed. - if ( get_option( 'db_version' ) < 34370 ) { - return false; - } - - $deleted = delete_metadata( 'term', $term_id, $meta_key, $meta_value ); - - // Bust term query cache. - if ( $deleted ) { - wp_cache_set( 'last_changed', microtime(), 'terms' ); - } - - return $deleted; + return delete_metadata( 'term', $term_id, $meta_key, $meta_value ); } /** @@ -1192,11 +1247,6 @@ * @return mixed If `$single` is false, an array of metadata values. If `$single` is true, a single metadata value. */ function get_term_meta( $term_id, $key = '', $single = false ) { - // Bail if term meta table is not installed. - if ( get_option( 'db_version' ) < 34370 ) { - return false; - } - return get_metadata( 'term', $term_id, $key, $single ); } @@ -1217,23 +1267,11 @@ * WP_Error when term_id is ambiguous between taxonomies. False on failure. */ function update_term_meta( $term_id, $meta_key, $meta_value, $prev_value = '' ) { - // Bail if term meta table is not installed. - if ( get_option( 'db_version' ) < 34370 ) { - return false; - } - if ( wp_term_is_shared( $term_id ) ) { - return new WP_Error( 'ambiguous_term_id', __( 'Term meta cannot be added to terms that are shared between taxonomies.'), $term_id ); + return new WP_Error( 'ambiguous_term_id', __( 'Term meta cannot be added to terms that are shared between taxonomies.' ), $term_id ); } - $updated = update_metadata( 'term', $term_id, $meta_key, $meta_value, $prev_value ); - - // Bust term query cache. - if ( $updated ) { - wp_cache_set( 'last_changed', microtime(), 'terms' ); - } - - return $updated; + return update_metadata( 'term', $term_id, $meta_key, $meta_value, $prev_value ); } /** @@ -1248,11 +1286,6 @@ * @return array|false Returns false if there is nothing to update. Returns an array of metadata on success. */ function update_termmeta_cache( $term_ids ) { - // Bail if term meta table is not installed. - if ( get_option( 'db_version' ) < 34370 ) { - return; - } - return update_meta_cache( 'term', $term_ids ); } @@ -1267,9 +1300,9 @@ * @return array|false Array with meta data, or false when the meta table is not installed. */ function has_term_meta( $term_id ) { - // Bail if term meta table is not installed. - if ( get_option( 'db_version' ) < 34370 ) { - return false; + $check = wp_check_term_meta_support_prefilter( null ); + if ( null !== $check ) { + return $check; } global $wpdb; @@ -1311,10 +1344,14 @@ } /** - * Check if Term exists. + * Determines whether a term exists. * * Formerly is_term(), introduced in 2.3.0. * + * For more information on this and similar theme functions, check out + * the {@link https://developer.wordpress.org/themes/basics/conditional-tags/ + * Conditional Tags} article in the Theme Developer Handbook. + * * @since 3.0.0 * * @global wpdb $wpdb WordPress database abstraction object. @@ -1324,56 +1361,60 @@ * @param int $parent Optional. ID of parent term under which to confine the exists search. * @return mixed Returns null if the term does not exist. Returns the term ID * if no taxonomy is specified and the term ID exists. Returns - * an array of the term ID and the term taxonomy ID the taxonomy + * an array of the term ID and the term taxonomy ID if the taxonomy * is specified and the pairing exists. */ function term_exists( $term, $taxonomy = '', $parent = null ) { global $wpdb; - $select = "SELECT term_id FROM $wpdb->terms as t WHERE "; + $select = "SELECT term_id FROM $wpdb->terms as t WHERE "; $tax_select = "SELECT tt.term_id, tt.term_taxonomy_id FROM $wpdb->terms AS t INNER JOIN $wpdb->term_taxonomy as tt ON tt.term_id = t.term_id WHERE "; - if ( is_int($term) ) { - if ( 0 == $term ) + if ( is_int( $term ) ) { + if ( 0 == $term ) { return 0; + } $where = 't.term_id = %d'; - if ( !empty($taxonomy) ) - return $wpdb->get_row( $wpdb->prepare( $tax_select . $where . " AND tt.taxonomy = %s", $term, $taxonomy ), ARRAY_A ); - else + if ( ! empty( $taxonomy ) ) { + return $wpdb->get_row( $wpdb->prepare( $tax_select . $where . ' AND tt.taxonomy = %s', $term, $taxonomy ), ARRAY_A ); + } else { return $wpdb->get_var( $wpdb->prepare( $select . $where, $term ) ); + } } $term = trim( wp_unslash( $term ) ); $slug = sanitize_title( $term ); - $where = 't.slug = %s'; - $else_where = 't.name = %s'; - $where_fields = array($slug); - $else_where_fields = array($term); - $orderby = 'ORDER BY t.term_id ASC'; - $limit = 'LIMIT 1'; - if ( !empty($taxonomy) ) { + $where = 't.slug = %s'; + $else_where = 't.name = %s'; + $where_fields = array( $slug ); + $else_where_fields = array( $term ); + $orderby = 'ORDER BY t.term_id ASC'; + $limit = 'LIMIT 1'; + if ( ! empty( $taxonomy ) ) { if ( is_numeric( $parent ) ) { - $parent = (int) $parent; - $where_fields[] = $parent; + $parent = (int) $parent; + $where_fields[] = $parent; $else_where_fields[] = $parent; - $where .= ' AND tt.parent = %d'; - $else_where .= ' AND tt.parent = %d'; + $where .= ' AND tt.parent = %d'; + $else_where .= ' AND tt.parent = %d'; } - $where_fields[] = $taxonomy; + $where_fields[] = $taxonomy; $else_where_fields[] = $taxonomy; - if ( $result = $wpdb->get_row( $wpdb->prepare("SELECT tt.term_id, tt.term_taxonomy_id FROM $wpdb->terms AS t INNER JOIN $wpdb->term_taxonomy as tt ON tt.term_id = t.term_id WHERE $where AND tt.taxonomy = %s $orderby $limit", $where_fields), ARRAY_A) ) + if ( $result = $wpdb->get_row( $wpdb->prepare( "SELECT tt.term_id, tt.term_taxonomy_id FROM $wpdb->terms AS t INNER JOIN $wpdb->term_taxonomy as tt ON tt.term_id = t.term_id WHERE $where AND tt.taxonomy = %s $orderby $limit", $where_fields ), ARRAY_A ) ) { return $result; - - return $wpdb->get_row( $wpdb->prepare("SELECT tt.term_id, tt.term_taxonomy_id FROM $wpdb->terms AS t INNER JOIN $wpdb->term_taxonomy as tt ON tt.term_id = t.term_id WHERE $else_where AND tt.taxonomy = %s $orderby $limit", $else_where_fields), ARRAY_A); + } + + return $wpdb->get_row( $wpdb->prepare( "SELECT tt.term_id, tt.term_taxonomy_id FROM $wpdb->terms AS t INNER JOIN $wpdb->term_taxonomy as tt ON tt.term_id = t.term_id WHERE $else_where AND tt.taxonomy = %s $orderby $limit", $else_where_fields ), ARRAY_A ); } - if ( $result = $wpdb->get_var( $wpdb->prepare("SELECT term_id FROM $wpdb->terms as t WHERE $where $orderby $limit", $where_fields) ) ) + if ( $result = $wpdb->get_var( $wpdb->prepare( "SELECT term_id FROM $wpdb->terms as t WHERE $where $orderby $limit", $where_fields ) ) ) { return $result; - - return $wpdb->get_var( $wpdb->prepare("SELECT term_id FROM $wpdb->terms as t WHERE $else_where $orderby $limit", $else_where_fields) ); + } + + return $wpdb->get_var( $wpdb->prepare( "SELECT term_id FROM $wpdb->terms as t WHERE $else_where $orderby $limit", $else_where_fields ) ); } /** @@ -1389,15 +1430,19 @@ * @return bool Whether `$term2` is a child of `$term1`. */ function term_is_ancestor_of( $term1, $term2, $taxonomy ) { - if ( ! isset( $term1->term_id ) ) + if ( ! isset( $term1->term_id ) ) { $term1 = get_term( $term1, $taxonomy ); - if ( ! isset( $term2->parent ) ) + } + if ( ! isset( $term2->parent ) ) { $term2 = get_term( $term2, $taxonomy ); - - if ( empty( $term1->term_id ) || empty( $term2->parent ) ) + } + + if ( empty( $term1->term_id ) || empty( $term2->parent ) ) { return false; - if ( $term2->parent == $term1->term_id ) + } + if ( $term2->parent == $term1->term_id ) { return true; + } return term_is_ancestor_of( $term1, get_term( $term2->parent, $taxonomy ), $taxonomy ); } @@ -1419,27 +1464,30 @@ * 'display', 'attribute', or 'js'. Default 'display'. * @return array|object Term with all fields sanitized. */ -function sanitize_term($term, $taxonomy, $context = 'display') { +function sanitize_term( $term, $taxonomy, $context = 'display' ) { $fields = array( 'term_id', 'name', 'description', 'slug', 'count', 'parent', 'term_group', 'term_taxonomy_id', 'object_id' ); $do_object = is_object( $term ); - $term_id = $do_object ? $term->term_id : (isset($term['term_id']) ? $term['term_id'] : 0); + $term_id = $do_object ? $term->term_id : ( isset( $term['term_id'] ) ? $term['term_id'] : 0 ); foreach ( (array) $fields as $field ) { if ( $do_object ) { - if ( isset($term->$field) ) - $term->$field = sanitize_term_field($field, $term->$field, $term_id, $taxonomy, $context); + if ( isset( $term->$field ) ) { + $term->$field = sanitize_term_field( $field, $term->$field, $term_id, $taxonomy, $context ); + } } else { - if ( isset($term[$field]) ) - $term[$field] = sanitize_term_field($field, $term[$field], $term_id, $taxonomy, $context); + if ( isset( $term[ $field ] ) ) { + $term[ $field ] = sanitize_term_field( $field, $term[ $field ], $term_id, $taxonomy, $context ); + } } } - if ( $do_object ) + if ( $do_object ) { $term->filter = $context; - else + } else { $term['filter'] = $context; + } return $term; } @@ -1467,16 +1515,18 @@ * 'attribute', or 'js'. * @return mixed Sanitized field. */ -function sanitize_term_field($field, $value, $term_id, $taxonomy, $context) { +function sanitize_term_field( $field, $value, $term_id, $taxonomy, $context ) { $int_fields = array( 'parent', 'term_id', 'count', 'term_group', 'term_taxonomy_id', 'object_id' ); if ( in_array( $field, $int_fields ) ) { $value = (int) $value; - if ( $value < 0 ) + if ( $value < 0 ) { $value = 0; + } } - if ( 'raw' == $context ) + if ( 'raw' == $context ) { return $value; + } if ( 'edit' == $context ) { @@ -1506,10 +1556,11 @@ */ $value = apply_filters( "edit_{$taxonomy}_{$field}", $value, $term_id ); - if ( 'description' == $field ) - $value = esc_html($value); // textarea_escaped - else - $value = esc_attr($value); + if ( 'description' == $field ) { + $value = esc_html( $value ); // textarea_escaped + } else { + $value = esc_attr( $value ); + } } elseif ( 'db' == $context ) { /** @@ -1549,7 +1600,6 @@ */ $value = apply_filters( 'pre_category_nicename', $value ); } - } elseif ( 'rss' == $context ) { /** @@ -1608,9 +1658,9 @@ } if ( 'attribute' == $context ) { - $value = esc_attr($value); + $value = esc_attr( $value ); } elseif ( 'js' == $context ) { - $value = esc_js($value); + $value = esc_js( $value ); } return $value; } @@ -1628,18 +1678,18 @@ * @return array|int|WP_Error Number of terms in that taxonomy or WP_Error if the taxonomy does not exist. */ function wp_count_terms( $taxonomy, $args = array() ) { - $defaults = array('hide_empty' => false); - $args = wp_parse_args($args, $defaults); + $defaults = array( 'hide_empty' => false ); + $args = wp_parse_args( $args, $defaults ); // backward compatibility - if ( isset($args['ignore_empty']) ) { + if ( isset( $args['ignore_empty'] ) ) { $args['hide_empty'] = $args['ignore_empty']; - unset($args['ignore_empty']); + unset( $args['ignore_empty'] ); } $args['fields'] = 'count'; - return get_terms($taxonomy, $args); + return get_terms( $taxonomy, $args ); } /** @@ -1657,8 +1707,9 @@ function wp_delete_object_term_relationships( $object_id, $taxonomies ) { $object_id = (int) $object_id; - if ( !is_array($taxonomies) ) - $taxonomies = array($taxonomies); + if ( ! is_array( $taxonomies ) ) { + $taxonomies = array( $taxonomies ); + } foreach ( (array) $taxonomies as $taxonomy ) { $term_ids = wp_get_object_terms( $object_id, $taxonomy, array( 'fields' => 'ids' ) ); @@ -1699,10 +1750,12 @@ $term = (int) $term; - if ( ! $ids = term_exists($term, $taxonomy) ) + if ( ! $ids = term_exists( $term, $taxonomy ) ) { return false; - if ( is_wp_error( $ids ) ) + } + if ( is_wp_error( $ids ) ) { return $ids; + } $tt_id = $ids['term_taxonomy_id']; @@ -1710,11 +1763,12 @@ if ( 'category' == $taxonomy ) { $defaults['default'] = get_option( 'default_category' ); - if ( $defaults['default'] == $term ) + if ( $defaults['default'] == $term ) { return 0; // Don't delete the default category + } } - $args = wp_parse_args($args, $defaults); + $args = wp_parse_args( $args, $defaults ); if ( isset( $args['default'] ) ) { $default = (int) $args['default']; @@ -1738,13 +1792,14 @@ do_action( 'pre_delete_term', $term, $taxonomy ); // Update children to point to new parent - if ( is_taxonomy_hierarchical($taxonomy) ) { - $term_obj = get_term($term, $taxonomy); - if ( is_wp_error( $term_obj ) ) + if ( is_taxonomy_hierarchical( $taxonomy ) ) { + $term_obj = get_term( $term, $taxonomy ); + if ( is_wp_error( $term_obj ) ) { return $term_obj; + } $parent = $term_obj->parent; - $edit_ids = $wpdb->get_results( "SELECT term_id, term_taxonomy_id FROM $wpdb->term_taxonomy WHERE `parent` = " . (int)$term_obj->term_id ); + $edit_ids = $wpdb->get_results( "SELECT term_id, term_taxonomy_id FROM $wpdb->term_taxonomy WHERE `parent` = " . (int) $term_obj->term_id ); $edit_tt_ids = wp_list_pluck( $edit_ids, 'term_taxonomy_id' ); /** @@ -1756,7 +1811,7 @@ */ do_action( 'edit_term_taxonomies', $edit_tt_ids ); - $wpdb->update( $wpdb->term_taxonomy, compact( 'parent' ), array( 'parent' => $term_obj->term_id) + compact( 'taxonomy' ) ); + $wpdb->update( $wpdb->term_taxonomy, compact( 'parent' ), array( 'parent' => $term_obj->term_id ) + compact( 'taxonomy' ) ); // Clean the cache for all child terms. $edit_term_ids = wp_list_pluck( $edit_ids, 'term_id' ); @@ -1778,22 +1833,31 @@ $object_ids = (array) $wpdb->get_col( $wpdb->prepare( "SELECT object_id FROM $wpdb->term_relationships WHERE term_taxonomy_id = %d", $tt_id ) ); foreach ( $object_ids as $object_id ) { - $terms = wp_get_object_terms( $object_id, $taxonomy, array( 'fields' => 'ids', 'orderby' => 'none' ) ); - if ( 1 == count($terms) && isset($default) ) { - $terms = array($default); + $terms = wp_get_object_terms( + $object_id, + $taxonomy, + array( + 'fields' => 'ids', + 'orderby' => 'none', + ) + ); + if ( 1 == count( $terms ) && isset( $default ) ) { + $terms = array( $default ); } else { - $terms = array_diff($terms, array($term)); - if (isset($default) && isset($force_default) && $force_default) - $terms = array_merge($terms, array($default)); + $terms = array_diff( $terms, array( $term ) ); + if ( isset( $default ) && isset( $force_default ) && $force_default ) { + $terms = array_merge( $terms, array( $default ) ); + } } - $terms = array_map('intval', $terms); + $terms = array_map( 'intval', $terms ); wp_set_object_terms( $object_id, $terms, $taxonomy ); } // Clean the relationship caches for all object types using this term. $tax_object = get_taxonomy( $taxonomy ); - foreach ( $tax_object->object_type as $object_type ) + foreach ( $tax_object->object_type as $object_type ) { clean_object_term_cache( $object_ids, $object_type ); + } $term_meta_ids = $wpdb->get_col( $wpdb->prepare( "SELECT meta_id FROM $wpdb->termmeta WHERE term_id = %d ", $term ) ); foreach ( $term_meta_ids as $mid ) { @@ -1820,10 +1884,11 @@ do_action( 'deleted_term_taxonomy', $tt_id ); // Delete the term if no taxonomies use it. - if ( !$wpdb->get_var( $wpdb->prepare( "SELECT COUNT(*) FROM $wpdb->term_taxonomy WHERE term_id = %d", $term) ) ) + if ( ! $wpdb->get_var( $wpdb->prepare( "SELECT COUNT(*) FROM $wpdb->term_taxonomy WHERE term_id = %d", $term ) ) ) { $wpdb->delete( $wpdb->terms, array( 'term_id' => $term ) ); - - clean_term_cache($term, $taxonomy); + } + + clean_term_cache( $term, $taxonomy ); /** * Fires after a term is deleted from the database and the cache is cleaned. @@ -1867,7 +1932,7 @@ * * @param int $cat_ID Category term ID. * @return bool|int|WP_Error Returns true if completes delete action; false if term doesn't exist; - * Zero on attempted deletion of default Category; WP_Error object is also a possibility. + * Zero on attempted deletion of default Category; WP_Error object is also a possibility. */ function wp_delete_category( $cat_ID ) { return wp_delete_term( $cat_ID, 'category' ); @@ -1889,21 +1954,25 @@ * @return array|WP_Error The requested term data or empty array if no terms found. * WP_Error if any of the $taxonomies don't exist. */ -function wp_get_object_terms($object_ids, $taxonomies, $args = array()) { - if ( empty( $object_ids ) || empty( $taxonomies ) ) +function wp_get_object_terms( $object_ids, $taxonomies, $args = array() ) { + if ( empty( $object_ids ) || empty( $taxonomies ) ) { return array(); - - if ( !is_array($taxonomies) ) - $taxonomies = array($taxonomies); + } + + if ( ! is_array( $taxonomies ) ) { + $taxonomies = array( $taxonomies ); + } foreach ( $taxonomies as $taxonomy ) { - if ( ! taxonomy_exists($taxonomy) ) + if ( ! taxonomy_exists( $taxonomy ) ) { return new WP_Error( 'invalid_taxonomy', __( 'Invalid taxonomy.' ) ); + } } - if ( !is_array($object_ids) ) - $object_ids = array($object_ids); - $object_ids = array_map('intval', $object_ids); + if ( ! is_array( $object_ids ) ) { + $object_ids = array( $object_ids ); + } + $object_ids = array_map( 'intval', $object_ids ); $args = wp_parse_args( $args ); @@ -1939,7 +2008,7 @@ } } - $args['taxonomy'] = $taxonomies; + $args['taxonomy'] = $taxonomies; $args['object_ids'] = $object_ids; // Taxonomies registered without an 'args' param are handled here. @@ -2033,7 +2102,7 @@ function wp_insert_term( $term, $taxonomy, $args = array() ) { global $wpdb; - if ( ! taxonomy_exists($taxonomy) ) { + if ( ! taxonomy_exists( $taxonomy ) ) { return new WP_Error( 'invalid_taxonomy', __( 'Invalid taxonomy.' ) ); } /** @@ -2054,25 +2123,30 @@ if ( '' == trim( $term ) ) { return new WP_Error( 'empty_term_name', __( 'A name is required for this term.' ) ); } - $defaults = array( 'alias_of' => '', 'description' => '', 'parent' => 0, 'slug' => ''); - $args = wp_parse_args( $args, $defaults ); + $defaults = array( + 'alias_of' => '', + 'description' => '', + 'parent' => 0, + 'slug' => '', + ); + $args = wp_parse_args( $args, $defaults ); if ( $args['parent'] > 0 && ! term_exists( (int) $args['parent'] ) ) { return new WP_Error( 'missing_parent', __( 'Parent term does not exist.' ) ); } - $args['name'] = $term; + $args['name'] = $term; $args['taxonomy'] = $taxonomy; // Coerce null description to strings, to avoid database errors. $args['description'] = (string) $args['description']; - $args = sanitize_term($args, $taxonomy, 'db'); + $args = sanitize_term( $args, $taxonomy, 'db' ); // expected_slashed ($name) - $name = wp_unslash( $args['name'] ); + $name = wp_unslash( $args['name'] ); $description = wp_unslash( $args['description'] ); - $parent = (int) $args['parent']; + $parent = (int) $args['parent']; $slug_provided = ! empty( $args['slug'] ); if ( ! $slug_provided ) { @@ -2092,11 +2166,15 @@ * The alias is not in a group, so we create a new one * and add the alias to it. */ - $term_group = $wpdb->get_var("SELECT MAX(term_group) FROM $wpdb->terms") + 1; - - wp_update_term( $alias->term_id, $taxonomy, array( - 'term_group' => $term_group, - ) ); + $term_group = $wpdb->get_var( "SELECT MAX(term_group) FROM $wpdb->terms" ) + 1; + + wp_update_term( + $alias->term_id, + $taxonomy, + array( + 'term_group' => $term_group, + ) + ); } } @@ -2104,11 +2182,15 @@ * Prevent the creation of terms with duplicate names at the same level of a taxonomy hierarchy, * unless a unique slug has been explicitly provided. */ - $name_matches = get_terms( $taxonomy, array( - 'name' => $name, - 'hide_empty' => false, - 'parent' => $args['parent'], - ) ); + $name_matches = get_terms( + $taxonomy, + array( + 'name' => $name, + 'hide_empty' => false, + 'parent' => $args['parent'], + 'update_term_meta_cache' => false, + ) + ); /* * The `name` match in `get_terms()` doesn't differentiate accented characters, @@ -2128,7 +2210,14 @@ $slug_match = get_term_by( 'slug', $slug, $taxonomy ); if ( ! $slug_provided || $name_match->slug === $slug || $slug_match ) { if ( is_taxonomy_hierarchical( $taxonomy ) ) { - $siblings = get_terms( $taxonomy, array( 'get' => 'all', 'parent' => $parent ) ); + $siblings = get_terms( + $taxonomy, + array( + 'get' => 'all', + 'parent' => $parent, + 'update_term_meta_cache' => false, + ) + ); $existing_term = null; if ( ( ! $slug_provided || $name_match->slug === $slug ) && in_array( $name, wp_list_pluck( $siblings, 'name' ) ) ) { @@ -2168,8 +2257,8 @@ $term_id = (int) $wpdb->insert_id; // Seems unreachable, However, Is used in the case that a term name is provided, which sanitizes to an empty string. - if ( empty($slug) ) { - $slug = sanitize_title($slug, $term_id); + if ( empty( $slug ) ) { + $slug = sanitize_title( $slug, $term_id ); /** This action is documented in wp-includes/taxonomy.php */ do_action( 'edit_terms', $term_id, $taxonomy ); @@ -2181,10 +2270,13 @@ $tt_id = $wpdb->get_var( $wpdb->prepare( "SELECT tt.term_taxonomy_id FROM $wpdb->term_taxonomy AS tt INNER JOIN $wpdb->terms AS t ON tt.term_id = t.term_id WHERE tt.taxonomy = %s AND t.term_id = %d", $taxonomy, $term_id ) ); - if ( !empty($tt_id) ) { - return array('term_id' => $term_id, 'term_taxonomy_id' => $tt_id); + if ( ! empty( $tt_id ) ) { + return array( + 'term_id' => $term_id, + 'term_taxonomy_id' => $tt_id, + ); } - $wpdb->insert( $wpdb->term_taxonomy, compact( 'term_id', 'taxonomy', 'description', 'parent') + array( 'count' => 0 ) ); + $wpdb->insert( $wpdb->term_taxonomy, compact( 'term_id', 'taxonomy', 'description', 'parent' ) + array( 'count' => 0 ) ); $tt_id = (int) $wpdb->insert_id; /* @@ -2193,7 +2285,26 @@ * and term_taxonomy_id of the older term instead. Then return out of the function so that the "create" hooks * are not fired. */ - $duplicate_term = $wpdb->get_row( $wpdb->prepare( "SELECT t.term_id, tt.term_taxonomy_id FROM $wpdb->terms t INNER JOIN $wpdb->term_taxonomy tt ON ( tt.term_id = t.term_id ) WHERE t.slug = %s AND tt.parent = %d AND tt.taxonomy = %s AND t.term_id < %d AND tt.term_taxonomy_id != %d", $slug, $parent, $taxonomy, $term_id, $tt_id ) ); + $duplicate_term = $wpdb->get_row( $wpdb->prepare( "SELECT t.term_id, t.slug, tt.term_taxonomy_id, tt.taxonomy FROM $wpdb->terms t INNER JOIN $wpdb->term_taxonomy tt ON ( tt.term_id = t.term_id ) WHERE t.slug = %s AND tt.parent = %d AND tt.taxonomy = %s AND t.term_id < %d AND tt.term_taxonomy_id != %d", $slug, $parent, $taxonomy, $term_id, $tt_id ) ); + + /** + * Filters the duplicate term check that takes place during term creation. + * + * Term parent+taxonomy+slug combinations are meant to be unique, and wp_insert_term() + * performs a last-minute confirmation of this uniqueness before allowing a new term + * to be created. Plugins with different uniqueness requirements may use this filter + * to bypass or modify the duplicate-term check. + * + * @since 5.1.0 + * + * @param object $duplicate_term Duplicate term row from terms table, if found. + * @param string $term Term being inserted. + * @param string $taxonomy Taxonomy name. + * @param array $args Term arguments passed to the function. + * @param int $tt_id term_taxonomy_id for the newly created term. + */ + $duplicate_term = apply_filters( 'wp_insert_term_duplicate_term_check', $duplicate_term, $term, $taxonomy, $args, $tt_id ); + if ( $duplicate_term ) { $wpdb->delete( $wpdb->terms, array( 'term_id' => $term_id ) ); $wpdb->delete( $wpdb->term_taxonomy, array( 'term_taxonomy_id' => $tt_id ) ); @@ -2202,7 +2313,10 @@ $tt_id = (int) $duplicate_term->term_taxonomy_id; clean_term_cache( $term_id, $taxonomy ); - return array( 'term_id' => $term_id, 'term_taxonomy_id' => $tt_id ); + return array( + 'term_id' => $term_id, + 'term_taxonomy_id' => $tt_id, + ); } /** @@ -2214,7 +2328,7 @@ * @param int $tt_id Term taxonomy ID. * @param string $taxonomy Taxonomy slug. */ - do_action( "create_term", $term_id, $tt_id, $taxonomy ); + do_action( 'create_term', $term_id, $tt_id, $taxonomy ); /** * Fires after a new term is created for a specific taxonomy. @@ -2239,7 +2353,7 @@ */ $term_id = apply_filters( 'term_id_filter', $term_id, $tt_id ); - clean_term_cache($term_id, $taxonomy); + clean_term_cache( $term_id, $taxonomy ); /** * Fires after a new term is created, and after the term cache has been cleaned. @@ -2265,7 +2379,10 @@ */ do_action( "created_{$taxonomy}", $term_id, $tt_id ); - return array('term_id' => $term_id, 'term_taxonomy_id' => $tt_id); + return array( + 'term_id' => $term_id, + 'term_taxonomy_id' => $tt_id, + ); } /** @@ -2300,36 +2417,50 @@ return new WP_Error( 'invalid_taxonomy', __( 'Invalid taxonomy.' ) ); } - if ( !is_array($terms) ) - $terms = array($terms); - - if ( ! $append ) - $old_tt_ids = wp_get_object_terms($object_id, $taxonomy, array('fields' => 'tt_ids', 'orderby' => 'none')); - else + if ( ! is_array( $terms ) ) { + $terms = array( $terms ); + } + + if ( ! $append ) { + $old_tt_ids = wp_get_object_terms( + $object_id, + $taxonomy, + array( + 'fields' => 'tt_ids', + 'orderby' => 'none', + 'update_term_meta_cache' => false, + ) + ); + } else { $old_tt_ids = array(); - - $tt_ids = array(); - $term_ids = array(); + } + + $tt_ids = array(); + $term_ids = array(); $new_tt_ids = array(); - foreach ( (array) $terms as $term) { - if ( !strlen(trim($term)) ) + foreach ( (array) $terms as $term ) { + if ( ! strlen( trim( $term ) ) ) { continue; - - if ( !$term_info = term_exists($term, $taxonomy) ) { + } + + if ( ! $term_info = term_exists( $term, $taxonomy ) ) { // Skip if a non-existent term ID is passed. - if ( is_int($term) ) + if ( is_int( $term ) ) { continue; - $term_info = wp_insert_term($term, $taxonomy); + } + $term_info = wp_insert_term( $term, $taxonomy ); } - if ( is_wp_error($term_info) ) + if ( is_wp_error( $term_info ) ) { return $term_info; + } $term_ids[] = $term_info['term_id']; - $tt_id = $term_info['term_taxonomy_id']; - $tt_ids[] = $tt_id; - - if ( $wpdb->get_var( $wpdb->prepare( "SELECT term_taxonomy_id FROM $wpdb->term_relationships WHERE object_id = %d AND term_taxonomy_id = %d", $object_id, $tt_id ) ) ) + $tt_id = $term_info['term_taxonomy_id']; + $tt_ids[] = $tt_id; + + if ( $wpdb->get_var( $wpdb->prepare( "SELECT term_taxonomy_id FROM $wpdb->term_relationships WHERE object_id = %d AND term_taxonomy_id = %d", $object_id, $tt_id ) ) ) { continue; + } /** * Fires immediately before an object-term relationship is added. @@ -2342,7 +2473,13 @@ * @param string $taxonomy Taxonomy slug. */ do_action( 'add_term_relationship', $object_id, $tt_id, $taxonomy ); - $wpdb->insert( $wpdb->term_relationships, array( 'object_id' => $object_id, 'term_taxonomy_id' => $tt_id ) ); + $wpdb->insert( + $wpdb->term_relationships, + array( + 'object_id' => $object_id, + 'term_taxonomy_id' => $tt_id, + ) + ); /** * Fires immediately after an object-term relationship is added. @@ -2358,16 +2495,17 @@ $new_tt_ids[] = $tt_id; } - if ( $new_tt_ids ) + if ( $new_tt_ids ) { wp_update_term_count( $new_tt_ids, $taxonomy ); + } if ( ! $append ) { $delete_tt_ids = array_diff( $old_tt_ids, $tt_ids ); if ( $delete_tt_ids ) { $in_delete_tt_ids = "'" . implode( "', '", $delete_tt_ids ) . "'"; - $delete_term_ids = $wpdb->get_col( $wpdb->prepare( "SELECT tt.term_id FROM $wpdb->term_taxonomy AS tt WHERE tt.taxonomy = %s AND tt.term_taxonomy_id IN ($in_delete_tt_ids)", $taxonomy ) ); - $delete_term_ids = array_map( 'intval', $delete_term_ids ); + $delete_term_ids = $wpdb->get_col( $wpdb->prepare( "SELECT tt.term_id FROM $wpdb->term_taxonomy AS tt WHERE tt.taxonomy = %s AND tt.term_taxonomy_id IN ($in_delete_tt_ids)", $taxonomy ) ); + $delete_term_ids = array_map( 'intval', $delete_term_ids ); $remove = wp_remove_object_terms( $object_id, $delete_term_ids, $taxonomy ); if ( is_wp_error( $remove ) ) { @@ -2376,17 +2514,28 @@ } } - $t = get_taxonomy($taxonomy); - if ( ! $append && isset($t->sort) && $t->sort ) { - $values = array(); - $term_order = 0; - $final_tt_ids = wp_get_object_terms($object_id, $taxonomy, array('fields' => 'tt_ids')); - foreach ( $tt_ids as $tt_id ) - if ( in_array($tt_id, $final_tt_ids) ) - $values[] = $wpdb->prepare( "(%d, %d, %d)", $object_id, $tt_id, ++$term_order); - if ( $values ) - if ( false === $wpdb->query( "INSERT INTO $wpdb->term_relationships (object_id, term_taxonomy_id, term_order) VALUES " . join( ',', $values ) . " ON DUPLICATE KEY UPDATE term_order = VALUES(term_order)" ) ) + $t = get_taxonomy( $taxonomy ); + if ( ! $append && isset( $t->sort ) && $t->sort ) { + $values = array(); + $term_order = 0; + $final_tt_ids = wp_get_object_terms( + $object_id, + $taxonomy, + array( + 'fields' => 'tt_ids', + 'update_term_meta_cache' => false, + ) + ); + foreach ( $tt_ids as $tt_id ) { + if ( in_array( $tt_id, $final_tt_ids ) ) { + $values[] = $wpdb->prepare( '(%d, %d, %d)', $object_id, $tt_id, ++$term_order ); + } + } + if ( $values ) { + if ( false === $wpdb->query( "INSERT INTO $wpdb->term_relationships (object_id, term_taxonomy_id, term_order) VALUES " . join( ',', $values ) . ' ON DUPLICATE KEY UPDATE term_order = VALUES(term_order)' ) ) { return new WP_Error( 'db_insert_error', __( 'Could not insert term relationship into the database.' ), $wpdb->last_error ); + } + } } wp_cache_delete( $object_id, $taxonomy . '_relationships' ); @@ -2517,7 +2666,7 @@ * The way this works is that if the taxonomy that the term belongs to is * hierarchical and has a parent, it will append that parent to the $slug. * - * If that still doesn't return an unique slug, then it try to append a number + * If that still doesn't return a unique slug, then it tries to append a number * until it finds a number that is truly unique. * * The only purpose for `$term` is for appending a parent, if one exists. @@ -2533,7 +2682,7 @@ function wp_unique_term_slug( $slug, $term ) { global $wpdb; - $needs_suffix = true; + $needs_suffix = true; $original_slug = $slug; // As of 4.1, duplicate slugs are allowed as long as they're in different taxonomies. @@ -2548,17 +2697,19 @@ $parent_suffix = ''; if ( $needs_suffix && is_taxonomy_hierarchical( $term->taxonomy ) && ! empty( $term->parent ) ) { $the_parent = $term->parent; - while ( ! empty($the_parent) ) { - $parent_term = get_term($the_parent, $term->taxonomy); - if ( is_wp_error($parent_term) || empty($parent_term) ) + while ( ! empty( $the_parent ) ) { + $parent_term = get_term( $the_parent, $term->taxonomy ); + if ( is_wp_error( $parent_term ) || empty( $parent_term ) ) { break; + } $parent_suffix .= '-' . $parent_term->slug; if ( ! term_exists( $slug . $parent_suffix ) ) { break; } - if ( empty($parent_term->parent) ) + if ( empty( $parent_term->parent ) ) { break; + } $the_parent = $parent_term->parent; } } @@ -2578,10 +2729,11 @@ if ( $parent_suffix ) { $slug .= $parent_suffix; } else { - if ( ! empty( $term->term_id ) ) + if ( ! empty( $term->term_id ) ) { $query = $wpdb->prepare( "SELECT slug FROM $wpdb->terms WHERE slug = %s AND term_id != %d", $slug, $term->term_id ); - else + } else { $query = $wpdb->prepare( "SELECT slug FROM $wpdb->terms WHERE slug = %s", $slug ); + } if ( $wpdb->get_var( $query ) ) { $num = 2; @@ -2663,18 +2815,23 @@ $term = wp_slash( $term ); // Merge old and new args with new args overwriting old ones. - $args = array_merge($term, $args); - - $defaults = array( 'alias_of' => '', 'description' => '', 'parent' => 0, 'slug' => ''); - $args = wp_parse_args($args, $defaults); - $args = sanitize_term($args, $taxonomy, 'db'); + $args = array_merge( $term, $args ); + + $defaults = array( + 'alias_of' => '', + 'description' => '', + 'parent' => 0, + 'slug' => '', + ); + $args = wp_parse_args( $args, $defaults ); + $args = sanitize_term( $args, $taxonomy, 'db' ); $parsed_args = $args; // expected_slashed ($name) - $name = wp_unslash( $args['name'] ); + $name = wp_unslash( $args['name'] ); $description = wp_unslash( $args['description'] ); - $parsed_args['name'] = $name; + $parsed_args['name'] = $name; $parsed_args['description'] = $description; if ( '' == trim( $name ) ) { @@ -2688,7 +2845,7 @@ $empty_slug = false; if ( empty( $args['slug'] ) ) { $empty_slug = true; - $slug = sanitize_title($name); + $slug = sanitize_title( $name ); } else { $slug = $args['slug']; } @@ -2706,11 +2863,15 @@ * The alias is not in a group, so we create a new one * and add the alias to it. */ - $term_group = $wpdb->get_var("SELECT MAX(term_group) FROM $wpdb->terms") + 1; - - wp_update_term( $alias->term_id, $taxonomy, array( - 'term_group' => $term_group, - ) ); + $term_group = $wpdb->get_var( "SELECT MAX(term_group) FROM $wpdb->terms" ) + 1; + + wp_update_term( + $alias->term_id, + $taxonomy, + array( + 'term_group' => $term_group, + ) + ); } $parsed_args['term_group'] = $term_group; @@ -2736,15 +2897,15 @@ if ( $duplicate && $duplicate->term_id != $term_id ) { // If an empty slug was passed or the parent changed, reset the slug to something unique. // Otherwise, bail. - if ( $empty_slug || ( $parent != $term['parent']) ) { - $slug = wp_unique_term_slug($slug, (object) $args); + if ( $empty_slug || ( $parent != $term['parent'] ) ) { + $slug = wp_unique_term_slug( $slug, (object) $args ); } else { - /* translators: 1: Taxonomy term slug */ + /* translators: %s: taxonomy term slug */ return new WP_Error( 'duplicate_term_slug', sprintf( __( 'The slug “%s” is already in use by another term.' ), $slug ) ); } } - $tt_id = (int) $wpdb->get_var( $wpdb->prepare( "SELECT tt.term_taxonomy_id FROM $wpdb->term_taxonomy AS tt INNER JOIN $wpdb->terms AS t ON tt.term_id = t.term_id WHERE tt.taxonomy = %s AND t.term_id = %d", $taxonomy, $term_id) ); + $tt_id = (int) $wpdb->get_var( $wpdb->prepare( "SELECT tt.term_taxonomy_id FROM $wpdb->term_taxonomy AS tt INNER JOIN $wpdb->terms AS t ON tt.term_id = t.term_id WHERE tt.taxonomy = %s AND t.term_id = %d", $taxonomy, $term_id ) ); // Check whether this is a shared term that needs splitting. $_term_id = _split_shared_term( $term_id, $tt_id ); @@ -2777,8 +2938,8 @@ $data = apply_filters( 'wp_update_term_data', $data, $term_id, $taxonomy, $args ); $wpdb->update( $wpdb->terms, $data, compact( 'term_id' ) ); - if ( empty($slug) ) { - $slug = sanitize_title($name, $term_id); + if ( empty( $slug ) ) { + $slug = sanitize_title( $name, $term_id ); $wpdb->update( $wpdb->terms, compact( 'slug' ), compact( 'term_id' ) ); } @@ -2823,7 +2984,7 @@ * @param int $tt_id Term taxonomy ID. * @param string $taxonomy Taxonomy slug. */ - do_action( "edit_term", $term_id, $tt_id, $taxonomy ); + do_action( 'edit_term', $term_id, $tt_id, $taxonomy ); /** * Fires after a term in a specific taxonomy has been updated, but before the term @@ -2841,7 +3002,7 @@ /** This filter is documented in wp-includes/taxonomy.php */ $term_id = apply_filters( 'term_id_filter', $term_id, $tt_id ); - clean_term_cache($term_id, $taxonomy); + clean_term_cache( $term_id, $taxonomy ); /** * Fires after a term has been updated, and the term cache has been cleaned. @@ -2852,7 +3013,7 @@ * @param int $tt_id Term taxonomy ID. * @param string $taxonomy Taxonomy slug. */ - do_action( "edited_term", $term_id, $tt_id, $taxonomy ); + do_action( 'edited_term', $term_id, $tt_id, $taxonomy ); /** * Fires after a term for a specific taxonomy has been updated, and the term @@ -2867,7 +3028,10 @@ */ do_action( "edited_{$taxonomy}", $term_id, $tt_id ); - return array('term_id' => $term_id, 'term_taxonomy_id' => $tt_id); + return array( + 'term_id' => $term_id, + 'term_taxonomy_id' => $tt_id, + ); } /** @@ -2880,14 +3044,15 @@ * @param bool $defer Optional. Enable if true, disable if false. * @return bool Whether term counting is enabled or disabled. */ -function wp_defer_term_counting($defer=null) { +function wp_defer_term_counting( $defer = null ) { static $_defer = false; - if ( is_bool($defer) ) { + if ( is_bool( $defer ) ) { $_defer = $defer; // flush any deferred counts - if ( !$defer ) + if ( ! $defer ) { wp_update_term_count( null, null, true ); + } } return $_defer; @@ -2915,22 +3080,25 @@ static $_deferred = array(); if ( $do_deferred ) { - foreach ( (array) array_keys($_deferred) as $tax ) { - wp_update_term_count_now( $_deferred[$tax], $tax ); - unset( $_deferred[$tax] ); + foreach ( (array) array_keys( $_deferred ) as $tax ) { + wp_update_term_count_now( $_deferred[ $tax ], $tax ); + unset( $_deferred[ $tax ] ); } } - if ( empty($terms) ) + if ( empty( $terms ) ) { return false; - - if ( !is_array($terms) ) - $terms = array($terms); + } + + if ( ! is_array( $terms ) ) { + $terms = array( $terms ); + } if ( wp_defer_term_counting() ) { - if ( !isset($_deferred[$taxonomy]) ) - $_deferred[$taxonomy] = array(); - $_deferred[$taxonomy] = array_unique( array_merge($_deferred[$taxonomy], $terms) ); + if ( ! isset( $_deferred[ $taxonomy ] ) ) { + $_deferred[ $taxonomy ] = array(); + } + $_deferred[ $taxonomy ] = array_unique( array_merge( $_deferred[ $taxonomy ], $terms ) ); return true; } @@ -2947,16 +3115,17 @@ * @return true Always true when complete. */ function wp_update_term_count_now( $terms, $taxonomy ) { - $terms = array_map('intval', $terms); - - $taxonomy = get_taxonomy($taxonomy); - if ( !empty($taxonomy->update_count_callback) ) { - call_user_func($taxonomy->update_count_callback, $terms, $taxonomy); + $terms = array_map( 'intval', $terms ); + + $taxonomy = get_taxonomy( $taxonomy ); + if ( ! empty( $taxonomy->update_count_callback ) ) { + call_user_func( $taxonomy->update_count_callback, $terms, $taxonomy ); } else { $object_types = (array) $taxonomy->object_type; foreach ( $object_types as &$object_type ) { - if ( 0 === strpos( $object_type, 'attachment:' ) ) + if ( 0 === strpos( $object_type, 'attachment:' ) ) { list( $object_type ) = explode( ':', $object_type ); + } } if ( $object_types == array_filter( $object_types, 'post_type_exists' ) ) { @@ -2968,7 +3137,7 @@ } } - clean_term_cache($terms, '', false); + clean_term_cache( $terms, '', false ); return true; } @@ -2993,21 +3162,22 @@ * @param int|array $object_ids Single or list of term object ID(s). * @param array|string $object_type The taxonomy object type. */ -function clean_object_term_cache($object_ids, $object_type) { +function clean_object_term_cache( $object_ids, $object_type ) { global $_wp_suspend_cache_invalidation; if ( ! empty( $_wp_suspend_cache_invalidation ) ) { return; } - if ( !is_array($object_ids) ) - $object_ids = array($object_ids); + if ( ! is_array( $object_ids ) ) { + $object_ids = array( $object_ids ); + } $taxonomies = get_object_taxonomies( $object_type ); foreach ( $object_ids as $id ) { foreach ( $taxonomies as $taxonomy ) { - wp_cache_delete($id, "{$taxonomy}_relationships"); + wp_cache_delete( $id, "{$taxonomy}_relationships" ); } } @@ -3036,31 +3206,32 @@ * @param bool $clean_taxonomy Optional. Whether to clean taxonomy wide caches (true), or just individual * term object caches (false). Default true. */ -function clean_term_cache($ids, $taxonomy = '', $clean_taxonomy = true) { +function clean_term_cache( $ids, $taxonomy = '', $clean_taxonomy = true ) { global $wpdb, $_wp_suspend_cache_invalidation; if ( ! empty( $_wp_suspend_cache_invalidation ) ) { return; } - if ( !is_array($ids) ) - $ids = array($ids); + if ( ! is_array( $ids ) ) { + $ids = array( $ids ); + } $taxonomies = array(); // If no taxonomy, assume tt_ids. - if ( empty($taxonomy) ) { - $tt_ids = array_map('intval', $ids); - $tt_ids = implode(', ', $tt_ids); - $terms = $wpdb->get_results("SELECT term_id, taxonomy FROM $wpdb->term_taxonomy WHERE term_taxonomy_id IN ($tt_ids)"); - $ids = array(); + if ( empty( $taxonomy ) ) { + $tt_ids = array_map( 'intval', $ids ); + $tt_ids = implode( ', ', $tt_ids ); + $terms = $wpdb->get_results( "SELECT term_id, taxonomy FROM $wpdb->term_taxonomy WHERE term_taxonomy_id IN ($tt_ids)" ); + $ids = array(); foreach ( (array) $terms as $term ) { $taxonomies[] = $term->taxonomy; - $ids[] = $term->term_id; + $ids[] = $term->term_id; wp_cache_delete( $term->term_id, 'terms' ); } - $taxonomies = array_unique($taxonomies); + $taxonomies = array_unique( $taxonomies ); } else { - $taxonomies = array($taxonomy); + $taxonomies = array( $taxonomy ); foreach ( $taxonomies as $taxonomy ) { foreach ( $ids as $id ) { wp_cache_delete( $id, 'terms' ); @@ -3122,7 +3293,7 @@ * function only fetches relationship data that is already in the cache. * * @since 2.3.0 - * @since 4.7.0 Returns a WP_Error object if get_term() returns an error for + * @since 4.7.0 Returns a `WP_Error` object if `get_term()` returns an error for * any of the matched terms. * * @param int $id Term object ID. @@ -3181,35 +3352,42 @@ * @param array|string $object_type The taxonomy object type. * @return void|false False if all of the terms in `$object_ids` are already cached. */ -function update_object_term_cache($object_ids, $object_type) { - if ( empty($object_ids) ) +function update_object_term_cache( $object_ids, $object_type ) { + if ( empty( $object_ids ) ) { return; - - if ( !is_array($object_ids) ) - $object_ids = explode(',', $object_ids); - - $object_ids = array_map('intval', $object_ids); - - $taxonomies = get_object_taxonomies($object_type); + } + + if ( ! is_array( $object_ids ) ) { + $object_ids = explode( ',', $object_ids ); + } + + $object_ids = array_map( 'intval', $object_ids ); + + $taxonomies = get_object_taxonomies( $object_type ); $ids = array(); foreach ( (array) $object_ids as $id ) { foreach ( $taxonomies as $taxonomy ) { - if ( false === wp_cache_get($id, "{$taxonomy}_relationships") ) { + if ( false === wp_cache_get( $id, "{$taxonomy}_relationships" ) ) { $ids[] = $id; break; } } } - if ( empty( $ids ) ) + if ( empty( $ids ) ) { return false; - - $terms = wp_get_object_terms( $ids, $taxonomies, array( - 'fields' => 'all_with_object_id', - 'orderby' => 'name', - 'update_term_meta_cache' => false, - ) ); + } + + $terms = wp_get_object_terms( + $ids, + $taxonomies, + array( + 'fields' => 'all_with_object_id', + 'orderby' => 'name', + 'update_term_meta_cache' => false, + ) + ); $object_terms = array(); foreach ( (array) $terms as $term ) { @@ -3218,10 +3396,11 @@ foreach ( $ids as $id ) { foreach ( $taxonomies as $taxonomy ) { - if ( ! isset($object_terms[$id][$taxonomy]) ) { - if ( !isset($object_terms[$id]) ) - $object_terms[$id] = array(); - $object_terms[$id][$taxonomy] = array(); + if ( ! isset( $object_terms[ $id ][ $taxonomy ] ) ) { + if ( ! isset( $object_terms[ $id ] ) ) { + $object_terms[ $id ] = array(); + } + $object_terms[ $id ][ $taxonomy ] = array(); } } } @@ -3260,26 +3439,37 @@ /** * Retrieves children of taxonomy as Term IDs. * - * @ignore + * @access private * @since 2.3.0 * * @param string $taxonomy Taxonomy name. * @return array Empty if $taxonomy isn't hierarchical or returns children as Term IDs. */ function _get_term_hierarchy( $taxonomy ) { - if ( !is_taxonomy_hierarchical($taxonomy) ) + if ( ! is_taxonomy_hierarchical( $taxonomy ) ) { return array(); - $children = get_option("{$taxonomy}_children"); - - if ( is_array($children) ) + } + $children = get_option( "{$taxonomy}_children" ); + + if ( is_array( $children ) ) { return $children; + } $children = array(); - $terms = get_terms($taxonomy, array('get' => 'all', 'orderby' => 'id', 'fields' => 'id=>parent')); + $terms = get_terms( + $taxonomy, + array( + 'get' => 'all', + 'orderby' => 'id', + 'fields' => 'id=>parent', + 'update_term_meta_cache' => false, + ) + ); foreach ( $terms as $term_id => $parent ) { - if ( $parent > 0 ) - $children[$parent][] = $term_id; + if ( $parent > 0 ) { + $children[ $parent ][] = $term_id; + } } - update_option("{$taxonomy}_children", $children); + update_option( "{$taxonomy}_children", $children ); return $children; } @@ -3305,14 +3495,16 @@ */ function _get_term_children( $term_id, $terms, $taxonomy, &$ancestors = array() ) { $empty_array = array(); - if ( empty($terms) ) + if ( empty( $terms ) ) { return $empty_array; - - $term_list = array(); - $has_children = _get_term_hierarchy($taxonomy); - - if ( ( 0 != $term_id ) && ! isset($has_children[$term_id]) ) + } + + $term_list = array(); + $has_children = _get_term_hierarchy( $taxonomy ); + + if ( ( 0 != $term_id ) && ! isset( $has_children[ $term_id ] ) ) { return $empty_array; + } // Include the term itself in the ancestors array, so we can properly detect when a loop has occurred. if ( empty( $ancestors ) ) { @@ -3321,10 +3513,11 @@ foreach ( (array) $terms as $term ) { $use_id = false; - if ( !is_object($term) ) { - $term = get_term($term, $taxonomy); - if ( is_wp_error( $term ) ) + if ( ! is_object( $term ) ) { + $term = get_term( $term, $taxonomy ); + if ( is_wp_error( $term ) ) { return $term; + } $use_id = true; } @@ -3334,18 +3527,21 @@ } if ( $term->parent == $term_id ) { - if ( $use_id ) + if ( $use_id ) { $term_list[] = $term->term_id; - else + } else { $term_list[] = $term; - - if ( !isset($has_children[$term->term_id]) ) + } + + if ( ! isset( $has_children[ $term->term_id ] ) ) { continue; + } $ancestors[ $term->term_id ] = 1; - if ( $children = _get_term_children( $term->term_id, $terms, $taxonomy, $ancestors) ) - $term_list = array_merge($term_list, $children); + if ( $children = _get_term_children( $term->term_id, $terms, $taxonomy, $ancestors ) ) { + $term_list = array_merge( $term_list, $children ); + } } } @@ -3370,42 +3566,45 @@ global $wpdb; // This function only works for hierarchical taxonomies like post categories. - if ( !is_taxonomy_hierarchical( $taxonomy ) ) + if ( ! is_taxonomy_hierarchical( $taxonomy ) ) { return; - - $term_hier = _get_term_hierarchy($taxonomy); - - if ( empty($term_hier) ) + } + + $term_hier = _get_term_hierarchy( $taxonomy ); + + if ( empty( $term_hier ) ) { return; - - $term_items = array(); + } + + $term_items = array(); $terms_by_id = array(); - $term_ids = array(); + $term_ids = array(); foreach ( (array) $terms as $key => $term ) { - $terms_by_id[$term->term_id] = & $terms[$key]; - $term_ids[$term->term_taxonomy_id] = $term->term_id; + $terms_by_id[ $term->term_id ] = & $terms[ $key ]; + $term_ids[ $term->term_taxonomy_id ] = $term->term_id; } // Get the object and term ids and stick them in a lookup table. - $tax_obj = get_taxonomy($taxonomy); - $object_types = esc_sql($tax_obj->object_type); - $results = $wpdb->get_results("SELECT object_id, term_taxonomy_id FROM $wpdb->term_relationships INNER JOIN $wpdb->posts ON object_id = ID WHERE term_taxonomy_id IN (" . implode(',', array_keys($term_ids)) . ") AND post_type IN ('" . implode("', '", $object_types) . "') AND post_status = 'publish'"); + $tax_obj = get_taxonomy( $taxonomy ); + $object_types = esc_sql( $tax_obj->object_type ); + $results = $wpdb->get_results( "SELECT object_id, term_taxonomy_id FROM $wpdb->term_relationships INNER JOIN $wpdb->posts ON object_id = ID WHERE term_taxonomy_id IN (" . implode( ',', array_keys( $term_ids ) ) . ") AND post_type IN ('" . implode( "', '", $object_types ) . "') AND post_status = 'publish'" ); foreach ( $results as $row ) { - $id = $term_ids[$row->term_taxonomy_id]; - $term_items[$id][$row->object_id] = isset($term_items[$id][$row->object_id]) ? ++$term_items[$id][$row->object_id] : 1; + $id = $term_ids[ $row->term_taxonomy_id ]; + $term_items[ $id ][ $row->object_id ] = isset( $term_items[ $id ][ $row->object_id ] ) ? ++$term_items[ $id ][ $row->object_id ] : 1; } // Touch every ancestor's lookup row for each post in each term. foreach ( $term_ids as $term_id ) { - $child = $term_id; + $child = $term_id; $ancestors = array(); - while ( !empty( $terms_by_id[$child] ) && $parent = $terms_by_id[$child]->parent ) { + while ( ! empty( $terms_by_id[ $child ] ) && $parent = $terms_by_id[ $child ]->parent ) { $ancestors[] = $child; - if ( !empty( $term_items[$term_id] ) ) - foreach ( $term_items[$term_id] as $item_id => $touches ) { - $term_items[$parent][$item_id] = isset($term_items[$parent][$item_id]) ? ++$term_items[$parent][$item_id]: 1; + if ( ! empty( $term_items[ $term_id ] ) ) { + foreach ( $term_items[ $term_id ] as $item_id => $touches ) { + $term_items[ $parent ][ $item_id ] = isset( $term_items[ $parent ][ $item_id ] ) ? ++$term_items[ $parent ][ $item_id ] : 1; } + } $child = $parent; if ( in_array( $parent, $ancestors ) ) { @@ -3415,9 +3614,11 @@ } // Transfer the touched cells. - foreach ( (array) $term_items as $id => $items ) - if ( isset($terms_by_id[$id]) ) - $terms_by_id[$id]->count = count($items); + foreach ( (array) $term_items as $id => $items ) { + if ( isset( $terms_by_id[ $id ] ) ) { + $terms_by_id[ $id ]->count = count( $items ); + } + } } /** @@ -3436,7 +3637,7 @@ $non_cached_ids = _get_non_cached_ids( $term_ids, 'terms' ); if ( ! empty( $non_cached_ids ) ) { - $fresh_terms = $wpdb->get_results( sprintf( "SELECT t.*, tt.* FROM $wpdb->terms AS t INNER JOIN $wpdb->term_taxonomy AS tt ON t.term_id = tt.term_id WHERE t.term_id IN (%s)", join( ",", array_map( 'intval', $non_cached_ids ) ) ) ); + $fresh_terms = $wpdb->get_results( sprintf( "SELECT t.*, tt.* FROM $wpdb->terms AS t INNER JOIN $wpdb->term_taxonomy AS tt ON t.term_id = tt.term_id WHERE t.term_id IN (%s)", join( ',', array_map( 'intval', $non_cached_ids ) ) ) ); update_term_cache( $fresh_terms, $update_meta_cache ); @@ -3469,8 +3670,9 @@ $object_types = (array) $taxonomy->object_type; - foreach ( $object_types as &$object_type ) + foreach ( $object_types as &$object_type ) { list( $object_type ) = explode( ':', $object_type ); + } $object_types = array_unique( $object_types ); @@ -3479,18 +3681,21 @@ $check_attachments = true; } - if ( $object_types ) + if ( $object_types ) { $object_types = esc_sql( array_filter( $object_types, 'post_type_exists' ) ); + } foreach ( (array) $terms as $term ) { $count = 0; // Attachments can be 'inherit' status, we need to base count off the parent's status if so. - if ( $check_attachments ) + if ( $check_attachments ) { $count += (int) $wpdb->get_var( $wpdb->prepare( "SELECT COUNT(*) FROM $wpdb->term_relationships, $wpdb->posts p1 WHERE p1.ID = $wpdb->term_relationships.object_id AND ( post_status = 'publish' OR ( post_status = 'inherit' AND post_parent > 0 AND ( SELECT post_status FROM $wpdb->posts WHERE ID = p1.post_parent ) = 'publish' ) ) AND post_type = 'attachment' AND term_taxonomy_id = %d", $term ) ); - - if ( $object_types ) - $count += (int) $wpdb->get_var( $wpdb->prepare( "SELECT COUNT(*) FROM $wpdb->term_relationships, $wpdb->posts WHERE $wpdb->posts.ID = $wpdb->term_relationships.object_id AND post_status = 'publish' AND post_type IN ('" . implode("', '", $object_types ) . "') AND term_taxonomy_id = %d", $term ) ); + } + + if ( $object_types ) { + $count += (int) $wpdb->get_var( $wpdb->prepare( "SELECT COUNT(*) FROM $wpdb->term_relationships, $wpdb->posts WHERE $wpdb->posts.ID = $wpdb->term_relationships.object_id AND post_status = 'publish' AND post_type IN ('" . implode( "', '", $object_types ) . "') AND term_taxonomy_id = %d", $term ) ); + } /** This action is documented in wp-includes/taxonomy.php */ do_action( 'edit_term_taxonomy', $term, $taxonomy->name ); @@ -3556,11 +3761,11 @@ if ( is_object( $term_id ) ) { $shared_term = $term_id; - $term_id = intval( $shared_term->term_id ); + $term_id = intval( $shared_term->term_id ); } if ( is_object( $term_taxonomy_id ) ) { - $term_taxonomy = $term_taxonomy_id; + $term_taxonomy = $term_taxonomy_id; $term_taxonomy_id = intval( $term_taxonomy->term_taxonomy_id ); } @@ -3586,8 +3791,8 @@ } $new_term_data = array( - 'name' => $shared_term->name, - 'slug' => $shared_term->slug, + 'name' => $shared_term->name, + 'slug' => $shared_term->slug, 'term_group' => $shared_term->term_group, ); @@ -3598,7 +3803,8 @@ $new_term_id = (int) $wpdb->insert_id; // Update the existing term_taxonomy to point to the newly created term. - $wpdb->update( $wpdb->term_taxonomy, + $wpdb->update( + $wpdb->term_taxonomy, array( 'term_id' => $new_term_id ), array( 'term_taxonomy_id' => $term_taxonomy_id ) ); @@ -3611,7 +3817,8 @@ $children_tt_ids = $wpdb->get_col( $wpdb->prepare( "SELECT term_taxonomy_id FROM $wpdb->term_taxonomy WHERE parent = %d AND taxonomy = %s", $term_id, $term_taxonomy->taxonomy ) ); if ( ! empty( $children_tt_ids ) ) { foreach ( $children_tt_ids as $child_tt_id ) { - $wpdb->update( $wpdb->term_taxonomy, + $wpdb->update( + $wpdb->term_taxonomy, array( 'parent' => $new_term_id ), array( 'term_taxonomy_id' => $child_tt_id ) ); @@ -3632,7 +3839,7 @@ // Clean the cache for term taxonomies formerly shared with the current term. $shared_term_taxonomies = $wpdb->get_col( $wpdb->prepare( "SELECT taxonomy FROM $wpdb->term_taxonomy WHERE term_id = %d", $term_id ) ); - $taxonomies_to_clean = array_merge( $taxonomies_to_clean, $shared_term_taxonomies ); + $taxonomies_to_clean = array_merge( $taxonomies_to_clean, $shared_term_taxonomies ); foreach ( $taxonomies_to_clean as $taxonomy_to_clean ) { clean_taxonomy_cache( $taxonomy_to_clean ); @@ -3726,17 +3933,17 @@ // Rekey shared term array for faster lookups. $_shared_terms = array(); foreach ( $shared_terms as $shared_term ) { - $term_id = intval( $shared_term->term_id ); + $term_id = intval( $shared_term->term_id ); $_shared_terms[ $term_id ] = $shared_term; } $shared_terms = $_shared_terms; // Get term taxonomy data for all shared terms. $shared_term_ids = implode( ',', array_keys( $shared_terms ) ); - $shared_tts = $wpdb->get_results( "SELECT * FROM {$wpdb->term_taxonomy} WHERE `term_id` IN ({$shared_term_ids})" ); + $shared_tts = $wpdb->get_results( "SELECT * FROM {$wpdb->term_taxonomy} WHERE `term_id` IN ({$shared_term_ids})" ); // Split term data recording is slow, so we do it just once, outside the loop. - $split_term_data = get_option( '_split_terms', array() ); + $split_term_data = get_option( '_split_terms', array() ); $skipped_first_term = $taxonomies = array(); foreach ( $shared_tts as $shared_tt ) { $term_id = intval( $shared_tt->term_id ); @@ -3822,17 +4029,19 @@ */ function _wp_check_split_terms_in_menus( $term_id, $new_term_id, $term_taxonomy_id, $taxonomy ) { global $wpdb; - $post_ids = $wpdb->get_col( $wpdb->prepare( - "SELECT m1.post_id + $post_ids = $wpdb->get_col( + $wpdb->prepare( + "SELECT m1.post_id FROM {$wpdb->postmeta} AS m1 INNER JOIN {$wpdb->postmeta} AS m2 ON ( m2.post_id = m1.post_id ) INNER JOIN {$wpdb->postmeta} AS m3 ON ( m3.post_id = m1.post_id ) WHERE ( m1.meta_key = '_menu_item_type' AND m1.meta_value = 'taxonomy' ) AND ( m2.meta_key = '_menu_item_object' AND m2.meta_value = %s ) AND ( m3.meta_key = '_menu_item_object_id' AND m3.meta_value = %d )", - $taxonomy, - $term_id - ) ); + $taxonomy, + $term_id + ) + ); if ( $post_ids ) { foreach ( $post_ids as $post_id ) { @@ -3918,7 +4127,7 @@ * * @param int $term_id Term ID. * @return bool Returns false if a term is not shared between multiple taxonomies or - * if splittng shared taxonomy terms is finished. + * if splitting shared taxonomy terms is finished. */ function wp_term_is_shared( $term_id ) { global $wpdb; @@ -3946,7 +4155,7 @@ function get_term_link( $term, $taxonomy = '' ) { global $wp_rewrite; - if ( !is_object($term) ) { + if ( ! is_object( $term ) ) { if ( is_int( $term ) ) { $term = get_term( $term, $taxonomy ); } else { @@ -3954,15 +4163,17 @@ } } - if ( !is_object($term) ) + if ( ! is_object( $term ) ) { $term = new WP_Error( 'invalid_term', __( 'Empty Term.' ) ); - - if ( is_wp_error( $term ) ) + } + + if ( is_wp_error( $term ) ) { return $term; + } $taxonomy = $term->taxonomy; - $termlink = $wp_rewrite->get_extra_permastruct($taxonomy); + $termlink = $wp_rewrite->get_extra_permastruct( $taxonomy ); /** * Filters the permalink structure for a terms before token replacement occurs. @@ -3975,31 +4186,32 @@ $termlink = apply_filters( 'pre_term_link', $termlink, $term ); $slug = $term->slug; - $t = get_taxonomy($taxonomy); - - if ( empty($termlink) ) { - if ( 'category' == $taxonomy ) + $t = get_taxonomy( $taxonomy ); + + if ( empty( $termlink ) ) { + if ( 'category' == $taxonomy ) { $termlink = '?cat=' . $term->term_id; - elseif ( $t->query_var ) + } elseif ( $t->query_var ) { $termlink = "?$t->query_var=$slug"; - else + } else { $termlink = "?taxonomy=$taxonomy&term=$slug"; - $termlink = home_url($termlink); + } + $termlink = home_url( $termlink ); } else { if ( $t->rewrite['hierarchical'] ) { $hierarchical_slugs = array(); - $ancestors = get_ancestors( $term->term_id, $taxonomy, 'taxonomy' ); - foreach ( (array)$ancestors as $ancestor ) { - $ancestor_term = get_term($ancestor, $taxonomy); + $ancestors = get_ancestors( $term->term_id, $taxonomy, 'taxonomy' ); + foreach ( (array) $ancestors as $ancestor ) { + $ancestor_term = get_term( $ancestor, $taxonomy ); $hierarchical_slugs[] = $ancestor_term->slug; } - $hierarchical_slugs = array_reverse($hierarchical_slugs); + $hierarchical_slugs = array_reverse( $hierarchical_slugs ); $hierarchical_slugs[] = $slug; - $termlink = str_replace("%$taxonomy%", implode('/', $hierarchical_slugs), $termlink); + $termlink = str_replace( "%$taxonomy%", implode( '/', $hierarchical_slugs ), $termlink ); } else { - $termlink = str_replace("%$taxonomy%", $slug, $termlink); + $termlink = str_replace( "%$taxonomy%", $slug, $termlink ); } - $termlink = home_url( user_trailingslashit($termlink, 'category') ); + $termlink = home_url( user_trailingslashit( $termlink, 'category' ) ); } // Back Compat filters. if ( 'post_tag' == $taxonomy ) { @@ -4061,10 +4273,10 @@ */ function the_taxonomies( $args = array() ) { $defaults = array( - 'post' => 0, + 'post' => 0, 'before' => '', - 'sep' => ' ', - 'after' => '', + 'sep' => ' ', + 'after' => '', ); $r = wp_parse_args( $args, $defaults ); @@ -4094,11 +4306,14 @@ function get_the_taxonomies( $post = 0, $args = array() ) { $post = get_post( $post ); - $args = wp_parse_args( $args, array( - /* translators: %s: taxonomy label, %l: list of terms formatted as per $term_template */ - 'template' => __( '%s: %l.' ), - 'term_template' => '%2$s', - ) ); + $args = wp_parse_args( + $args, + array( + /* translators: %s: taxonomy label, %l: list of terms formatted as per $term_template */ + 'template' => __( '%s: %l.' ), + 'term_template' => '%2$s', + ) + ); $taxonomies = array(); @@ -4131,7 +4346,7 @@ $links[] = wp_sprintf( $t['term_template'], esc_attr( get_term_link( $term ) ), $term->name ); } if ( $links ) { - $taxonomies[$taxonomy] = wp_sprintf( $t['template'], $t['label'], $links, $terms ); + $taxonomies[ $taxonomy ] = wp_sprintf( $t['template'], $t['label'], $links, $terms ); } } return $taxonomies; @@ -4148,7 +4363,7 @@ function get_post_taxonomies( $post = 0 ) { $post = get_post( $post ); - return get_object_taxonomies($post); + return get_object_taxonomies( $post ); } /** @@ -4166,8 +4381,9 @@ * @return bool|WP_Error WP_Error on input error. */ function is_object_in_term( $object_id, $taxonomy, $terms = null ) { - if ( !$object_id = (int) $object_id ) + if ( ! $object_id = (int) $object_id ) { return new WP_Error( 'invalid_object', __( 'Invalid object ID.' ) ); + } $object_terms = get_object_term_cache( $object_id, $taxonomy ); if ( false === $object_terms ) { @@ -4179,19 +4395,23 @@ wp_cache_set( $object_id, wp_list_pluck( $object_terms, 'term_id' ), "{$taxonomy}_relationships" ); } - if ( is_wp_error( $object_terms ) ) + if ( is_wp_error( $object_terms ) ) { return $object_terms; - if ( empty( $object_terms ) ) + } + if ( empty( $object_terms ) ) { return false; - if ( empty( $terms ) ) - return ( !empty( $object_terms ) ); + } + if ( empty( $terms ) ) { + return ( ! empty( $object_terms ) ); + } $terms = (array) $terms; - if ( $ints = array_filter( $terms, 'is_int' ) ) + if ( $ints = array_filter( $terms, 'is_int' ) ) { $strs = array_diff( $terms, $ints ); - else + } else { $strs =& $terms; + } foreach ( $object_terms as $object_term ) { // If term is an int, check against term_ids only. @@ -4206,8 +4426,12 @@ return true; } - if ( in_array( $object_term->name, $strs ) ) return true; - if ( in_array( $object_term->slug, $strs ) ) return true; + if ( in_array( $object_term->name, $strs ) ) { + return true; + } + if ( in_array( $object_term->slug, $strs ) ) { + return true; + } } } @@ -4264,13 +4488,13 @@ } if ( 'taxonomy' === $resource_type ) { - $term = get_term($object_id, $object_type); - while ( ! is_wp_error($term) && ! empty( $term->parent ) && ! in_array( $term->parent, $ancestors ) ) { + $term = get_term( $object_id, $object_type ); + while ( ! is_wp_error( $term ) && ! empty( $term->parent ) && ! in_array( $term->parent, $ancestors ) ) { $ancestors[] = (int) $term->parent; - $term = get_term($term->parent, $object_type); + $term = get_term( $term->parent, $object_type ); } } elseif ( 'post_type' === $resource_type ) { - $ancestors = get_post_ancestors($object_id); + $ancestors = get_post_ancestors( $object_id ); } /** @@ -4320,24 +4544,73 @@ */ function wp_check_term_hierarchy_for_loops( $parent, $term_id, $taxonomy ) { // Nothing fancy here - bail - if ( !$parent ) + if ( ! $parent ) { return 0; + } // Can't be its own parent. - if ( $parent == $term_id ) + if ( $parent == $term_id ) { return 0; + } // Now look for larger loops. - if ( !$loop = wp_find_hierarchy_loop( 'wp_get_term_taxonomy_parent_id', $term_id, $parent, array( $taxonomy ) ) ) + if ( ! $loop = wp_find_hierarchy_loop( 'wp_get_term_taxonomy_parent_id', $term_id, $parent, array( $taxonomy ) ) ) { return $parent; // No loop + } // Setting $parent to the given value causes a loop. - if ( isset( $loop[$term_id] ) ) + if ( isset( $loop[ $term_id ] ) ) { return 0; + } // There's a loop, but it doesn't contain $term_id. Break the loop. - foreach ( array_keys( $loop ) as $loop_member ) + foreach ( array_keys( $loop ) as $loop_member ) { wp_update_term( $loop_member, $taxonomy, array( 'parent' => 0 ) ); + } return $parent; } + +/** + * Determines whether a taxonomy is considered "viewable". + * + * @since 5.1.0 + * + * @param string|WP_Taxonomy $taxonomy Taxonomy name or object. + * @return bool Whether the taxonomy should be considered viewable. + */ +function is_taxonomy_viewable( $taxonomy ) { + if ( is_scalar( $taxonomy ) ) { + $taxonomy = get_taxonomy( $taxonomy ); + if ( ! $taxonomy ) { + return false; + } + } + + return $taxonomy->publicly_queryable; +} + +/** + * Sets the last changed time for the 'terms' cache group. + * + * @since 5.0.0 + */ +function wp_cache_set_terms_last_changed() { + wp_cache_set( 'last_changed', microtime(), 'terms' ); +} + +/** + * Aborts calls to term meta if it is not supported. + * + * @since 5.0.0 + * + * @param mixed $check Skip-value for whether to proceed term meta function execution. + * @return mixed Original value of $check, or false if term meta is not supported. + */ +function wp_check_term_meta_support_prefilter( $check ) { + if ( get_option( 'db_version' ) < 34370 ) { + return false; + } + + return $check; +}