web-dev-qa-db-ja.com

WordPress 4.7以降でREST-APIを使用してメタクエリを行う方法は?

私はメタクエリでフィルタリングしようとしていますが、何をしようとしてもそれを機能させることはできません。

基本的に、私は残りのAPIを通してこのクエリが欲しいです:

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

Iveはいくつかの異なるカスタムフィールドを試しましたが、常にすべての投稿オブジェクトを返します。

私が追加した私の機能ファイルに:

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' );

私はこれに関する文書をいくつか書き終えようとしましたが、できませんでした。同様の質問のほとんどは、filter [xxx]が削除されているためwordpress 4.7には当てはまりません。

6
Tchernitchenko

必要に応じて、カスタムクエリ用に独自の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]==
5
Jack Johansson

次のコードは、すべての投稿タイプに複数のメタクエリー機能を追加する必要があります。 CPT(カスタム投稿タイプ)とACF(高度カスタムフィールド)をサポートしています。ソースコードは Github でも入手可能です。

あなたのfunction.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呼び出しは影響を受けません。

そのため、WordPressのメタクエリ用に plugin を開発しました。いっそのこと、それもACFをサポートしています!

WP RESTフィルタ

インストール後、 _ get _ リクエストを次の形式で実行してください。

https://domain.com/wp-json/acf/v3/customposttype?filter[meta_key]=acfkey&filter[meta_value]=acfvalue

Github からプラグインのソースコードをチェックしてください。

3
Jack Song

WP Rest APIに投稿メタサポートを追加するには、filter rest_ {CUSTOM_POST_TYPE} _query を使用します。

Gist restを使ってpost metaで投稿を検索してください

使い方は?

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

メタalready-visited値がtrueである投稿を取得します。

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

メタキーalready-visitedに値trueがある投稿のみを一覧表示します。

参考のために rest apiを使ってpost metaで投稿を検索してください

利用可能なフィルタ

  • rest_post_query
  • rest_page_query
  • rest_attachment_query
2
maheshwaghmare