| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450 | <?php/** * Taxonomy API: WP_Taxonomy class * * @package WordPress * @subpackage Taxonomy * @since 4.7.0 *//** * Core class used for interacting with taxonomies. * * @since 4.7.0 */final class WP_Taxonomy {	/**	 * Taxonomy key.	 *	 * @since 4.7.0	 * @var string	 */	public $name;	/**	 * Name of the taxonomy shown in the menu. Usually plural.	 *	 * @since 4.7.0	 * @var string	 */	public $label;	/**	 * An array of labels for this taxonomy.	 *	 * @since 4.7.0	 * @var object	 */	public $labels = array();	/**	 * A short descriptive summary of what the taxonomy is for.	 *	 * @since 4.7.0	 * @var string	 */	public $description = '';	/**	 * Whether a taxonomy is intended for use publicly either via the admin interface or by front-end users.	 *	 * @since 4.7.0	 * @var bool	 */	public $public = true;	/**	 * Whether the taxonomy is publicly queryable.	 *	 * @since 4.7.0	 * @var bool	 */	public $publicly_queryable = true;	/**	 * Whether the taxonomy is hierarchical.	 *	 * @since 4.7.0	 * @var bool	 */	public $hierarchical = false;	/**	 * Whether to generate and allow a UI for managing terms in this taxonomy in the admin.	 *	 * @since 4.7.0	 * @var bool	 */	public $show_ui = true;	/**	 * Whether to show the taxonomy in the admin menu.	 *	 * If true, the taxonomy is shown as a submenu of the object type menu. If false, no menu is shown.	 *	 * @since 4.7.0	 * @var bool	 */	public $show_in_menu = true;	/**	 * Whether the taxonomy is available for selection in navigation menus.	 *	 * @since 4.7.0	 * @var bool	 */	public $show_in_nav_menus = true;	/**	 * Whether to list the taxonomy in the tag cloud widget controls.	 *	 * @since 4.7.0	 * @var bool	 */	public $show_tagcloud = true;	/**	 * Whether to show the taxonomy in the quick/bulk edit panel.	 *	 * @since 4.7.0	 * @var bool	 */	public $show_in_quick_edit = true;	/**	 * Whether to display a column for the taxonomy on its post type listing screens.	 *	 * @since 4.7.0	 * @var bool	 */	public $show_admin_column = false;	/**	 * The callback function for the meta box display.	 *	 * @since 4.7.0	 * @var bool|callable	 */	public $meta_box_cb = null;	/**	 * The callback function for sanitizing taxonomy data saved from a meta box.	 *	 * @since 5.1.0	 * @var callable	 */	public $meta_box_sanitize_cb = null;	/**	 * An array of object types this taxonomy is registered for.	 *	 * @since 4.7.0	 * @var array	 */	public $object_type = null;	/**	 * Capabilities for this taxonomy.	 *	 * @since 4.7.0	 * @var object	 */	public $cap;	/**	 * Rewrites information for this taxonomy.	 *	 * @since 4.7.0	 * @var array|false	 */	public $rewrite;	/**	 * Query var string for this taxonomy.	 *	 * @since 4.7.0	 * @var string|false	 */	public $query_var;	/**	 * Function that will be called when the count is updated.	 *	 * @since 4.7.0	 * @var callable	 */	public $update_count_callback;	/**	 * Whether this taxonomy should appear in the REST API.	 *	 * Default false. If true, standard endpoints will be registered with	 * respect to $rest_base and $rest_controller_class.	 *	 * @since 4.7.4	 * @var bool $show_in_rest	 */	public $show_in_rest;	/**	 * The base path for this taxonomy's REST API endpoints.	 *	 * @since 4.7.4	 * @var string|bool $rest_base	 */	public $rest_base;	/**	 * The controller for this taxonomy's REST API endpoints.	 *	 * Custom controllers must extend WP_REST_Controller.	 *	 * @since 4.7.4	 * @var string|bool $rest_controller_class	 */	public $rest_controller_class;	/**	 * Whether it is a built-in taxonomy.	 *	 * @since 4.7.0	 * @var bool	 */	public $_builtin;	/**	 * Constructor.	 *	 * @since 4.7.0	 *	 * @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.	 * @param array|string $args        Optional. Array or query string of arguments for registering a taxonomy.	 *                                  Default empty array.	 */	public function __construct( $taxonomy, $object_type, $args = array() ) {		$this->name = $taxonomy;		$this->set_props( $object_type, $args );	}	/**	 * Sets taxonomy properties.	 *	 * @since 4.7.0	 *	 * @param array|string $object_type Name of the object type for the taxonomy object.	 * @param array|string $args        Array or query string of arguments for registering a taxonomy.	 */	public function set_props( $object_type, $args ) {		$args = wp_parse_args( $args );		/**		 * Filters the arguments for registering a taxonomy.		 *		 * @since 4.4.0		 *		 * @param array    $args        Array of arguments for registering a taxonomy.		 * @param string   $taxonomy    Taxonomy key.		 * @param string[] $object_type Array of names of object types for the taxonomy.		 */		$args = apply_filters( 'register_taxonomy_args', $args, $this->name, (array) $object_type );		$defaults = array(			'labels'                => array(),			'description'           => '',			'public'                => true,			'publicly_queryable'    => null,			'hierarchical'          => false,			'show_ui'               => null,			'show_in_menu'          => null,			'show_in_nav_menus'     => null,			'show_tagcloud'         => null,			'show_in_quick_edit'    => null,			'show_admin_column'     => false,			'meta_box_cb'           => null,			'meta_box_sanitize_cb'  => null,			'capabilities'          => array(),			'rewrite'               => true,			'query_var'             => $this->name,			'update_count_callback' => '',			'show_in_rest'          => false,			'rest_base'             => false,			'rest_controller_class' => false,			'_builtin'              => false,		);		$args = array_merge( $defaults, $args );		// If not set, default to the setting for public.		if ( null === $args['publicly_queryable'] ) {			$args['publicly_queryable'] = $args['public'];		}		if ( false !== $args['query_var'] && ( is_admin() || false !== $args['publicly_queryable'] ) ) {			if ( true === $args['query_var'] ) {				$args['query_var'] = $this->name;			} else {				$args['query_var'] = sanitize_title_with_dashes( $args['query_var'] );			}		} else {			// Force query_var to false for non-public taxonomies.			$args['query_var'] = false;		}		if ( false !== $args['rewrite'] && ( is_admin() || '' != get_option( 'permalink_structure' ) ) ) {			$args['rewrite'] = wp_parse_args(				$args['rewrite'],				array(					'with_front'   => true,					'hierarchical' => false,					'ep_mask'      => EP_NONE,				)			);			if ( empty( $args['rewrite']['slug'] ) ) {				$args['rewrite']['slug'] = sanitize_title_with_dashes( $this->name );			}		}		// 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 ( 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 ( null === $args['show_in_nav_menus'] ) {			$args['show_in_nav_menus'] = $args['public'];		}		// 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 ( null === $args['show_in_quick_edit'] ) {			$args['show_in_quick_edit'] = $args['show_ui'];		}		$default_caps = array(			'manage_terms' => 'manage_categories',			'edit_terms'   => 'manage_categories',			'delete_terms' => 'manage_categories',			'assign_terms' => 'edit_posts',		);		$args['cap'] = (object) array_merge( $default_caps, $args['capabilities'] );		unset( $args['capabilities'] );		$args['object_type'] = array_unique( (array) $object_type );		// 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';			} else {				$args['meta_box_cb'] = 'post_tags_meta_box';			}		}		$args['name'] = $this->name;		// Default meta box sanitization callback depends on the value of 'meta_box_cb'.		if ( null === $args['meta_box_sanitize_cb'] ) {			switch ( $args['meta_box_cb'] ) {				case 'post_categories_meta_box':					$args['meta_box_sanitize_cb'] = 'taxonomy_meta_box_sanitize_cb_checkboxes';					break;				case 'post_tags_meta_box':				default:					$args['meta_box_sanitize_cb'] = 'taxonomy_meta_box_sanitize_cb_input';					break;			}		}		foreach ( $args as $property_name => $property_value ) {			$this->$property_name = $property_value;		}		$this->labels = get_taxonomy_labels( $this );		$this->label  = $this->labels->name;	}	/**	 * Adds the necessary rewrite rules for the taxonomy.	 *	 * @since 4.7.0	 *	 * @global WP $wp Current WordPress environment instance.	 */	public function add_rewrite_rules() {		/* @var WP $wp */		global $wp;		// Non-publicly queryable taxonomies should not register query vars, except in the admin.		if ( false !== $this->query_var && $wp ) {			$wp->add_query_var( $this->query_var );		}		if ( false !== $this->rewrite && ( is_admin() || '' != get_option( 'permalink_structure' ) ) ) {			if ( $this->hierarchical && $this->rewrite['hierarchical'] ) {				$tag = '(.+?)';			} else {				$tag = '([^/]+)';			}			add_rewrite_tag( "%$this->name%", $tag, $this->query_var ? "{$this->query_var}=" : "taxonomy=$this->name&term=" );			add_permastruct( $this->name, "{$this->rewrite['slug']}/%$this->name%", $this->rewrite );		}	}	/**	 * Removes any rewrite rules, permastructs, and rules for the taxonomy.	 *	 * @since 4.7.0	 *	 * @global WP $wp Current WordPress environment instance.	 */	public function remove_rewrite_rules() {		/* @var WP $wp */		global $wp;		// Remove query var.		if ( false !== $this->query_var ) {			$wp->remove_query_var( $this->query_var );		}		// Remove rewrite tags and permastructs.		if ( false !== $this->rewrite ) {			remove_rewrite_tag( "%$this->name%" );			remove_permastruct( $this->name );		}	}	/**	 * Registers the ajax callback for the meta box.	 *	 * @since 4.7.0	 */	public function add_hooks() {		add_filter( 'wp_ajax_add-' . $this->name, '_wp_ajax_add_hierarchical_term' );	}	/**	 * Removes the ajax callback for the meta box.	 *	 * @since 4.7.0	 */	public function remove_hooks() {		remove_filter( 'wp_ajax_add-' . $this->name, '_wp_ajax_add_hierarchical_term' );	}}
 |