<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head><meta http-equiv="content-type" content="text/html; charset=utf-8" />
<title>[44131] Block Editor: Add helper functions to collect meta box information.</title>
</head>
<body>

<style type="text/css"><!--
#msg dl.meta { border: 1px #006 solid; background: #369; padding: 6px; color: #fff; }
#msg dl.meta dt { float: left; width: 6em; font-weight: bold; }
#msg dt:after { content:':';}
#msg dl, #msg dt, #msg ul, #msg li, #header, #footer, #logmsg { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt;  }
#msg dl a { font-weight: bold}
#msg dl a:link    { color:#fc3; }
#msg dl a:active  { color:#ff0; }
#msg dl a:visited { color:#cc6; }
h3 { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; font-weight: bold; }
#msg pre { white-space: pre-line; overflow: auto; background: #ffc; border: 1px #fa0 solid; padding: 6px; }
#logmsg { background: #ffc; border: 1px #fa0 solid; padding: 1em 1em 0 1em; }
#logmsg p, #logmsg pre, #logmsg blockquote { margin: 0 0 1em 0; }
#logmsg p, #logmsg li, #logmsg dt, #logmsg dd { line-height: 14pt; }
#logmsg h1, #logmsg h2, #logmsg h3, #logmsg h4, #logmsg h5, #logmsg h6 { margin: .5em 0; }
#logmsg h1:first-child, #logmsg h2:first-child, #logmsg h3:first-child, #logmsg h4:first-child, #logmsg h5:first-child, #logmsg h6:first-child { margin-top: 0; }
#logmsg ul, #logmsg ol { padding: 0; list-style-position: inside; margin: 0 0 0 1em; }
#logmsg ul { text-indent: -1em; padding-left: 1em; }#logmsg ol { text-indent: -1.5em; padding-left: 1.5em; }
#logmsg > ul, #logmsg > ol { margin: 0 0 1em 0; }
#logmsg pre { background: #eee; padding: 1em; }
#logmsg blockquote { border: 1px solid #fa0; border-left-width: 10px; padding: 1em 1em 0 1em; background: white;}
#logmsg dl { margin: 0; }
#logmsg dt { font-weight: bold; }
#logmsg dd { margin: 0; padding: 0 0 0.5em 0; }
#logmsg dd:before { content:'\00bb';}
#logmsg table { border-spacing: 0px; border-collapse: collapse; border-top: 4px solid #fa0; border-bottom: 1px solid #fa0; background: #fff; }
#logmsg table th { text-align: left; font-weight: normal; padding: 0.2em 0.5em; border-top: 1px dotted #fa0; }
#logmsg table td { text-align: right; border-top: 1px dotted #fa0; padding: 0.2em 0.5em; }
#logmsg table thead th { text-align: center; border-bottom: 1px solid #fa0; }
#logmsg table th.Corner { text-align: left; }
#logmsg hr { border: none 0; border-top: 2px dashed #fa0; height: 1px; }
#header, #footer { color: #fff; background: #636; border: 1px #300 solid; padding: 6px; }
#patch { width: 100%; }
#patch h4 {font-family: verdana,arial,helvetica,sans-serif;font-size:10pt;padding:8px;background:#369;color:#fff;margin:0;}
#patch .propset h4, #patch .binary h4 {margin:0;}
#patch pre {padding:0;line-height:1.2em;margin:0;}
#patch .diff {width:100%;background:#eee;padding: 0 0 10px 0;overflow:auto;}
#patch .propset .diff, #patch .binary .diff  {padding:10px 0;}
#patch span {display:block;padding:0 10px;}
#patch .modfile, #patch .addfile, #patch .delfile, #patch .propset, #patch .binary, #patch .copfile {border:1px solid #ccc;margin:10px 0;}
#patch ins {background:#dfd;text-decoration:none;display:block;padding:0 10px;}
#patch del {background:#fdd;text-decoration:none;display:block;padding:0 10px;}
#patch .lines, .info {color:#888;background:#fff;}
--></style>
<div id="msg">
<dl class="meta" style="font-size: 105%">
<dt style="float: left; width: 6em; font-weight: bold">Revision</dt> <dd><a style="font-weight: bold" href="https://core.trac.wordpress.org/changeset/44131">44131</a><script type="application/ld+json">{"@context":"http://schema.org","@type":"EmailMessage","description":"Review this Commit","action":{"@type":"ViewAction","url":"https://core.trac.wordpress.org/changeset/44131","name":"Review Commit"}}</script></dd>
<dt style="float: left; width: 6em; font-weight: bold">Author</dt> <dd>pento</dd>
<dt style="float: left; width: 6em; font-weight: bold">Date</dt> <dd>2018-12-14 01:10:20 +0000 (Fri, 14 Dec 2018)</dd>
</dl>

<pre style='padding-left: 1em; margin: 2em 0; border-left: 2px solid #ccc; line-height: 1.25; font-size: 105%; font-family: sans-serif'>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 <a href="https://core.trac.wordpress.org/changeset/43778">[43778]</a> from the 5.0 branch to trunk.

See <a href="https://core.trac.wordpress.org/ticket/45112">#45112</a>.</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunksrcwpadminincludespostphp">trunk/src/wp-admin/includes/post.php</a></li>
</ul>

<h3>Property Changed</h3>
<ul>
<li><a href="#trunk">trunk/</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<span class="cx" style="display: block; padding: 0 10px">Index: trunk
</span><span class="cx" style="display: block; padding: 0 10px">===================================================================
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">--- trunk        2018-12-14 01:07:11 UTC (rev 44130)
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+++ trunk 2018-12-14 01:10:20 UTC (rev 44131)
</ins><a id="trunk"></a>
<div class="propset"><h4 style="background-color: #eee; color: inherit; margin: 1em 0; padding: 1.3em; font-size: 115%">Property changes: trunk</h4>
<pre class="diff"><span>
</span></pre></div>
<a id="svnmergeinfo"></a>
<div class="modfile"><h4 style="background-color: #eee; color: inherit; margin: 1em 0; padding: 1.3em; font-size: 115%">Modified: svn:mergeinfo</h4></div>
<span class="cx" style="display: block; padding: 0 10px"> /branches/3.3:20543
</span><span class="cx" style="display: block; padding: 0 10px"> /branches/3.4:21757
</span><span class="cx" style="display: block; padding: 0 10px"> /branches/4.9:43557,43622
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-/branches/5.0:43681-43682,43684-43688,43719-43720,43723,43726-43727,43729-43731,43734-43744,43751-43754,43758,43761-43765,43767-43770,43772,43774-43775,43777
</del><span class="cx" style="display: block; padding: 0 10px">\ No newline at end of property
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+/branches/5.0:43681-43682,43684-43688,43719-43720,43723,43726-43727,43729-43731,43734-43744,43751-43754,43758,43761-43765,43767-43770,43772,43774-43775,43777-43778
</ins><span class="cx" style="display: block; padding: 0 10px">\ No newline at end of property
</span><a id="trunksrcwpadminincludespostphp"></a>
<div class="modfile"><h4 style="background-color: #eee; color: inherit; margin: 1em 0; padding: 1.3em; font-size: 115%">Modified: trunk/src/wp-admin/includes/post.php</h4>
<pre class="diff"><span>
<span class="info" style="display: block; padding: 0 10px; color: #888">--- trunk/src/wp-admin/includes/post.php      2018-12-14 01:07:11 UTC (rev 44130)
+++ trunk/src/wp-admin/includes/post.php        2018-12-14 01:10:20 UTC (rev 44131)
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -2039,6 +2039,12 @@
</span><span class="cx" style="display: block; padding: 0 10px">                return false;
</span><span class="cx" style="display: block; padding: 0 10px">        }
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+        // 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;
+       }
+
</ins><span class="cx" style="display: block; padding: 0 10px">         $use_block_editor = use_block_editor_for_post_type( $post->post_type );
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">        /**
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -2166,3 +2172,138 @@
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">        return $blocks;
</span><span class="cx" style="display: block; padding: 0 10px"> }
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+
+/**
+ * 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.
+       ?>
+       <form class="metabox-base-form">
+       <?php the_block_editor_meta_box_post_form_hidden_fields( $post ); ?>
+       </form>
+       <?php foreach ( $locations as $location ) : ?>
+               <form class="metabox-location-<?php echo esc_attr( $location ); ?>">
+                       <div id="poststuff" class="sidebar-open">
+                               <div id="postbox-container-2" class="postbox-container">
+                                       <?php
+                                       do_meta_boxes(
+                                               $current_screen,
+                                               $location,
+                                               $post
+                                       );
+                                       ?>
+                               </div>
+                       </div>
+               </form>
+       <?php endforeach; ?>
+       <?php
+
+       $meta_boxes_per_location = array();
+       foreach ( $locations as $location ) {
+               $meta_boxes_per_location[ $location ] = array();
+
+               if ( ! isset( $wp_meta_boxes[ $current_screen->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 `<head>`, 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( "<script type='text/javascript'>\n%s\n</script>\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 .= "<input type='hidden' id='auto_draft' name='auto_draft' value='1' />";
+       }
+       $form_action  = 'editpost';
+       $nonce_action = 'update-post_' . $post->ID;
+       $form_extra  .= "<input type='hidden' id='post_ID' name='post_ID' value='" . esc_attr( $post->ID ) . "' />";
+       $referer      = wp_get_referer();
+       $current_user = wp_get_current_user();
+       $user_id      = $current_user->ID;
+       wp_nonce_field( $nonce_action );
+       ?>
+       <input type="hidden" id="user-id" name="user_ID" value="<?php echo (int) $user_id; ?>" />
+       <input type="hidden" id="hiddenaction" name="action" value="<?php echo esc_attr( $form_action ); ?>" />
+       <input type="hidden" id="originalaction" name="originalaction" value="<?php echo esc_attr( $form_action ); ?>" />
+       <input type="hidden" id="post_type" name="post_type" value="<?php echo esc_attr( $post->post_type ); ?>" />
+       <input type="hidden" id="original_post_status" name="original_post_status" value="<?php echo esc_attr( $post->post_status ); ?>" />
+       <input type="hidden" id="referredby" name="referredby" value="<?php echo $referer ? esc_url( $referer ) : ''; ?>" />
+
+       <?php
+       if ( 'draft' !== get_post_status( $post ) ) {
+               wp_original_referer_field( true, 'previous' );
+       }
+       echo $form_extra;
+       wp_nonce_field( 'meta-box-order', 'meta-box-order-nonce', false );
+       wp_nonce_field( 'closedpostboxes', 'closedpostboxesnonce', false );
+       // Permalink title nonce.
+       wp_nonce_field( 'samplepermalink', 'samplepermalinknonce', false );
+}
</ins></span></pre>
</div>
</div>

</body>
</html>