diff -r 490d5cc509ed -r cf61fcea0001 wp/wp-includes/class-wp-post-type.php --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/wp/wp-includes/class-wp-post-type.php Mon Oct 14 17:39:30 2019 +0200 @@ -0,0 +1,679 @@ +name = $post_type; + + $this->set_props( $args ); + } + + /** + * Sets post type properties. + * + * @since 4.6.0 + * + * @param array|string $args Array or string of arguments for registering a post type. + */ + public function set_props( $args ) { + $args = wp_parse_args( $args ); + + /** + * Filters the arguments for registering a post type. + * + * @since 4.4.0 + * + * @param array $args Array of arguments for registering a post type. + * @param string $post_type Post type key. + */ + $args = apply_filters( 'register_post_type_args', $args, $this->name ); + + $has_edit_link = ! empty( $args['_edit_link'] ); + + // Args prefixed with an underscore are reserved for internal use. + $defaults = array( + 'labels' => array(), + 'description' => '', + 'public' => false, + 'hierarchical' => false, + 'exclude_from_search' => null, + 'publicly_queryable' => null, + 'show_ui' => null, + 'show_in_menu' => null, + 'show_in_nav_menus' => null, + 'show_in_admin_bar' => null, + 'menu_position' => null, + 'menu_icon' => null, + 'capability_type' => 'post', + 'capabilities' => array(), + 'map_meta_cap' => null, + 'supports' => array(), + 'register_meta_box_cb' => null, + 'taxonomies' => array(), + 'has_archive' => false, + 'rewrite' => true, + 'query_var' => true, + 'can_export' => true, + 'delete_with_user' => null, + 'show_in_rest' => false, + 'rest_base' => false, + 'rest_controller_class' => false, + '_builtin' => false, + '_edit_link' => 'post.php?post=%d', + ); + + $args = array_merge( $defaults, $args ); + + $args['name'] = $this->name; + + // If not set, default to the setting for public. + if ( null === $args['publicly_queryable'] ) { + $args['publicly_queryable'] = $args['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 ( null === $args['show_in_menu'] || ! $args['show_ui'] ) { + $args['show_in_menu'] = $args['show_ui']; + } + + // If not set, default to the whether the full UI is shown. + if ( null === $args['show_in_admin_bar'] ) { + $args['show_in_admin_bar'] = (bool) $args['show_in_menu']; + } + + // 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 true if not public, false if public. + if ( null === $args['exclude_from_search'] ) { + $args['exclude_from_search'] = ! $args['public']; + } + + // Back compat with quirky handling in version 3.0. #14122. + if ( empty( $args['capabilities'] ) && null === $args['map_meta_cap'] && in_array( $args['capability_type'], array( 'post', 'page' ) ) ) { + $args['map_meta_cap'] = true; + } + + // If not set, default to false. + if ( null === $args['map_meta_cap'] ) { + $args['map_meta_cap'] = false; + } + + // If there's no specified edit link and no UI, remove the edit link. + if ( ! $args['show_ui'] && ! $has_edit_link ) { + $args['_edit_link'] = ''; + } + + $this->cap = get_post_type_capabilities( (object) $args ); + unset( $args['capabilities'] ); + + if ( is_array( $args['capability_type'] ) ) { + $args['capability_type'] = $args['capability_type'][0]; + } + + if ( false !== $args['query_var'] ) { + if ( true === $args['query_var'] ) { + $args['query_var'] = $this->name; + } else { + $args['query_var'] = sanitize_title_with_dashes( $args['query_var'] ); + } + } + + if ( false !== $args['rewrite'] && ( is_admin() || '' != get_option( 'permalink_structure' ) ) ) { + if ( ! is_array( $args['rewrite'] ) ) { + $args['rewrite'] = array(); + } + if ( empty( $args['rewrite']['slug'] ) ) { + $args['rewrite']['slug'] = $this->name; + } + if ( ! isset( $args['rewrite']['with_front'] ) ) { + $args['rewrite']['with_front'] = true; + } + if ( ! isset( $args['rewrite']['pages'] ) ) { + $args['rewrite']['pages'] = true; + } + if ( ! isset( $args['rewrite']['feeds'] ) || ! $args['has_archive'] ) { + $args['rewrite']['feeds'] = (bool) $args['has_archive']; + } + if ( ! isset( $args['rewrite']['ep_mask'] ) ) { + if ( isset( $args['permalink_epmask'] ) ) { + $args['rewrite']['ep_mask'] = $args['permalink_epmask']; + } else { + $args['rewrite']['ep_mask'] = EP_PERMALINK; + } + } + } + + foreach ( $args as $property_name => $property_value ) { + $this->$property_name = $property_value; + } + + $this->labels = get_post_type_labels( $this ); + $this->label = $this->labels->name; + } + + /** + * Sets the features support for the post type. + * + * @since 4.6.0 + */ + public function add_supports() { + if ( ! empty( $this->supports ) ) { + add_post_type_support( $this->name, $this->supports ); + unset( $this->supports ); + } elseif ( false !== $this->supports ) { + // Add default features. + add_post_type_support( $this->name, array( 'title', 'editor' ) ); + } + } + + /** + * Adds the necessary rewrite rules for the post type. + * + * @since 4.6.0 + * + * @global WP_Rewrite $wp_rewrite WordPress Rewrite Component. + * @global WP $wp Current WordPress environment instance. + */ + public function add_rewrite_rules() { + global $wp_rewrite, $wp; + + if ( false !== $this->query_var && $wp && is_post_type_viewable( $this ) ) { + $wp->add_query_var( $this->query_var ); + } + + if ( false !== $this->rewrite && ( is_admin() || '' != get_option( 'permalink_structure' ) ) ) { + if ( $this->hierarchical ) { + add_rewrite_tag( "%$this->name%", '(.+?)', $this->query_var ? "{$this->query_var}=" : "post_type=$this->name&pagename=" ); + } else { + add_rewrite_tag( "%$this->name%", '([^/]+)', $this->query_var ? "{$this->query_var}=" : "post_type=$this->name&name=" ); + } + + if ( $this->has_archive ) { + $archive_slug = true === $this->has_archive ? $this->rewrite['slug'] : $this->has_archive; + if ( $this->rewrite['with_front'] ) { + $archive_slug = substr( $wp_rewrite->front, 1 ) . $archive_slug; + } else { + $archive_slug = $wp_rewrite->root . $archive_slug; + } + + add_rewrite_rule( "{$archive_slug}/?$", "index.php?post_type=$this->name", 'top' ); + if ( $this->rewrite['feeds'] && $wp_rewrite->feeds ) { + $feeds = '(' . trim( implode( '|', $wp_rewrite->feeds ) ) . ')'; + add_rewrite_rule( "{$archive_slug}/feed/$feeds/?$", "index.php?post_type=$this->name" . '&feed=$matches[1]', 'top' ); + add_rewrite_rule( "{$archive_slug}/$feeds/?$", "index.php?post_type=$this->name" . '&feed=$matches[1]', 'top' ); + } + if ( $this->rewrite['pages'] ) { + add_rewrite_rule( "{$archive_slug}/{$wp_rewrite->pagination_base}/([0-9]{1,})/?$", "index.php?post_type=$this->name" . '&paged=$matches[1]', 'top' ); + } + } + + $permastruct_args = $this->rewrite; + $permastruct_args['feed'] = $permastruct_args['feeds']; + add_permastruct( $this->name, "{$this->rewrite['slug']}/%$this->name%", $permastruct_args ); + } + } + + /** + * Registers the post type meta box if a custom callback was specified. + * + * @since 4.6.0 + */ + public function register_meta_boxes() { + if ( $this->register_meta_box_cb ) { + add_action( 'add_meta_boxes_' . $this->name, $this->register_meta_box_cb, 10, 1 ); + } + } + + /** + * Adds the future post hook action for the post type. + * + * @since 4.6.0 + */ + public function add_hooks() { + add_action( 'future_' . $this->name, '_future_post_hook', 5, 2 ); + } + + /** + * Registers the taxonomies for the post type. + * + * @since 4.6.0 + */ + public function register_taxonomies() { + foreach ( $this->taxonomies as $taxonomy ) { + register_taxonomy_for_object_type( $taxonomy, $this->name ); + } + } + + /** + * Removes the features support for the post type. + * + * @since 4.6.0 + * + * @global array $_wp_post_type_features Post type features. + */ + public function remove_supports() { + global $_wp_post_type_features; + + unset( $_wp_post_type_features[ $this->name ] ); + } + + /** + * Removes any rewrite rules, permastructs, and rules for the post type. + * + * @since 4.6.0 + * + * @global WP_Rewrite $wp_rewrite WordPress rewrite component. + * @global WP $wp Current WordPress environment instance. + * @global array $post_type_meta_caps Used to remove meta capabilities. + */ + public function remove_rewrite_rules() { + global $wp, $wp_rewrite, $post_type_meta_caps; + + // Remove query var. + if ( false !== $this->query_var ) { + $wp->remove_query_var( $this->query_var ); + } + + // Remove any rewrite rules, permastructs, and rules. + if ( false !== $this->rewrite ) { + remove_rewrite_tag( "%$this->name%" ); + remove_permastruct( $this->name ); + foreach ( $wp_rewrite->extra_rules_top as $regex => $query ) { + if ( false !== strpos( $query, "index.php?post_type=$this->name" ) ) { + unset( $wp_rewrite->extra_rules_top[ $regex ] ); + } + } + } + + // Remove registered custom meta capabilities. + foreach ( $this->cap as $cap ) { + unset( $post_type_meta_caps[ $cap ] ); + } + } + + /** + * Unregisters the post type meta box if a custom callback was specified. + * + * @since 4.6.0 + */ + public function unregister_meta_boxes() { + if ( $this->register_meta_box_cb ) { + remove_action( 'add_meta_boxes_' . $this->name, $this->register_meta_box_cb, 10 ); + } + } + + /** + * Removes the post type from all taxonomies. + * + * @since 4.6.0 + */ + public function unregister_taxonomies() { + foreach ( get_object_taxonomies( $this->name ) as $taxonomy ) { + unregister_taxonomy_for_object_type( $taxonomy, $this->name ); + } + } + + /** + * Removes the future post hook action for the post type. + * + * @since 4.6.0 + */ + public function remove_hooks() { + remove_action( 'future_' . $this->name, '_future_post_hook', 5 ); + } +}