diff -r 3d4e9c994f10 -r a86126ab1dd4 wp/wp-includes/class-wp-taxonomy.php --- a/wp/wp-includes/class-wp-taxonomy.php Tue Oct 22 16:11:46 2019 +0200 +++ b/wp/wp-includes/class-wp-taxonomy.php Tue Dec 15 13:49:49 2020 +0100 @@ -30,12 +30,17 @@ public $label; /** - * An array of labels for this taxonomy. + * Labels object for this taxonomy. + * + * If not set, tag labels are inherited for non-hierarchical types + * and category labels for hierarchical ones. + * + * @see get_taxonomy_labels() * * @since 4.7.0 * @var object */ - public $labels = array(); + public $labels; /** * A short descriptive summary of what the taxonomy is for. @@ -205,6 +210,25 @@ public $rest_controller_class; /** + * The default term name for this taxonomy. If you pass an array you have + * to set 'name' and optionally 'slug' and 'description'. + * + * @since 5.5.0 + * @var array|string + */ + public $default_term; + + /** + * The controller instance for this taxonomy's REST API endpoints. + * + * Lazily computed. Should be accessed using {@see WP_Taxonomy::get_rest_controller()}. + * + * @since 5.5.0 + * @var WP_REST_Controller $rest_controller + */ + public $rest_controller; + + /** * Whether it is a built-in taxonomy. * * @since 4.7.0 @@ -217,7 +241,7 @@ * * @since 4.7.0 * - * @global WP $wp WP instance. + * @global WP $wp Current WordPress environment instance. * * @param string $taxonomy Taxonomy key, must not exceed 32 characters. * @param array|string $object_type Name of the object type for the taxonomy object. @@ -273,12 +297,13 @@ 'show_in_rest' => false, 'rest_base' => false, 'rest_controller_class' => false, + 'default_term' => null, '_builtin' => false, ); $args = array_merge( $defaults, $args ); - // If not set, default to the setting for public. + // If not set, default to the setting for 'public'. if ( null === $args['publicly_queryable'] ) { $args['publicly_queryable'] = $args['public']; } @@ -290,11 +315,11 @@ $args['query_var'] = sanitize_title_with_dashes( $args['query_var'] ); } } else { - // Force query_var to false for non-public taxonomies. + // Force 'query_var' to false for non-public taxonomies. $args['query_var'] = false; } - if ( false !== $args['rewrite'] && ( is_admin() || '' != get_option( 'permalink_structure' ) ) ) { + if ( false !== $args['rewrite'] && ( is_admin() || get_option( 'permalink_structure' ) ) ) { $args['rewrite'] = wp_parse_args( $args['rewrite'], array( @@ -309,27 +334,27 @@ } } - // If not set, default to the setting for public. + // If not set, default to the setting for 'public'. if ( null === $args['show_ui'] ) { $args['show_ui'] = $args['public']; } - // If not set, default to the setting for show_ui. + // If not set, default to the setting for 'show_ui'. if ( null === $args['show_in_menu'] || ! $args['show_ui'] ) { $args['show_in_menu'] = $args['show_ui']; } - // If not set, default to the setting for public. + // If not set, default to the setting for 'public'. if ( null === $args['show_in_nav_menus'] ) { $args['show_in_nav_menus'] = $args['public']; } - // If not set, default to the setting for show_ui. + // If not set, default to the setting for 'show_ui'. if ( null === $args['show_tagcloud'] ) { $args['show_tagcloud'] = $args['show_ui']; } - // If not set, default to the setting for show_ui. + // If not set, default to the setting for 'show_ui'. if ( null === $args['show_in_quick_edit'] ) { $args['show_in_quick_edit'] = $args['show_ui']; } @@ -346,7 +371,7 @@ $args['object_type'] = array_unique( (array) $object_type ); - // If not set, use the default meta box + // If not set, use the default meta box. if ( null === $args['meta_box_cb'] ) { if ( $args['hierarchical'] ) { $args['meta_box_cb'] = 'post_categories_meta_box'; @@ -371,6 +396,21 @@ } } + // Default taxonomy term. + if ( ! empty( $args['default_term'] ) ) { + if ( ! is_array( $args['default_term'] ) ) { + $args['default_term'] = array( 'name' => $args['default_term'] ); + } + $args['default_term'] = wp_parse_args( + $args['default_term'], + array( + 'name' => '', + 'slug' => '', + 'description' => '', + ) + ); + } + foreach ( $args as $property_name => $property_value ) { $this->$property_name = $property_value; } @@ -395,7 +435,7 @@ $wp->add_query_var( $this->query_var ); } - if ( false !== $this->rewrite && ( is_admin() || '' != get_option( 'permalink_structure' ) ) ) { + if ( false !== $this->rewrite && ( is_admin() || get_option( 'permalink_structure' ) ) ) { if ( $this->hierarchical && $this->rewrite['hierarchical'] ) { $tag = '(.+?)'; } else { @@ -447,4 +487,40 @@ public function remove_hooks() { remove_filter( 'wp_ajax_add-' . $this->name, '_wp_ajax_add_hierarchical_term' ); } + + /** + * Gets the REST API controller for this taxonomy. + * + * Will only instantiate the controller class once per request. + * + * @since 5.5.0 + * + * @return WP_REST_Controller|null The controller instance, or null if the taxonomy + * is set not to show in rest. + */ + public function get_rest_controller() { + if ( ! $this->show_in_rest ) { + return null; + } + + $class = $this->rest_controller_class ? $this->rest_controller_class : WP_REST_Terms_Controller::class; + + if ( ! class_exists( $class ) ) { + return null; + } + + if ( ! is_subclass_of( $class, WP_REST_Controller::class ) ) { + return null; + } + + if ( ! $this->rest_controller ) { + $this->rest_controller = new $class( $this->name ); + } + + if ( ! ( $this->rest_controller instanceof $class ) ) { + return null; + } + + return $this->rest_controller; + } }