web-dev-qa-db-ja.com

APIを使用してsub値で投稿をクエリする方法

私が初めてRESTで作業するのはこれが初めてで、メタキーで投稿するのが困難です。 register_metaを使用して必要なメタキーを追加し、/wp-json/wp/v2/productsに対してリクエストを実行すると、出力に私のカスタムフィールドが含まれます。

これらの値で投稿を取得するために?slug={some slug}または?id={some id}を追加できることはわかっています。これはテストではうまく機能します。しかし、カスタムフィールドは「メタ」リストの下のJSONデータにネストされているため、カスタムフィールドの解析方法を理解することはできません。

無駄に約1時間グーグルを回った後、私はちょうど私がしなければならなかったことを推測し始めました。私は?brand_name=test?meta[brand_name]=test、および?[meta]brand_name=testのような多くのことを試しましたが、それらのどれも何もしないようです。

明らかなものが欠けていると思います。私は本当に助けてくれてありがとう。私のJSONデータの例は以下の通りです。

[
   {  
      "id":5,
      "date":"2017-05-04T10:36:10",
      "date_gmt":"2017-05-04T15:36:10",
      "guid":{  
         "rendered":"http:\/\/products.example.localhost\/?post_type=product&p=5"
      },
      "modified":"2017-05-09T13:41:12",
      "modified_gmt":"2017-05-09T18:41:12",
      "slug":"12545xa573",
      "status":"publish",
      "type":"product",
      "link":"http:\/\/products.example.localhost\/products\/12545xa573\/",
      "title":{  
         "rendered":"12545XA573"
      },
      "excerpt":{  
         "rendered":"",
         "protected":false
      },
      "author":1,
      "featured_media":32,
      "comment_status":"open",
      "ping_status":"open",
      "template":"",
      "format":"standard",
      "meta":{  
         "brand_name":"test",
         "sku":"12545XA573",
         "unit_of_measure":"FT, 1\/8, 1\/16",
         "length":"3.20 in"
      },
      "_links":{  
         "self":[  
            {  
               "href":"http:\/\/products.example.localhost\/wp-json\/wp\/v2\/products\/5"
            }
         ],
         "collection":[  
            {  
               "href":"http:\/\/products.example.localhost\/wp-json\/wp\/v2\/products"
            }
         ],
         "about":[  
            {  
               "href":"http:\/\/products.example.localhost\/wp-json\/wp\/v2\/types\/product"
            }
         ],
         "author":[  
            {  
               "embeddable":true,
               "href":"http:\/\/products.example.localhost\/wp-json\/wp\/v2\/users\/1"
            }
         ],
         "replies":[  
            {  
               "embeddable":true,
               "href":"http:\/\/products.example.localhost\/wp-json\/wp\/v2\/comments?post=5"
            }
         ],
         "version-history":[  
            {  
               "href":"http:\/\/products.example.localhost\/wp-json\/wp\/v2\/products\/5\/revisions"
            }
         ],
         "wp:featuredmedia":[  
            {  
               "embeddable":true,
               "href":"http:\/\/products.example.localhost\/wp-json\/wp\/v2\/media\/32"
            }
         ],
         "wp:attachment":[  
            {  
               "href":"http:\/\/products.example.localhost\/wp-json\/wp\/v2\/media?parent=5"
            }
         ],
         "curies":[  
            {  
               "name":"wp",
               "href":"https:\/\/api.w.org\/{rel}",
               "templated":true
            }
         ]
      }
   }
]
1
JacobTheDev

メタキーで投稿にアクセスするには、[rest_query_vary filter]にフックする必要があります。 1 私があなたの質問を読んだときに考えていた例は です。記事と同じもの@ WebElaine がコメントしました。以下に追加しただけです。

function my_allow_meta_query( $valid_vars ) {

    $valid_vars = array_merge( $valid_vars, array( 'meta_key', 'meta_value' ) );
    return $valid_vars;
}
add_filter( 'rest_query_vars', 'my_allow_meta_query' );

そのように呼び出します:wp-json/wp/v2/posts?filter[meta_key]=MY-KEY&filter[meta_value]=MY-VALUE


このフィルタは WP_REST_Posts_Controller::prepare_items_query の一部として適用されます。

protected function prepare_items_query( $prepared_args = array(), $request = null ) {
    $query_args = array();

    foreach ( $prepared_args as $key => $value ) {
        /**
         * Filters the query_vars used in get_items() for the constructed query.
         *
         * The dynamic portion of the hook name, `$key`, refers to the query_var key.
         *
         * @since 4.7.0
         *
         * @param string $value The query_var value.
         */
        $query_args[ $key ] = apply_filters( "rest_query_var-{$key}", $value );
    }

    if ( 'post' !== $this->post_type || ! isset( $query_args['ignore_sticky_posts'] ) ) {
        $query_args['ignore_sticky_posts'] = true;
    }

    // Map to proper WP_Query orderby param.
    if ( isset( $query_args['orderby'] ) && isset( $request['orderby'] ) ) {
        $orderby_mappings = array(
            'id'      => 'ID',
            'include' => 'post__in',
            'slug'    => 'post_name',
        );

        if ( isset( $orderby_mappings[ $request['orderby'] ] ) ) {
            $query_args['orderby'] = $orderby_mappings[ $request['orderby'] ];
        }
    }

    return $query_args;
}
0
hwl