--- 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;
+ }
}