From cb0b292c87b67e3f60c02f8dba5a315e505d497c Mon Sep 17 00:00:00 2001 From: Gary Pendergast Date: Fri, 14 Dec 2018 01:10:20 +0000 Subject: [PATCH] Block Editor: Add helper functions to collect meta box information. To allow the block editor to render meta boxes, it needs to collect information about how those meta boxes are registered, and format it for the block editor to make use of. Merges [43778] from the 5.0 branch to trunk. See #45112. git-svn-id: https://develop.svn.wordpress.org/trunk@44131 602fd350-edb4-49c9-b593-d223f7449a82 --- src/wp-admin/includes/post.php | 141 +++++++++++++++++++++++++++++++++ 1 file changed, 141 insertions(+) diff --git a/src/wp-admin/includes/post.php b/src/wp-admin/includes/post.php index 7f49482ba3..c664be627b 100644 --- a/src/wp-admin/includes/post.php +++ b/src/wp-admin/includes/post.php @@ -2039,6 +2039,12 @@ function use_block_editor_for_post( $post ) { return false; } + // We're in the meta box loader, so don't use the block editor. + if ( isset( $_GET['meta-box-loader'] ) ) { + check_admin_referer( 'meta-box-loader' ); + return false; + } + $use_block_editor = use_block_editor_for_post_type( $post->post_type ); /** @@ -2166,3 +2172,138 @@ function get_block_editor_server_block_settings() { return $blocks; } + +/** + * Renders the meta boxes forms. + * + * @since 5.0.0 + */ +function the_block_editor_meta_boxes() { + global $post, $current_screen, $wp_meta_boxes; + + // Handle meta box state. + $_original_meta_boxes = $wp_meta_boxes; + + /** + * Fires right before the meta boxes are rendered. + * + * This allows for the filtering of meta box data, that should already be + * present by this point. Do not use as a means of adding meta box data. + * + * @since 5.0.0 + * + * @param array $wp_meta_boxes Global meta box state. + */ + $wp_meta_boxes = apply_filters( 'filter_block_editor_meta_boxes', $wp_meta_boxes ); + $locations = array( 'side', 'normal', 'advanced' ); + $priorities = array( 'high', 'sorted', 'core', 'default', 'low' ); + + // Render meta boxes. + ?> +
+ +
+ +
+ +
+ + id ][ $location ] ) ) { + continue; + } + + foreach ( $priorities as $priority ) { + if ( ! isset( $wp_meta_boxes[ $current_screen->id ][ $location ][ $priority ] ) ) { + continue; + } + + $meta_boxes = (array) $wp_meta_boxes[ $current_screen->id ][ $location ][ $priority ]; + foreach ( $meta_boxes as $meta_box ) { + if ( ! empty( $meta_box['title'] ) ) { + $meta_boxes_per_location[ $location ][] = array( + 'id' => $meta_box['id'], + 'title' => $meta_box['title'], + ); + } + } + } + } + + /** + * Sadly we probably can not add this data directly into editor settings. + * + * Some meta boxes need admin_head to fire for meta box registry. + * admin_head fires after admin_enqueue_scripts, which is where we create our + * editor instance. + */ + $script = 'window._wpLoadBlockEditor.then( function() { + wp.data.dispatch( \'core/edit-post\' ).setAvailableMetaBoxesPerLocation( ' . wp_json_encode( $meta_boxes_per_location ) . ' ); + } );'; + + wp_add_inline_script( 'wp-edit-post', $script ); + + /** + * When `wp-edit-post` is output in the ``, the inline script needs to be manually printed. Otherwise, + * meta boxes will not display because inline scripts for `wp-edit-post` will not be printed again after this point. + */ + if ( wp_script_is( 'wp-edit-post', 'done' ) ) { + printf( "\n", trim( $script ) ); + } + + // Reset meta box data. + $wp_meta_boxes = $_original_meta_boxes; +} + +/** + * Renders the hidden form required for the meta boxes form. + * + * @since 5.0.0 + * + * @param WP_Post $post Current post object. + */ +function the_block_editor_meta_box_post_form_hidden_fields( $post ) { + $form_extra = ''; + if ( 'auto-draft' === $post->post_status ) { + $form_extra .= ""; + } + $form_action = 'editpost'; + $nonce_action = 'update-post_' . $post->ID; + $form_extra .= ""; + $referer = wp_get_referer(); + $current_user = wp_get_current_user(); + $user_id = $current_user->ID; + wp_nonce_field( $nonce_action ); + ?> + + + + + + + +