Make WordPress Core

Changeset 51003 for trunk


Ignore:
Timestamp:
05/25/2021 02:19:14 PM (5 years ago)
Author:
youknowriad
Message:

Block Editor: Introduce block templates for classic themes.

With this patch, users will be able to create custom block based templates
and assign them to specific pages/posts.

Themes can also opt-out of this feature

Props bernhard-reiter, carlomanf.
Fixes #53176.

Location:
trunk
Files:
9 added
11 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/wp-admin/edit-form-blocks.php

    r50996 r51003  
    221221        '__experimentalBlockPatterns'          => WP_Block_Patterns_Registry::get_instance()->get_all_registered(),
    222222        '__experimentalBlockPatternCategories' => WP_Block_Pattern_Categories_Registry::get_instance()->get_all_registered(),
     223        'supportsTemplateMode'                 => current_theme_supports( 'block-templates' ),
    223224
    224225        // Whether or not to load the 'postcustom' meta box is stored as a user meta
  • trunk/src/wp-includes/class-wp-theme.php

    r50810 r51003  
    11831183         *
    11841184         * @since 4.7.0
     1185         * @since 5.8.0 Include block templates.
    11851186         *
    11861187         * @return string[] Array of page templates, keyed by filename and post type,
     
    12171218
    12181219                                        $post_templates[ $type ][ $file ] = _cleanup_header_comment( $header[1] );
     1220                                }
     1221                        }
     1222
     1223                        if ( current_theme_supports( 'block-templates' ) ) {
     1224                                $block_templates = get_block_templates( array(), 'wp_template' );
     1225                                foreach ( get_post_types( array( 'public' => true ) ) as $type ) {
     1226                                        foreach ( $block_templates as $block_template ) {
     1227                                                $post_templates[ $type ][ $block_template->slug ] = $block_template->title;
     1228                                        }
    12191229                                }
    12201230                        }
  • trunk/src/wp-includes/default-filters.php

    r50973 r51003  
    556556add_action( 'wp_footer', 'wp_maybe_inline_styles', 1 ); // Run for late-loaded styles in the footer.
    557557
     558add_action( 'admin_footer-post.php', 'wp_add_iframed_editor_assets_html' );
     559add_action( 'admin_footer-post-new.php', 'wp_add_iframed_editor_assets_html' );
     560
    558561// Taxonomy.
    559562add_action( 'init', 'create_initial_taxonomies', 0 ); // Highest priority.
     
    634637add_filter( 'user_has_cap', 'wp_maybe_grant_site_health_caps', 1, 4 );
    635638
     639// Block Templates CPT and Rendering
     640add_filter( 'render_block_context', '_block_template_render_without_post_block_context' );
     641add_filter( 'pre_wp_unique_post_slug', 'wp_filter_wp_template_unique_post_slug', 10, 5 );
     642add_action( 'wp_footer', 'the_block_template_skip_link' );
     643
    636644unset( $filter, $action );
  • trunk/src/wp-includes/post.php

    r50935 r51003  
    305305                        'supports'              => array(
    306306                                'title',
     307                                'editor',
     308                                'revisions',
     309                        ),
     310                )
     311        );
     312
     313        register_post_type(
     314                'wp_template',
     315                array(
     316                        'labels'                => array(
     317                                'name'                  => __( 'Templates' ),
     318                                'singular_name'         => __( 'Template' ),
     319                                'menu_name'             => _x( 'Templates', 'Admin Menu text' ),
     320                                'add_new'               => _x( 'Add New', 'Template' ),
     321                                'add_new_item'          => __( 'Add New Template' ),
     322                                'new_item'              => __( 'New Template' ),
     323                                'edit_item'             => __( 'Edit Template' ),
     324                                'view_item'             => __( 'View Template' ),
     325                                'all_items'             => __( 'All Templates' ),
     326                                'search_items'          => __( 'Search Templates' ),
     327                                'parent_item_colon'     => __( 'Parent Template:' ),
     328                                'not_found'             => __( 'No templates found.' ),
     329                                'not_found_in_trash'    => __( 'No templates found in Trash.' ),
     330                                'archives'              => __( 'Template archives' ),
     331                                'insert_into_item'      => __( 'Insert into template' ),
     332                                'uploaded_to_this_item' => __( 'Uploaded to this template' ),
     333                                'filter_items_list'     => __( 'Filter templates list' ),
     334                                'items_list_navigation' => __( 'Templates list navigation' ),
     335                                'items_list'            => __( 'Templates list' ),
     336                        ),
     337                        'description'           => __( 'Templates to include in your theme.' ),
     338                        'public'                => false,
     339                        'has_archive'           => false,
     340                        'show_ui'               => false,
     341                        'show_in_menu'          => false,
     342                        'show_in_admin_bar'     => false,
     343                        'show_in_rest'          => true,
     344                        'rewrite'               => false,
     345                        'rest_base'             => 'templates',
     346                        'rest_controller_class' => 'WP_REST_Templates_Controller',
     347                        'capability_type'       => array( 'template', 'templates' ),
     348                        'capabilities'          => array(
     349                                'create_posts'           => 'edit_theme_options',
     350                                'delete_posts'           => 'edit_theme_options',
     351                                'delete_others_posts'    => 'edit_theme_options',
     352                                'delete_private_posts'   => 'edit_theme_options',
     353                                'delete_published_posts' => 'edit_theme_options',
     354                                'edit_posts'             => 'edit_theme_options',
     355                                'edit_others_posts'      => 'edit_theme_options',
     356                                'edit_private_posts'     => 'edit_theme_options',
     357                                'edit_published_posts'   => 'edit_theme_options',
     358                                'publish_posts'          => 'edit_theme_options',
     359                                'read'                   => 'edit_theme_options',
     360                                'read_private_posts'     => 'edit_theme_options',
     361                        ),
     362                        'map_meta_cap'          => true,
     363                        'supports'              => array(
     364                                'title',
     365                                'slug',
     366                                'excerpt',
    307367                                'editor',
    308368                                'revisions',
  • trunk/src/wp-includes/script-loader.php

    r51001 r51003  
    26632663        }
    26642664}
     2665
     2666/**
     2667 * Inject the block editor assets that need to be loaded into the editor's iframe as an inline script.
     2668 *
     2669 * @since 5.8.0
     2670 */
     2671function wp_add_iframed_editor_assets_html() {
     2672        $script_handles = array();
     2673        $style_handles  = array(
     2674                'wp-block-editor',
     2675                'wp-block-library',
     2676                'wp-block-library-theme',
     2677                'wp-edit-blocks',
     2678        );
     2679
     2680        $block_registry = WP_Block_Type_Registry::get_instance();
     2681
     2682        foreach ( $block_registry->get_all_registered() as $block_type ) {
     2683                if ( ! empty( $block_type->style ) ) {
     2684                        $style_handles[] = $block_type->style;
     2685                }
     2686
     2687                if ( ! empty( $block_type->editor_style ) ) {
     2688                        $style_handles[] = $block_type->editor_style;
     2689                }
     2690
     2691                if ( ! empty( $block_type->script ) ) {
     2692                        $script_handles[] = $block_type->script;
     2693                }
     2694        }
     2695
     2696        $style_handles = array_unique( $style_handles );
     2697        $done          = wp_styles()->done;
     2698
     2699        ob_start();
     2700
     2701        wp_styles()->done = array();
     2702        wp_styles()->do_items( $style_handles );
     2703        wp_styles()->done = $done;
     2704
     2705        $styles = ob_get_clean();
     2706
     2707        $script_handles = array_unique( $script_handles );
     2708        $done           = wp_scripts()->done;
     2709
     2710        ob_start();
     2711
     2712        wp_scripts()->done = array();
     2713        wp_scripts()->do_items( $script_handles );
     2714        wp_scripts()->done = $done;
     2715
     2716        $scripts = ob_get_clean();
     2717
     2718        $editor_assets = wp_json_encode(
     2719                array(
     2720                        'styles'  => $styles,
     2721                        'scripts' => $scripts,
     2722                )
     2723        );
     2724
     2725        echo "<script>window.__editorAssets = $editor_assets</script>";
     2726}
  • trunk/src/wp-includes/taxonomy.php

    r50935 r51003  
    171171                        '_builtin'          => true,
    172172                        'show_in_nav_menus' => current_theme_supports( 'post-formats' ),
     173                )
     174        );
     175
     176        register_taxonomy(
     177                'wp_theme',
     178                array( 'wp_template' ),
     179                array(
     180                        'public'            => false,
     181                        'hierarchical'      => false,
     182                        'labels'            => array(
     183                                'name'          => __( 'Themes' ),
     184                                'singular_name' => __( 'Theme' ),
     185                        ),
     186                        'query_var'         => false,
     187                        'rewrite'           => false,
     188                        'show_ui'           => false,
     189                        '_builtin'          => true,
     190                        'show_in_nav_menus' => false,
     191                        'show_in_rest'      => false,
    173192                )
    174193        );
  • trunk/src/wp-includes/template.php

    r50505 r51003  
    6464        $template = locate_template( $templates );
    6565
     66        $template = locate_block_template( $template, $type, $templates );
     67
    6668        /**
    6769         * Filters the path of the queried template by type.
  • trunk/src/wp-settings.php

    r51001 r51003  
    171171require ABSPATH . WPINC . '/theme.php';
    172172require ABSPATH . WPINC . '/class-wp-theme.php';
     173require ABSPATH . WPINC . '/class-wp-block-template.php';
     174require ABSPATH . WPINC . '/block-template-utils.php';
     175require ABSPATH . WPINC . '/block-template.php';
     176require ABSPATH . WPINC . '/theme-templates.php';
    173177require ABSPATH . WPINC . '/template.php';
    174178require ABSPATH . WPINC . '/https-detection.php';
     
    269273require ABSPATH . WPINC . '/rest-api/endpoints/class-wp-rest-widget-types-controller.php';
    270274require ABSPATH . WPINC . '/rest-api/endpoints/class-wp-rest-widgets-controller.php';
     275require ABSPATH . WPINC . '/rest-api/endpoints/class-wp-rest-templates-controller.php';
    271276require ABSPATH . WPINC . '/rest-api/fields/class-wp-rest-meta-fields.php';
    272277require ABSPATH . WPINC . '/rest-api/fields/class-wp-rest-comment-meta-fields.php';
  • trunk/tests/phpunit/tests/rest-api/rest-schema-setup.php

    r50995 r51003  
    130130                        '/wp/v2/block-types/(?P<namespace>[a-zA-Z0-9_-]+)/(?P<name>[a-zA-Z0-9_-]+)',
    131131                        '/wp/v2/settings',
     132                        '/wp/v2/templates',
     133                        '/wp/v2/templates/(?P<id>[\/\w-]+)',
     134                        '/wp/v2/templates/(?P<id>[\d]+)/autosaves',
     135                        '/wp/v2/templates/(?P<parent>[\d]+)/autosaves/(?P<id>[\d]+)',
     136                        '/wp/v2/templates/(?P<parent>[\d]+)/revisions',
     137                        '/wp/v2/templates/(?P<parent>[\d]+)/revisions/(?P<id>[\d]+)',
    132138                        '/wp/v2/themes',
    133139                        '/wp/v2/themes/(?P<stylesheet>[\w-]+)',
  • trunk/tests/phpunit/tests/theme/wpThemeJson.php

    r50977 r51003  
    66 * @package WordPress
    77 * @subpackage Theme
     8 *
    89 * @since 5.8.0
    910 *
  • trunk/tests/phpunit/tests/theme/wpThemeJsonResolver.php

    r50967 r51003  
    66 * @package WordPress
    77 * @subpackage Theme
     8 *
    89 * @since 5.8.0
    910 *
Note: See TracChangeset for help on using the changeset viewer.