<!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>[59023] trunk: Meta: Add label argument to register_meta function</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/59023">59023</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/59023","name":"Review Commit"}}</script></dd>
<dt style="float: left; width: 6em; font-weight: bold">Author</dt> <dd>gziolo</dd>
<dt style="float: left; width: 6em; font-weight: bold">Date</dt> <dd>2024-09-16 11:31:17 +0000 (Mon, 16 Sep 2024)</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'>Meta: Add label argument to register_meta function

With the introduction of Block Bindings, it became more common to see workflows where users need to see the custom fields that are available or connected. They were relying on the meta key, however it feelt too technical sometimes. The solution is adding a new label argument to include a human-readable name that can be used across the UI.

Props santosguillamot, mamaduka, gziolo, timothyblynjacobs, peterwilsoncc.
Fixes <a href="https://core.trac.wordpress.org/ticket/61998">#61998</a>.</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunksrcwpincludesmetaphp">trunk/src/wp-includes/meta.php</a></li>
<li><a href="#trunksrcwpincludesrestapifieldsclasswprestmetafieldsphp">trunk/src/wp-includes/rest-api/fields/class-wp-rest-meta-fields.php</a></li>
<li><a href="#trunktestsphpunittestsmetaregisterMetaphp">trunk/tests/phpunit/tests/meta/registerMeta.php</a></li>
<li><a href="#trunktestsphpunittestsrestapirestpostmetafieldsphp">trunk/tests/phpunit/tests/rest-api/rest-post-meta-fields.php</a></li>
<li><a href="#trunktestsphpunittestsuserwpRegisterPersistedPreferencesMetaphp">trunk/tests/phpunit/tests/user/wpRegisterPersistedPreferencesMeta.php</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunksrcwpincludesmetaphp"></a>
<div class="modfile"><h4 style="background-color: #eee; color: inherit; margin: 1em 0; padding: 1.3em; font-size: 115%">Modified: trunk/src/wp-includes/meta.php</h4>
<pre class="diff"><span>
<span class="info" style="display: block; padding: 0 10px; color: #888">--- trunk/src/wp-includes/meta.php    2024-09-15 13:47:36 UTC (rev 59022)
+++ trunk/src/wp-includes/meta.php      2024-09-16 11:31:17 UTC (rev 59023)
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -1369,6 +1369,7 @@
</span><span class="cx" style="display: block; padding: 0 10px">  * @since 5.3.0 Valid meta types expanded to include "array" and "object".
</span><span class="cx" style="display: block; padding: 0 10px">  * @since 5.5.0 The `$default` argument was added to the arguments array.
</span><span class="cx" style="display: block; padding: 0 10px">  * @since 6.4.0 The `$revisions_enabled` argument was added to the arguments array.
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ * @since 6.7.0 The `label` argument was added to the arguments array.
</ins><span class="cx" style="display: block; padding: 0 10px">  *
</span><span class="cx" style="display: block; padding: 0 10px">  * @param string       $object_type Type of object metadata is for. Accepts 'post', 'comment', 'term', 'user',
</span><span class="cx" style="display: block; padding: 0 10px">  *                                  or any other object type with an associated meta table.
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -1380,6 +1381,7 @@
</span><span class="cx" style="display: block; padding: 0 10px">  *                                         the meta key will be registered on the entire object type. Default empty.
</span><span class="cx" style="display: block; padding: 0 10px">  *     @type string     $type              The type of data associated with this meta key.
</span><span class="cx" style="display: block; padding: 0 10px">  *                                         Valid values are 'string', 'boolean', 'integer', 'number', 'array', and 'object'.
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ *     @type string     $label             A human-readable label of the data attached to this meta key.
</ins><span class="cx" style="display: block; padding: 0 10px">  *     @type string     $description       A description of the data attached to this meta key.
</span><span class="cx" style="display: block; padding: 0 10px">  *     @type bool       $single            Whether the meta key has one value per object, or an array of values per object.
</span><span class="cx" style="display: block; padding: 0 10px">  *     @type mixed      $default           The default value returned from get_metadata() if no value has been set yet.
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -1412,6 +1414,7 @@
</span><span class="cx" style="display: block; padding: 0 10px">        $defaults = array(
</span><span class="cx" style="display: block; padding: 0 10px">                'object_subtype'    => '',
</span><span class="cx" style="display: block; padding: 0 10px">                'type'              => 'string',
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+                'label'             => '',
</ins><span class="cx" style="display: block; padding: 0 10px">                 'description'       => '',
</span><span class="cx" style="display: block; padding: 0 10px">                'default'           => '',
</span><span class="cx" style="display: block; padding: 0 10px">                'single'            => false,
</span></span></pre></div>
<a id="trunksrcwpincludesrestapifieldsclasswprestmetafieldsphp"></a>
<div class="modfile"><h4 style="background-color: #eee; color: inherit; margin: 1em 0; padding: 1.3em; font-size: 115%">Modified: trunk/src/wp-includes/rest-api/fields/class-wp-rest-meta-fields.php</h4>
<pre class="diff"><span>
<span class="info" style="display: block; padding: 0 10px; color: #888">--- trunk/src/wp-includes/rest-api/fields/class-wp-rest-meta-fields.php       2024-09-15 13:47:36 UTC (rev 59022)
+++ trunk/src/wp-includes/rest-api/fields/class-wp-rest-meta-fields.php 2024-09-16 11:31:17 UTC (rev 59023)
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -478,6 +478,7 @@
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">                        $default_schema = array(
</span><span class="cx" style="display: block; padding: 0 10px">                                'type'        => $default_args['type'],
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+                                'title'       => empty( $args['label'] ) ? '' : $args['label'],
</ins><span class="cx" style="display: block; padding: 0 10px">                                 'description' => empty( $args['description'] ) ? '' : $args['description'],
</span><span class="cx" style="display: block; padding: 0 10px">                                'default'     => isset( $args['default'] ) ? $args['default'] : null,
</span><span class="cx" style="display: block; padding: 0 10px">                        );
</span></span></pre></div>
<a id="trunktestsphpunittestsmetaregisterMetaphp"></a>
<div class="modfile"><h4 style="background-color: #eee; color: inherit; margin: 1em 0; padding: 1.3em; font-size: 115%">Modified: trunk/tests/phpunit/tests/meta/registerMeta.php</h4>
<pre class="diff"><span>
<span class="info" style="display: block; padding: 0 10px; color: #888">--- trunk/tests/phpunit/tests/meta/registerMeta.php   2024-09-15 13:47:36 UTC (rev 59022)
+++ trunk/tests/phpunit/tests/meta/registerMeta.php     2024-09-16 11:31:17 UTC (rev 59023)
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -92,6 +92,7 @@
</span><span class="cx" style="display: block; padding: 0 10px">                                '' => array(
</span><span class="cx" style="display: block; padding: 0 10px">                                        'flight_number' => array(
</span><span class="cx" style="display: block; padding: 0 10px">                                                'type'              => 'string',
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+                                                'label'             => '',
</ins><span class="cx" style="display: block; padding: 0 10px">                                                 'description'       => '',
</span><span class="cx" style="display: block; padding: 0 10px">                                                'single'            => false,
</span><span class="cx" style="display: block; padding: 0 10px">                                                'sanitize_callback' => null,
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -117,6 +118,7 @@
</span><span class="cx" style="display: block; padding: 0 10px">                                '' => array(
</span><span class="cx" style="display: block; padding: 0 10px">                                        'category_icon' => array(
</span><span class="cx" style="display: block; padding: 0 10px">                                                'type'              => 'string',
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+                                                'label'             => '',
</ins><span class="cx" style="display: block; padding: 0 10px">                                                 'description'       => '',
</span><span class="cx" style="display: block; padding: 0 10px">                                                'single'            => false,
</span><span class="cx" style="display: block; padding: 0 10px">                                                'sanitize_callback' => null,
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -172,6 +174,7 @@
</span><span class="cx" style="display: block; padding: 0 10px">                                '' => array(
</span><span class="cx" style="display: block; padding: 0 10px">                                        'flight_number' => array(
</span><span class="cx" style="display: block; padding: 0 10px">                                                'type'              => 'string',
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+                                                'label'             => '',
</ins><span class="cx" style="display: block; padding: 0 10px">                                                 'description'       => '',
</span><span class="cx" style="display: block; padding: 0 10px">                                                'single'            => false,
</span><span class="cx" style="display: block; padding: 0 10px">                                                'sanitize_callback' => array( $this, '_new_sanitize_meta_cb' ),
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -256,6 +259,19 @@
</span><span class="cx" style="display: block; padding: 0 10px">                $this->assertEmpty( $meta_keys );
</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">+        /**
+        * @ticket 61998
+        */
+       public function test_get_registered_meta_keys_label_arg() {
+               register_meta( 'post', 'registered_key1', array( 'label' => 'Field label' ) );
+
+               $meta_keys = get_registered_meta_keys( 'post' );
+
+               unregister_meta_key( 'post', 'registered_key1' );
+
+               $this->assertSame( 'Field label', $meta_keys['registered_key1']['label'] );
+       }
+
</ins><span class="cx" style="display: block; padding: 0 10px">         public function test_get_registered_meta_keys_description_arg() {
</span><span class="cx" style="display: block; padding: 0 10px">                register_meta( 'post', 'registered_key1', array( 'description' => 'I\'m just a field, take a good look at me' ) );
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -340,6 +356,7 @@
</span><span class="cx" style="display: block; padding: 0 10px">                                $subtype => array(
</span><span class="cx" style="display: block; padding: 0 10px">                                        'flight_number' => array(
</span><span class="cx" style="display: block; padding: 0 10px">                                                'type'              => 'string',
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+                                                'label'             => '',
</ins><span class="cx" style="display: block; padding: 0 10px">                                                 'description'       => '',
</span><span class="cx" style="display: block; padding: 0 10px">                                                'single'            => false,
</span><span class="cx" style="display: block; padding: 0 10px">                                                'sanitize_callback' => null,
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -394,6 +411,7 @@
</span><span class="cx" style="display: block; padding: 0 10px">                                $subtype => array(
</span><span class="cx" style="display: block; padding: 0 10px">                                        'flight_number' => array(
</span><span class="cx" style="display: block; padding: 0 10px">                                                'type'              => 'string',
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+                                                'label'             => '',
</ins><span class="cx" style="display: block; padding: 0 10px">                                                 'description'       => '',
</span><span class="cx" style="display: block; padding: 0 10px">                                                'single'            => false,
</span><span class="cx" style="display: block; padding: 0 10px">                                                'sanitize_callback' => null,
</span></span></pre></div>
<a id="trunktestsphpunittestsrestapirestpostmetafieldsphp"></a>
<div class="modfile"><h4 style="background-color: #eee; color: inherit; margin: 1em 0; padding: 1.3em; font-size: 115%">Modified: trunk/tests/phpunit/tests/rest-api/rest-post-meta-fields.php</h4>
<pre class="diff"><span>
<span class="info" style="display: block; padding: 0 10px; color: #888">--- trunk/tests/phpunit/tests/rest-api/rest-post-meta-fields.php      2024-09-15 13:47:36 UTC (rev 59022)
+++ trunk/tests/phpunit/tests/rest-api/rest-post-meta-fields.php        2024-09-16 11:31:17 UTC (rev 59023)
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -243,6 +243,18 @@
</span><span class="cx" style="display: block; padding: 0 10px">                        )
</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">+                register_post_meta(
+                       'post',
+                       'with_label',
+                       array(
+                               'type'         => 'string',
+                               'single'       => true,
+                               'show_in_rest' => true,
+                               'label'        => 'Meta Label',
+                               'default'      => '',
+                       )
+               );
+
</ins><span class="cx" style="display: block; padding: 0 10px">                 /** @var WP_REST_Server $wp_rest_server */
</span><span class="cx" style="display: block; padding: 0 10px">                global $wp_rest_server;
</span><span class="cx" style="display: block; padding: 0 10px">                $wp_rest_server = new Spy_REST_Server();
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -3091,11 +3103,24 @@
</span><span class="cx" style="display: block; padding: 0 10px">                $response = rest_do_request( $request );
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">                $schema = $response->get_data()['schema']['properties']['meta']['properties']['with_default'];
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                $this->assertArrayHasKey( 'default', $schema );
-               $this->assertSame( 'Goodnight Moon', $schema['default'] );
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+         $this->assertArrayHasKey( 'default', $schema, 'Schema is expected to have the default property' );
+               $this->assertSame( 'Goodnight Moon', $schema['default'], 'Schema default is expected to be defined and contain the value of the meta default argument.' );
</ins><span class="cx" style="display: block; padding: 0 10px">         }
</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">+         * @ticket 61998
+        */
+       public function test_title_is_added_to_schema() {
+               $request  = new WP_REST_Request( 'OPTIONS', '/wp/v2/posts' );
+               $response = rest_do_request( $request );
+
+               $schema = $response->get_data()['schema']['properties']['meta']['properties']['with_label'];
+
+               $this->assertArrayHasKey( 'title', $schema, 'Schema is expected to have the title property' );
+               $this->assertSame( 'Meta Label', $schema['title'], 'Schema title is expected to be defined and contain the value of the meta label argument.' );
+       }
+
+       /**
</ins><span class="cx" style="display: block; padding: 0 10px">          * Ensures that REST API calls with post meta containing the default value for the
</span><span class="cx" style="display: block; padding: 0 10px">         * registered meta field stores the default value into the database.
</span><span class="cx" style="display: block; padding: 0 10px">         *
</span></span></pre></div>
<a id="trunktestsphpunittestsuserwpRegisterPersistedPreferencesMetaphp"></a>
<div class="modfile"><h4 style="background-color: #eee; color: inherit; margin: 1em 0; padding: 1.3em; font-size: 115%">Modified: trunk/tests/phpunit/tests/user/wpRegisterPersistedPreferencesMeta.php</h4>
<pre class="diff"><span>
<span class="info" style="display: block; padding: 0 10px; color: #888">--- trunk/tests/phpunit/tests/user/wpRegisterPersistedPreferencesMeta.php     2024-09-15 13:47:36 UTC (rev 59022)
+++ trunk/tests/phpunit/tests/user/wpRegisterPersistedPreferencesMeta.php       2024-09-16 11:31:17 UTC (rev 59023)
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -31,6 +31,7 @@
</span><span class="cx" style="display: block; padding: 0 10px">                $this->assertSame(
</span><span class="cx" style="display: block; padding: 0 10px">                        array(
</span><span class="cx" style="display: block; padding: 0 10px">                                'type'              => 'object',
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+                                'label'             => '',
</ins><span class="cx" style="display: block; padding: 0 10px">                                 'description'       => '',
</span><span class="cx" style="display: block; padding: 0 10px">                                'single'            => true,
</span><span class="cx" style="display: block; padding: 0 10px">                                'sanitize_callback' => null,
</span></span></pre>
</div>
</div>

</body>
</html>