diff --git a/wp-admin/site-editor.php b/wp-admin/site-editor.php index 5fc06a4078..b0bb4e2bb1 100644 --- a/wp-admin/site-editor.php +++ b/wp-admin/site-editor.php @@ -244,9 +244,7 @@ if ( $block_editor_context->post ) { ); } } -} elseif ( isset( $_GET['p'] ) && '/' !== $_GET['p'] ) { - // Only prefetch for the root. If we preload it for all pages and it's not - // used it won't be possible to invalidate. +} else { $preload_paths[] = '/wp/v2/templates/lookup?slug=front-page'; $preload_paths[] = '/wp/v2/templates/lookup?slug=home'; } diff --git a/wp-includes/block-template-utils.php b/wp-includes/block-template-utils.php index 53954b7ff4..be15b8c398 100644 --- a/wp-includes/block-template-utils.php +++ b/wp-includes/block-template-utils.php @@ -1074,46 +1074,6 @@ function _build_block_template_result_from_post( $post ) { return $template; } -function get_registered_block_templates( $query ) { - $template_files = _get_block_templates_files( 'wp_template', $query ); - $query_result = array(); - - // _get_block_templates_files seems broken, it does not obey the query. - if ( isset( $query['slug__in'] ) && is_array( $query['slug__in'] ) ) { - $template_files = array_filter( - $template_files, - function ( $template_file ) use ( $query ) { - return in_array( $template_file['slug'], $query['slug__in'], true ); - } - ); - } - - foreach ( $template_files as $template_file ) { - $query_result[] = _build_block_template_result_from_file( $template_file, 'wp_template' ); - } - - // Add templates registered through the template registry. Filtering out the - // ones which have a theme file. - $registered_templates = WP_Block_Templates_Registry::get_instance()->get_by_query( $query ); - $matching_registered_templates = array_filter( - $registered_templates, - function ( $registered_template ) use ( $template_files ) { - foreach ( $template_files as $template_file ) { - if ( $template_file['slug'] === $registered_template->slug ) { - return false; - } - } - return true; - } - ); - - $query_result = array_merge( $query_result, $matching_registered_templates ); - - // Templates added by PHP filter also count as registered templates. - /** This filter is documented in wp-includes/block-template-utils.php */ - return apply_filters( 'get_block_templates', $query_result, $query, 'wp_template' ); -} - /** * Retrieves a list of unified template objects based on a query. * @@ -1192,8 +1152,6 @@ function get_block_templates( $query = array(), $template_type = 'wp_template' ) $wp_query_args['post_status'] = 'publish'; } - $active_templates = get_option( 'active_templates', array() ); - $template_query = new WP_Query( $wp_query_args ); $query_result = array(); foreach ( $template_query->posts as $post ) { @@ -1215,14 +1173,7 @@ function get_block_templates( $query = array(), $template_type = 'wp_template' ) continue; } - if ( $template->is_custom || isset( $query['wp_id'] ) ) { - // Custom templates don't need to be activated, leave them be. - // Also don't filter out templates when querying by wp_id. - $query_result[] = $template; - } elseif ( isset( $active_templates[ $template->slug ] ) && $active_templates[ $template->slug ] === $post->ID ) { - // Only include active templates. - $query_result[] = $template; - } + $query_result[] = $template; } if ( ! isset( $query['wp_id'] ) ) { @@ -1345,23 +1296,7 @@ function get_block_template( $id, $template_type = 'wp_template' ) { return null; } list( $theme, $slug ) = $parts; - - $active_templates = get_option( 'active_templates', array() ); - - if ( ! empty( $active_templates[ $slug ] ) ) { - if ( is_int( $active_templates[ $slug ] ) ) { - $post = get_post( $active_templates[ $slug ] ); - if ( $post && 'publish' === $post->post_status ) { - $template = _build_block_template_result_from_post( $post ); - - if ( ! is_wp_error( $template ) && $theme === $template->theme ) { - return $template; - } - } - } - } - - $wp_query_args = array( + $wp_query_args = array( 'post_name__in' => array( $slug ), 'post_type' => $template_type, 'post_status' => array( 'auto-draft', 'draft', 'publish', 'trash' ), @@ -1375,18 +1310,12 @@ function get_block_template( $id, $template_type = 'wp_template' ) { ), ), ); - $template_query = new WP_Query( $wp_query_args ); - $posts = $template_query->posts; + $template_query = new WP_Query( $wp_query_args ); + $posts = $template_query->posts; if ( count( $posts ) > 0 ) { $template = _build_block_template_result_from_post( $posts[0] ); - // Custom templates don't need to be activated, so if it's a custom - // template, return it. - if ( ! is_wp_error( $template ) && $template->is_custom ) { - return $template; - } - if ( ! is_wp_error( $template ) ) { return $template; } @@ -1850,87 +1779,3 @@ function inject_ignored_hooked_blocks_metadata_attributes( $changes, $deprecated return $changes; } - -function wp_assign_new_template_to_theme( $changes, $request ) { - // Do not run this for templates created through the old enpoint. - $template = $request['id'] ? get_block_template( $request['id'], 'wp_template' ) : null; - if ( $template ) { - return $changes; - } - if ( ! isset( $changes->tax_input ) ) { - $changes->tax_input = array(); - } - $changes->tax_input['wp_theme'] = isset( $request['theme'] ) ? $request['theme'] : get_stylesheet(); - // All new templates saved will receive meta so we can distinguish between - // templates created the old way as edits and templates created the new way. - if ( ! isset( $changes->meta_input ) ) { - $changes->meta_input = array(); - } - $changes->meta_input['is_inactive_by_default'] = true; - return $changes; -} - -function wp_maybe_activate_template( $post_id ) { - $post = get_post( $post_id ); - $is_inactive_by_default = get_post_meta( $post_id, 'is_inactive_by_default', true ); - if ( $is_inactive_by_default ) { - return; - } - $active_templates = get_option( 'active_templates', array() ); - $active_templates[ $post->post_name ] = $post->ID; - update_option( 'active_templates', $active_templates ); -} - -function _wp_migrate_active_templates() { - // Do not run during installation when the database is not yet available. - if ( wp_installing() ) { - return; - } - - $active_templates = get_option( 'active_templates', false ); - - if ( false !== $active_templates ) { - return; - } - - // Query all templates in the database. See `get_block_templates`. - $wp_query_args = array( - 'post_status' => 'publish', - 'post_type' => 'wp_template', - 'posts_per_page' => -1, - 'no_found_rows' => true, - 'lazy_load_term_meta' => false, - 'tax_query' => array( - array( - 'taxonomy' => 'wp_theme', - 'field' => 'name', - 'terms' => get_stylesheet(), - ), - ), - // Only get templates that are not inactive by default. We check these - // meta to make sure we don't fill the option with inactive templates - // created after the 6.9 release when for some reason the option is - // deleted. - 'meta_query' => array( - 'relation' => 'OR', - array( - 'key' => 'is_inactive_by_default', - 'compare' => 'NOT EXISTS', - ), - array( - 'key' => 'is_inactive_by_default', - 'value' => false, - 'compare' => '=', - ), - ), - ); - - $template_query = new WP_Query( $wp_query_args ); - $active_templates = array(); - - foreach ( $template_query->posts as $post ) { - $active_templates[ $post->post_name ] = $post->ID; - } - - update_option( 'active_templates', $active_templates ); -} diff --git a/wp-includes/block-template.php b/wp-includes/block-template.php index 220cb0b2a2..eecbe2d61d 100644 --- a/wp-includes/block-template.php +++ b/wp-includes/block-template.php @@ -164,67 +164,11 @@ function resolve_block_template( $template_type, $template_hierarchy, $fallback_ $template_hierarchy ); - $object_id = get_queried_object_id(); - $specific_template = $object_id && get_post( $object_id ) ? get_page_template_slug( $object_id ) : null; - $active_templates = (array) get_option( 'active_templates', array() ); - - // We expect one template for each slug. Use the active template if it is - // set and exists. Otherwise use the static template. - $templates = array(); - $remaining_slugs = array(); - - foreach ( $slugs as $slug ) { - if ( $slug === $specific_template || empty( $active_templates[ $slug ] ) ) { - $remaining_slugs[] = $slug; - continue; - } - - // TODO: it need to be possible to set a static template as active. - $post = get_post( $active_templates[ $slug ] ); - if ( ! $post || 'publish' !== $post->post_status ) { - $remaining_slugs[] = $slug; - continue; - } - - $template = _build_block_template_result_from_post( $post ); - - // Ensure the active templates are associated with the active theme. - // See _build_block_template_object_from_post_object. - if ( get_stylesheet() !== $template->theme ) { - $remaining_slugs[] = $slug; - continue; - } - - $templates[] = $template; - } - - // Apply the filter to the active templates for backward compatibility. - /** This filter is documented in wp-includes/block-template-utils.php */ - if ( ! empty( $templates ) ) { - $templates = apply_filters( - 'get_block_templates', - $templates, - array( - 'slug__in' => array_map( - function ( $template ) { - return $template->slug; - }, - $templates - ), - ), - 'wp_template' - ); - } - - // For any remaining slugs, use the static template. + // Find all potential templates 'wp_template' post matching the hierarchy. $query = array( - 'slug__in' => $remaining_slugs, + 'slug__in' => $slugs, ); - $templates = array_merge( $templates, get_registered_block_templates( $query ) ); - - if ( $specific_template && in_array( $specific_template, $remaining_slugs, true ) ) { - $templates = array_merge( $templates, get_block_templates( array( 'slug__in' => array( $specific_template ) ) ) ); - } + $templates = get_block_templates( $query ); // Order these templates per slug priority. // Build map of template slugs to their priority in the current hierarchy. diff --git a/wp-includes/default-filters.php b/wp-includes/default-filters.php index 229c9a7541..03538448b5 100644 --- a/wp-includes/default-filters.php +++ b/wp-includes/default-filters.php @@ -571,7 +571,6 @@ add_action( 'transition_post_status', '__clear_multi_author_cache' ); // Post. add_action( 'init', 'create_initial_post_types', 0 ); // Highest priority. -add_action( 'init', '_wp_migrate_active_templates', 0 ); // Highest priority. add_action( 'admin_menu', '_add_post_type_submenus' ); add_action( 'before_delete_post', '_reset_front_page_settings_for_post' ); add_action( 'wp_trash_post', '_reset_front_page_settings_for_post' ); @@ -747,7 +746,6 @@ add_filter( 'user_has_cap', 'wp_maybe_grant_site_health_caps', 1, 4 ); // Block templates post type and rendering. add_filter( 'render_block_context', '_block_template_render_without_post_block_context' ); add_filter( 'pre_wp_unique_post_slug', 'wp_filter_wp_template_unique_post_slug', 10, 5 ); -add_action( 'save_post_wp_template', 'wp_maybe_activate_template' ); add_action( 'save_post_wp_template_part', 'wp_set_unique_slug_on_create_template_part' ); add_action( 'wp_enqueue_scripts', 'wp_enqueue_block_template_skip_link' ); add_action( 'wp_footer', 'the_block_template_skip_link' ); // Retained for backwards-compatibility. Unhooked by wp_enqueue_block_template_skip_link(). @@ -788,10 +786,6 @@ add_action( 'init', '_wp_register_default_font_collections' ); add_filter( 'rest_pre_insert_wp_template', 'inject_ignored_hooked_blocks_metadata_attributes' ); add_filter( 'rest_pre_insert_wp_template_part', 'inject_ignored_hooked_blocks_metadata_attributes' ); -// Assign the wp_theme term to any newly created wp_template with the new endpoint. -// Must run before `inject_ignored_hooked_blocks_metadata_attributes`. -add_action( 'rest_pre_insert_wp_template', 'wp_assign_new_template_to_theme', 9, 2 ); - // Update ignoredHookedBlocks postmeta for some post types. add_filter( 'rest_pre_insert_page', 'update_ignored_hooked_blocks_postmeta' ); add_filter( 'rest_pre_insert_post', 'update_ignored_hooked_blocks_postmeta' ); diff --git a/wp-includes/option.php b/wp-includes/option.php index 58217ce317..7cb4736c28 100644 --- a/wp-includes/option.php +++ b/wp-includes/option.php @@ -2959,25 +2959,6 @@ function register_initial_settings() { 'description' => __( 'Allow people to submit comments on new posts.' ), ) ); - - register_setting( - 'reading', - 'active_templates', - array( - 'type' => 'object', - // Do not set the default value to an empty array! For some reason - // that will prevent the option from being set to an empty array. - 'show_in_rest' => array( - 'schema' => array( - 'type' => 'object', - // Properties can be integers, strings, or false - // (deactivated). - 'additionalProperties' => true, - ), - ), - 'label' => 'Active Templates', - ) - ); } /** diff --git a/wp-includes/post.php b/wp-includes/post.php index 583a01598c..67d4d31f11 100644 --- a/wp-includes/post.php +++ b/wp-includes/post.php @@ -368,7 +368,7 @@ function create_initial_post_types() { register_post_type( 'wp_template', array( - 'labels' => array( + 'labels' => array( 'name' => _x( 'Templates', 'post type general name' ), 'singular_name' => _x( 'Template', 'post type singular name' ), 'add_new' => __( 'Add Template' ), @@ -389,20 +389,22 @@ function create_initial_post_types() { 'items_list' => __( 'Templates list' ), 'item_updated' => __( 'Template updated.' ), ), - 'description' => __( 'Templates to include in your theme.' ), - 'public' => false, - '_builtin' => true, /* internal use only. don't use this when registering your own post type. */ - '_edit_link' => $template_edit_link, /* internal use only. don't use this when registering your own post type. */ - 'has_archive' => false, - 'show_ui' => false, - 'show_in_menu' => false, - 'show_in_rest' => true, - 'rewrite' => false, - 'rest_base' => 'created-templates', - 'rest_controller_class' => 'WP_REST_Posts_Controller', - 'late_route_registration' => true, - 'capability_type' => array( 'template', 'templates' ), - 'capabilities' => array( + 'description' => __( 'Templates to include in your theme.' ), + 'public' => false, + '_builtin' => true, /* internal use only. don't use this when registering your own post type. */ + '_edit_link' => $template_edit_link, /* internal use only. don't use this when registering your own post type. */ + 'has_archive' => false, + 'show_ui' => false, + 'show_in_menu' => false, + 'show_in_rest' => true, + 'rewrite' => false, + 'rest_base' => 'templates', + 'rest_controller_class' => 'WP_REST_Templates_Controller', + 'autosave_rest_controller_class' => 'WP_REST_Template_Autosaves_Controller', + 'revisions_rest_controller_class' => 'WP_REST_Template_Revisions_Controller', + 'late_route_registration' => true, + 'capability_type' => array( 'template', 'templates' ), + 'capabilities' => array( 'create_posts' => 'edit_theme_options', 'delete_posts' => 'edit_theme_options', 'delete_others_posts' => 'edit_theme_options', @@ -416,15 +418,14 @@ function create_initial_post_types() { 'read' => 'edit_theme_options', 'read_private_posts' => 'edit_theme_options', ), - 'map_meta_cap' => true, - 'supports' => array( + 'map_meta_cap' => true, + 'supports' => array( 'title', 'slug', 'excerpt', 'editor', 'revisions', 'author', - 'custom-fields', ), ) ); @@ -8635,16 +8636,4 @@ function wp_create_initial_post_meta() { ), ) ); - - // Allow setting the is_wp_suggestion meta field, which partly determines if - // a template is a custom template. - register_post_meta( - 'wp_template', - 'is_wp_suggestion', - array( - 'type' => 'boolean', - 'show_in_rest' => true, - 'single' => true, - ) - ); } diff --git a/wp-includes/rest-api.php b/wp-includes/rest-api.php index 7e3ed578ec..d33a52ef51 100644 --- a/wp-includes/rest-api.php +++ b/wp-includes/rest-api.php @@ -289,71 +289,6 @@ function create_initial_rest_routes() { } } - global $wp_post_types; - - // Register the old templates endpoints. The WP_REST_Templates_Controller - // and sub-controllers used linked to the wp_template post type, but are no - // longer. They still require a post type object when contructing the class. - // To maintain backward and changes to these controller classes, we make use - // that the wp_template post type has the right information it needs. - $current_wp_template_rest_base = $wp_post_types['wp_template']->rest_base; - $wp_post_types['wp_template']->rest_base = 'templates'; - // Store the classes so they can be restored. - $original_rest_controller_class = $wp_post_types['wp_template']->rest_controller_class; - $original_autosave_rest_controller_class = $wp_post_types['wp_template']->autosave_rest_controller_class; - $original_revisions_rest_controller_class = $wp_post_types['wp_template']->revisions_rest_controller_class; - // Temporarily set the old classes. - $wp_post_types['wp_template']->rest_controller_class = 'WP_REST_Templates_Controller'; - $wp_post_types['wp_template']->autosave_rest_controller_class = 'WP_REST_Template_Autosaves_Controller'; - $wp_post_types['wp_template']->revisions_rest_controller_class = 'WP_REST_Template_Revisions_Controller'; - // Initialize the controllers. The order is important: the autosave - // controller needs both the templates and revisions controllers. - $controller = new WP_REST_Templates_Controller( 'wp_template' ); - $wp_post_types['wp_template']->rest_controller = $controller; - $revisions_controller = new WP_REST_Template_Revisions_Controller( 'wp_template' ); - $wp_post_types['wp_template']->revisions_rest_controller = $revisions_controller; - $autosaves_controller = new WP_REST_Template_Autosaves_Controller( 'wp_template' ); - // Unset the controller cache, it will be re-initialized when - // get_rest_controller is called. - $wp_post_types['wp_template']->rest_controller = null; - $wp_post_types['wp_template']->revisions_rest_controller = null; - // Restore the original classes. - $wp_post_types['wp_template']->rest_controller_class = $original_rest_controller_class; - $wp_post_types['wp_template']->autosave_rest_controller_class = $original_autosave_rest_controller_class; - $wp_post_types['wp_template']->revisions_rest_controller_class = $original_revisions_rest_controller_class; - // Restore the original base. - $wp_post_types['wp_template']->rest_base = $current_wp_template_rest_base; - - // Register the old routes. - $autosaves_controller->register_routes(); - $revisions_controller->register_routes(); - $controller->register_routes(); - - register_rest_field( - 'wp_template', - 'theme', - array( - 'get_callback' => function ( $post_arr ) { - // add_additional_fields_to_object is also called for the old - // templates controller, so we need to check if the id is an - // integer to make sure it's the proper post type endpoint. - if ( ! is_int( $post_arr['id'] ) ) { - $template = get_block_template( $post_arr['id'], 'wp_template' ); - return $template ? $template->theme : null; - } - $terms = get_the_terms( $post_arr['id'], 'wp_theme' ); - if ( is_wp_error( $terms ) || empty( $terms ) ) { - return null; - } - return $terms[0]->slug; - }, - ) - ); - - // Registered templates. - $controller = new WP_REST_Registered_Templates_Controller(); - $controller->register_routes(); - // Post types. $controller = new WP_REST_Post_Types_Controller(); $controller->register_routes(); diff --git a/wp-includes/rest-api/endpoints/class-wp-rest-registered-templates-controller.php b/wp-includes/rest-api/endpoints/class-wp-rest-registered-templates-controller.php deleted file mode 100644 index fd912bfb45..0000000000 --- a/wp-includes/rest-api/endpoints/class-wp-rest-registered-templates-controller.php +++ /dev/null @@ -1,107 +0,0 @@ -rest_base = 'registered-templates'; - $this->namespace = 'wp/v2'; - } - - public function register_routes() { - // Lists all templates. - register_rest_route( - $this->namespace, - '/' . $this->rest_base, - array( - array( - 'methods' => WP_REST_Server::READABLE, - 'callback' => array( $this, 'get_items' ), - 'permission_callback' => array( $this, 'get_items_permissions_check' ), - 'args' => $this->get_collection_params(), - ), - 'schema' => array( $this, 'get_public_item_schema' ), - ) - ); - - // Lists/updates a single template based on the given id. - register_rest_route( - $this->namespace, - // The route. - sprintf( - '/%s/(?P%s%s)', - $this->rest_base, - /* - * Matches theme's directory: `/themes///` or `/themes//`. - * Excludes invalid directory name characters: `/:<>*?"|`. - */ - '([^\/:<>\*\?"\|]+(?:\/[^\/:<>\*\?"\|]+)?)', - // Matches the template name. - '[\/\w%-]+' - ), - array( - 'args' => array( - 'id' => array( - 'description' => __( 'The id of a template' ), - 'type' => 'string', - 'sanitize_callback' => array( $this, '_sanitize_template_id' ), - ), - ), - array( - 'methods' => WP_REST_Server::READABLE, - 'callback' => array( $this, 'get_item' ), - 'permission_callback' => array( $this, 'get_item_permissions_check' ), - 'args' => array( - 'context' => $this->get_context_param( array( 'default' => 'view' ) ), - ), - ), - 'schema' => array( $this, 'get_public_item_schema' ), - ) - ); - } - - public function get_item_schema() { - $schema = parent::get_item_schema(); - $schema['properties']['is_custom'] = array( - 'description' => __( 'Whether a template is a custom template.' ), - 'type' => 'bool', - 'context' => array( 'embed', 'view', 'edit' ), - 'readonly' => true, - ); - $schema['properties']['plugin'] = array( - 'type' => 'string', - 'description' => __( 'Plugin that registered the template.' ), - 'readonly' => true, - 'context' => array( 'view', 'edit', 'embed' ), - ); - return $schema; - } - - public function get_items( $request ) { - $query = array(); - if ( isset( $request['area'] ) ) { - $query['area'] = $request['area']; - } - if ( isset( $request['post_type'] ) ) { - $query['post_type'] = $request['post_type']; - } - $query_result = get_registered_block_templates( $query ); - $templates = array(); - foreach ( $query_result as $template ) { - $item = $this->prepare_item_for_response( $template, $request ); - $templates[] = $this->prepare_response_for_collection( $item ); - } - - return rest_ensure_response( $templates ); - } - - public function get_item( $request ) { - $template = get_block_file_template( $request['id'], 'wp_template' ); - - if ( ! $template ) { - return new WP_Error( 'rest_template_not_found', __( 'No templates exist with that id.' ), array( 'status' => 404 ) ); - } - - $item = $this->prepare_item_for_response( $template, $request ); - return rest_ensure_response( $item ); - } -} diff --git a/wp-includes/theme-templates.php b/wp-includes/theme-templates.php index f31cacd39a..eed0fb9b2b 100644 --- a/wp-includes/theme-templates.php +++ b/wp-includes/theme-templates.php @@ -49,11 +49,6 @@ function wp_filter_wp_template_unique_post_slug( $override_slug, $slug, $post_id return $override_slug; } - // For wp_template, slugs no longer have to be unique within the same theme. - if ( 'wp_template' === $post_type ) { - return $slug; - } - if ( ! $override_slug ) { $override_slug = $slug; } diff --git a/wp-includes/version.php b/wp-includes/version.php index 9ab10e7cbd..8a191b430d 100644 --- a/wp-includes/version.php +++ b/wp-includes/version.php @@ -16,7 +16,7 @@ * * @global string $wp_version */ -$wp_version = '6.9-beta3-61177'; +$wp_version = '6.9-beta3-61178'; /** * Holds the WordPress DB revision, increments when changes are made to the WordPress DB schema. diff --git a/wp-settings.php b/wp-settings.php index 20ee50276d..3a91622ac6 100644 --- a/wp-settings.php +++ b/wp-settings.php @@ -331,7 +331,6 @@ require ABSPATH . WPINC . '/rest-api/endpoints/class-wp-rest-sidebars-controller require ABSPATH . WPINC . '/rest-api/endpoints/class-wp-rest-widget-types-controller.php'; require ABSPATH . WPINC . '/rest-api/endpoints/class-wp-rest-widgets-controller.php'; require ABSPATH . WPINC . '/rest-api/endpoints/class-wp-rest-templates-controller.php'; -require ABSPATH . WPINC . '/rest-api/endpoints/class-wp-rest-registered-templates-controller.php'; require ABSPATH . WPINC . '/rest-api/endpoints/class-wp-rest-url-details-controller.php'; require ABSPATH . WPINC . '/rest-api/endpoints/class-wp-rest-navigation-fallback-controller.php'; require ABSPATH . WPINC . '/rest-api/endpoints/class-wp-rest-font-families-controller.php';