REST API中的序列化设置

时间:2020-03-07 作者:Tomáš Vavřinka

我已经注册了设置,需要在REST API中显示。

$args = [
    \'show_in_rest\' => true
];
register_setting(\'default_sidebars\', \'default_sidebars\', $args);
当我保存单个值,然后请求端点上的数据时/wp-json/wp/v2/settings, 一切都很完美。

但问题是我这样保存序列化数据。

a:2:{s:4:"post";s:7:"general";s:4:"blog";s:9:"sidebar_1";}
现在我希望得到这样的回应:

default_sidebars: {
  post: "general",
  blog: "sidebar_1"
}
但是我得到了default_sidebars: null.

如何在REST API中获取数据?

2 个回复
最合适的回答,由SO网友:birgire 整理而成

如果显式注册object JSON schema 作为:

$args = array(
    \'show_in_rest\' => array(
        \'schema\' => array(
            \'type\'       => \'object\',
            \'properties\' => array(
                \'post\' => array(
                    \'type\' => \'string\',
                ),
                \'blog\' => array(
                    \'type\' => \'string\',
                ),
            )
        ),
    ),
);

register_setting( \'default_sidebars\', \'default_sidebars\', $args );
导致以下对象:

default_sidebars: {
  post: "general",
  blog: "sidebar_1"
}
在中/wp-json/wp/v2/settings 对于序列化选项数据:

a:2:{s:4:"post";s:7:"general";s:4:"blog";s:9:"sidebar_1";}
请参见类似对象架构支持register_meta() 在5.3中:

https://make.wordpress.org/core/2019/10/03/wp-5-3-supports-object-and-array-meta-types-in-the-rest-api/

SO网友:Sally CJ

不确定是否有better 使用默认设置端点时的方式,但这对我适用

您可以使用rest_pre_get_setting hook 要将数据转换为JSON编码的字符串,请执行以下操作:

add_filter( \'rest_pre_get_setting\', function ( $value, $name ) {
    if ( \'default_sidebars\' === $name ) {
        $value = json_encode( get_option( $name ) );
    }
    return $value;
}, 10, 2 );
然后,例如在JavaScript中,可以使用JSON.parse():

// Note: I intentionally omitted the authentication/nonce part.
fetch( \'https://example.com/wp-json/wp/v2/settings\' )
    .then( res => res.json() )
    .then( settings => console.log( JSON.parse( settings.default_sidebars ) ) );
或者在PHP中(例如,您使用PHP从另一个站点发出API请求),您可以执行以下操作:

$settings = json_decode( $data ); // assume data is the REST API response body
$default_sidebars = json_decode( $settings->default_sidebars );

附加注释null 价值是因为get_option() 将数据取消序列化为数组,设置端点的REST API控制器正在使用rest_validate_value_from_schema() 验证选项值(即在取消序列化后),当它不是当前支持的类型(字符串、布尔值、整数和数字)时—看见register_setting(), 然后,函数返回一个错误,设置端点/控制器返回一个null 对于该特定选项。

备选解决方案create a custom REST API endpoint 在下面的示例中,您可以请求/wp-json/myplugin/v1/setting/<option name> 哪里<option name> 可能是default_sidebars 在您的情况下:

add_action( \'rest_api_init\', function () {
    register_rest_route( \'myplugin/v1\', \'/setting/(?P<name>[a-zA-Z0-9\\-_]+)\', [
        \'methods\'  => \'GET\',
        \'callback\' => function ( $request ) {
            return get_option( $request->get_param( \'name\' ) );
        },
        \'permission_callback\' => function () {
            return current_user_can( \'manage_options\' ); // you should keep this
        },
    ] );
} );