REST API和按元值过滤

时间:2019-09-05 作者:Dave McCourt

我有一个posttype“timeslip”,我使用以下API端点调用它:

/wp-json/wp/v2/timeslip?meta_key=user_id&meta_value=1
我已将自定义字段user\\u id公开给API元,并可以在响应中看到它。

add_filter(\'rest_timeslip_query\', array($this, \'timeslip_meta_request_params\'));

 public function register_meta_api() {

    // Meta Fields that should be added to the API 
    $timeslip_meta_fields = array(
        \'user_id\',
        \'total_time\',
        \'start_time\',
        \'end_time\',
    );

    // Meta
    foreach ($timeslip_meta_fields as $field) {
        register_rest_field(\'timeslip\',
            $field,
            array(
                \'get_callback\'    =>  array($this, \'get_meta\'),
                \'update_callback\' => array($this, \'update_meta\'),
                \'schema\'          =>  null,
            )
        );
    }

}

public function get_meta($object, $field_name) {

    return get_post_meta($object[\'id\'], $field_name);

}
但是,未过滤任何内容。

public function timeslip_meta_request_params($args, $request) {

    $args[\'meta_key\'] = $request[\'timeslip_user_id\'];
    $args[\'meta_value\'] = intval($request[\'timeslip_user_id\']);

    $valid_vars = array_merge( $args, array( \'meta_key\', \'meta_value\' ) );
    return $valid_vars;


    // $args[\'meta_key\'] = \'user_id\';
    // $args[\'meta_value\'] = 1;

    return $args;

}
如果我手动设置$args,那么它会起作用,所以我猜没有传入某些内容。

环顾四周,文档似乎发生了很大的变化,很难找到正确的方法来做到这一点。

非常感谢您的帮助!

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

在中添加第三个参数get_post_meta() 功能为true, 这将返回当前post meta的单个值,若您不设置它,它将返回一个值数组。

现在的情况是,在内部,查询试图将meta\\u值与数组进行比较,而不是与字符串或整数进行比较,这就是为什么您没有得到任何结果。

此外,如果您输入以下内容,则请求的数据应与当前端点中指示的查询参数同名:

/wp-json/wp/v2/timeslip?meta_key=user_id&meta_value=1

然后通过以下方式访问请求数据:

$request[\'meta_key\'];
$request[\'meta_value\'];
您最初将请求的数据设置为:

$request[\'timeslip_user_id\'];
$request[\'timeslip_user_id\'];
因此,您的查询筛选函数应该如下所示:

function timeslip_meta_request_params( $args, $request ) {
    $args[\'meta_key\']   = $request[\'meta_key\'];
    $args[\'meta_value\'] = $request[\'meta_value\'];

    return $args;
}
我刚刚在本地环境中测试了代码,请检查user_id 字段是字符串。希望if适合您:

enter image description here

SO网友:Everaldo Matias

在我的例子中,我必须用get_query_params() 方法,我使用了meta_query 要设置值,请如下所示:

function timeslip_meta_request_params( $args, $request ) {

    $query_params = $request->get_query_params();

    if ( isset( $query_params[\'meta_key\'] ) && isset( $query_params[\'meta_value\'] ) ) {
        $args[\'meta_query\'] = array(
            [
                \'key\'   => sanitize_text_field( $query_params[\'meta_key\'] ),
                \'value\' => sanitize_text_field( $query_params[\'meta_value\'] )
            ]
        );
    }

    return $args;
}

相关推荐

REST API中的自定义POST类型注释的端点是什么?

在我的react项目中,我使用worpdress作为后端,需要使用我的自定义帖子类型events 还有评论。因此,根据WordPress comments API文档,我正在使用这样的端点”/wp/wp-json/wp/v2/comments?events=704”; 因此,根据这一点,它应该只显示704条post ID注释。但在我的情况下,它会返回我在post_type = post 而且请参见下面的自定义post类型的上述API端点的JSON结果。这是一个\'post_type\' => pos