如何挂钩到“REST_FIELD”来修改自定义字段的行为?

时间:2021-10-18 作者:grazianodev

假设在一个插件中(我们称之为插件A),我注册了一个country 通过Wordpress REST API查询用户的请求的自定义字段:

register_rest_field( "user", "country", [
   "get_callback" => array( $this, "get_country" ),
   "update_callback" => array( $this, "set_country" ),
   "schema" => [
      "type" => "string",
      "description" => "The user\'s country",
      "arg_options" => [
         "sanitize_callback" => function( $value ) {
            return sanitize_text_field( $value );
         },
         "validate_callback" => function( $value ) {
            return is_string( $value );
         }
      ]
   ]
]);
我发现我可以通过添加"required" => trueschema 数组,但如果我只想在某个插件(我们称之为插件B)处于活动状态时使该字段成为必需字段,该怎么办?

如果插件B处于活动状态,我可以签入插件A,但我宁愿在插件B中使用一些挂钩,因为它更干净,更经得起未来的考验。有没有什么办法register_rest_field 并修改REST API字段的行为,或其他具有相同效果的操作?

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

我认为最简单的解决方案是为此使用自定义过滤器。它可能看起来像:

$schema = apply_filters(\'pluginA/register/country\', [
    "type" => "string",
    "description" => "The user\'s country",
    "arg_options" => [
        "sanitize_callback" => function( $value ) {
            return sanitize_text_field( $value );
        },
        "validate_callback" => function( $value ) {
            return is_string( $value );
        },
    ]
]);
register_rest_field( "user", "country", [
    "get_callback" => array( $this, "get_country" ),
    "update_callback" => array( $this, "set_country" ),
    "schema" => $schema,
]);
现在,在您的另一个插件中,您只需添加一个过滤器并添加所需的标志:

add_filter(\'pluginA/register/country\', function(array $schema): array {
    $schema[\'required\'] = true;
    return $schema;
});
当然,过滤器的名称可以自由选择,使用某种供应商前缀可能是有意义的,因此它不会与其他人定义的过滤器冲突。