如何在WordPress 4.7+中使用REST-API进行元查询?

时间:2017-06-30 作者:Tchernitchenko

我试图通过元查询进行过滤,但无论我尝试什么,我都无法使其工作。

基本上,我希望通过rest API进行此查询:

wp-json/wp/v2/books?meta_query[relation]=OR&meta_query[0][key]=arkivera&meta_query[0][value]=1&meta_query[0][compare]==
我尝试了几个不同的自定义字段,但它总是返回所有post对象。

在我的函数文件中,我添加了:

function api_allow_meta_query( $valid_vars ) {

  $valid_vars = array_merge( $valid_vars, array( \'meta_query\') );
  return $valid_vars;
}
add_filter( \'rest_query_vars\', \'api_allow_meta_query\' );
我试图完成一些关于这方面的文档,但做不到,而且大多数类似的问题都不是针对wordpress 4.7的,因为过滤器[xxx]被删除了。

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

如果需要,可以为自定义查询编写自己的REST处理程序。在您的情况下,可以通过以下方式进行查询:

// Register a REST route
add_action( \'rest_api_init\', function () {
    //Path to meta query route
    register_rest_route( \'tchernitchenko/v2\', \'/my_meta_query/\', array(
            \'methods\' => \'GET\', 
            \'callback\' => \'custom_meta_query\' 
    ) );
});

// Do the actual query and return the data
function custom_meta_query(){
    if(isset($_GET[\'meta_query\'])) {
        $query = $_GET[\'meta_query\'];
        // Set the arguments based on our get parameters
        $args = array (
            \'relation\' => $query[0][\'relation\'],
            array(
                \'key\' => $query[0][\'key\'],
                \'value\' => $query[0][\'value\'],
                \'compare\' => \'=\',
            ),
        );
        // Run a custom query
        $meta_query = new WP_Query($args);
        if($meta_query->have_posts()) {
            //Define and empty array
            $data = array();
            // Store each post\'s title in the array
            while($meta_query->have_posts()) {
                $meta_query->the_post();
                $data[] =  get_the_title();
            }
            // Return the data
            return $data;
        } else {
            // If there is no post
            return \'No post to show\';
        }
    }
}
现在,您只需访问:

wp-json/tchernitchenko/v2/my_meta_query?meta_query[relation]=OR&meta_query[0][key]=arkivera&meta_query[0][value]=1&meta_query[0][compare]==

SO网友:maheshwaghmare

使用筛选器rest_{CUSTOM_POST_TYPE}_query在WP-restapi中为任何post类型添加post-meta支持。

检查要点search post by post meta with rest API.

How to use?

http://example.org/wp-json/wp/v2/post?meta_key=<my_meta_key>&meta_value=<my_meta_value>

Example

获取发布meta的帖子already-visited 值为true.

http://example.org/wp-json/wp/v2/post?meta_key=already-visited&meta_value=true

它只列出发布元键的帖子already-visited 有价值true.

供参考Search post by post meta with rest api.

Available Filters

  • rest\\u post\\u查询

SO网友:Jack Song

下面的代码应该为所有帖子类型添加多个元查询功能。它支持CPT(自定义帖子类型)和ACF(高级自定义字段)。源代码也可在Github.

将其添加到函数中。php

add_action( \'rest_api_init\', \'wp_rest_filter_add_filters\' );
 /**
  * Add the necessary filter to each post type
  **/
function wp_rest_filter_add_filters() {
    foreach ( get_post_types( array( \'show_in_rest\' => true ), \'objects\' ) as $post_type ) {
        add_filter( \'rest_\' . $post_type->name . \'_query\', \'wp_rest_filter_add_filter_param\', 10, 2 );
    }
}
/**
 * Add the filter parameter
 *
 * @param  array           $args    The query arguments.
 * @param  WP_REST_Request $request Full details about the request.
 * @return array $args.
 **/
function wp_rest_filter_add_filter_param( $args, $request ) {
    // Bail out if no filter parameter is set.
    if ( empty( $request[\'filter\'] ) || ! is_array( $request[\'filter\'] ) ) {
        return $args;
    }
    $filter = $request[\'filter\'];
    if ( isset( $filter[\'posts_per_page\'] ) && ( (int) $filter[\'posts_per_page\'] >= 1 && (int) $filter[\'posts_per_page\'] <= 100 ) ) {
        $args[\'posts_per_page\'] = $filter[\'posts_per_page\'];
    }
    global $wp;
    $vars = apply_filters( \'rest_query_vars\', $wp->public_query_vars );
    function allow_meta_query( $valid_vars )
    {
        $valid_vars = array_merge( $valid_vars, array( \'meta_query\', \'meta_key\', \'meta_value\', \'meta_compare\' ) );
        return $valid_vars;
    }
    $vars = allow_meta_query( $vars );

    foreach ( $vars as $var ) {
        if ( isset( $filter[ $var ] ) ) {
            $args[ $var ] = $filter[ $var ];
        }
    }
    return $args;
}
依我看,更好的方法是将附加功能作为一个单独的插件。所以,即使用户更改了主题,您的api调用也不会受到影响。

因此我开发了plugin 用于WordPress中的元查询。更好的是,它也支持ACF!

WP REST Filter

安装后,只需执行GET 请求采用以下格式。

https://domain.com/wp-json/acf/v3/customposttype?filter[meta_key]=acfkey&filter[meta_value]=acfvalue
从中查看插件源代码Github.

结束

相关推荐

Php致命错误:无法将WP_REST_RESPONSE类型的对象用作wp-includes/rest-api/endpoints/class-wp-rest-posts-controller.php中

我向WordPress添加了一个自定义端点,如下所示: add_action( \'rest_api_init\', function () { register_rest_route( \'menc/v1\', \'/crosscat/(?P[\\w-]+)/(?P[\\w-]+)\', array( \'methods\' => \'GET\', \'callback\' => \'dept_cat_api\',&#x