AND関係を持つ複数のacfカスタムフィールドに基づいて投稿をフィルタリングしたい。このようなもの:
$args = array(
'post_type' => 'product',
'meta_query' => array(
'relation' => 'AND',
array(
'key' => 'color',
'value' => 'blue',
'compare' => '=',
),
array(
'key' => 'price',
'value' => array( 20, 100 ),
'type' => 'numeric',
'compare' => 'BETWEEN',
),
),
);
私はもっと多くのフィルタがあるかもしれません。これらをREST API 2フィルタに変換する方法を教えてください。
この解決策は、 /lib/endpoints/class-wp-rest-posts-controller.php
のうちの v2 WP Rest API
内の get_items()
とともに機能します。
まず、 new WP_Query()
の場合と同じように、 GET
引数を作成します。これを行う最も簡単な方法は http_build_query()
を使うことです。
$args = array (
'filter' => array (
'meta_query' => array (
'relation' => 'AND',
array (
'key' => 'color',
'value' => 'blue',
'compare' => '=',
),
array (
'key' => 'test',
'value' => 'testing',
'compare' => '=',
),
),
),
);
$field_string = http_build_query( $args );
次のようなものが生成されます。
filter%5Bmeta_query%5D%5Brelation%5D=AND&filter%5Bmeta_query%5D%5B0%5D%5Bkey%5D=color&filter%5Bmeta_query%5D%5B0%5D%5Bvalue%5D=blue&filter%5Bmeta_query%5D%5B0%5D%5Bcompare%5D=%3D&filter%5Bmeta_query%5D%5B1%5D%5Bkey%5D=test&filter%5Bmeta_query%5D%5B1%5D%5Bvalue%5D=testing&filter%5Bmeta_query%5D%5B1%5D%5Bcompare%5D=%3D
読みやすくしたい場合は、Chromeツールと decodeURIComponent('your-query-here')
を使用して、 JSON Rest API URL に読み込めば読みやすくなります。
注:カスタム投稿タイプを使用するには、?
の前にproduct
を配置します。
/wp-json/wp/v2/<custom-post-type>?filter[meta_query]
クエリはありますが、WPにいくつかの処理方法を指示する必要があります。
product
に対するRESTサポートの追加meta_query
meta_query
の構文解析// 1) Add CPT Support <product>
function wpse_20160526_add_product_rest_support() {
global $wp_post_types;
//be sure to set this to the name of your post type!
$post_type_name = 'product';
if( isset( $wp_post_types[ $post_type_name ] ) ) {
$wp_post_types[$post_type_name]->show_in_rest = true;
$wp_post_types[$post_type_name]->rest_base = $post_type_name;
$wp_post_types[$post_type_name]->rest_controller_class = 'WP_REST_Posts_Controller';
}
}
add_action( 'init', 'wpse_20160526_add_product_rest_support', 25 );
// 2) Add `meta_query` support in the GET request
function wpse_20160526_rest_query_vars( $valid_vars ) {
$valid_vars = array_merge( $valid_vars, array( 'meta_query' ) ); // Omit meta_key, meta_value if you don't need them
return $valid_vars;
}
add_filter( 'rest_query_vars', 'wpse_20160526_rest_query_vars', PHP_INT_MAX, 1 );
// 3) Parse Custom Args
function wpse_20160526_rest_product_query( $args, $request ) {
if ( isset( $args[ 'meta_query' ] ) ) {
$relation = 'AND';
if( isset($args['meta_query']['relation']) && in_array($args['meta_query']['relation'], array('AND', 'OR'))) {
$relation = sanitize_text_field( $args['meta_query']['relation'] );
}
$meta_query = array(
'relation' => $relation
);
foreach ( $args['meta_query'] as $inx => $query_req ) {
/*
Array (
[key] => test
[value] => testing
[compare] => =
)
*/
$query = array();
if( is_numeric($inx)) {
if( isset($query_req['key'])) {
$query['key'] = sanitize_text_field($query_req['key']);
}
if( isset($query_req['value'])) {
$query['value'] = sanitize_text_field($query_req['value']);
}
if( isset($query_req['type'])) {
$query['type'] = sanitize_text_field($query_req['type']);
}
if( isset($query_req['compare']) && in_array($query_req['compare'], array('=', '!=', '>','>=','<','<=','LIKE','NOT LIKE','IN','NOT IN','BETWEEN','NOT BETWEEN', 'NOT EXISTS')) ) {
$query['compare'] = sanitize_text_field($query_req['compare']);
}
}
if( ! empty($query) ) $meta_query[] = $query;
}
// replace with sanitized query args
$args['meta_query'] = $meta_query;
}
return $args;
}
add_action( 'rest_product_query', 'wpse_20160526_rest_product_query', 10, 2 );
これが私がLocalhostで行ったテストです。
セキュリティ上の理由から、WP Apiではメタクエリは許可されていません。まず、ワードプレステーマにこの関数を追加して、許可されたrest_queryにmeta_queryを追加します。functions.php
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 Webサイトからデータを取得する他のWebサイトでこの機能を使用してHTMLクエリを作成する必要があります。
$curl = curl_init();
$fields = array (
'filter[meta_query]' => array (
'relation' => 'AND',
array (
'key' => 'color',
'value' => 'blue',
'compare' => '='
),
array (
'key' => 'price',
'value' => array ( 20, 100 ),
'type' => 'numeric',
'compare' => 'BETWEEN'
),
),
);
$field_string = http_build_query($fields);
curl_setopt_array($curl, array (
CURLOPT_RETURNTRANSFER => 1,
CURLOPT_URL => 'http://yourwordpreswebssite.com/wp-json/wp/v2/posts?' . $field_string
)
);
$result = curl_exec($curl);
echo htmlentities($result);
フィールド配列を変更して、外観がクエリ引数のようになるようにします。エンコードされたクエリ文字列は次のようになります。
http://yourwordpreswebssite.com/wp-json/wp/v2/posts?filter%5Btaxonomy%5D=product&filter%5Bmeta_query%5D%5Brelation%5D=AND&filter%5Bmeta_query%5D%5B0%5D%5Bkey%5D=color&filter%5Bmeta_query%5D%5B0%5D%5Bvalue%5D=blue&filter%5Bmeta_query%5D%5B0%5D%5Bcompare%5D=%3D&filter%5Bmeta_query%5D%5B1%5D%5Bkey%5D=price&filter%5Bmeta_query%5D%5B1%5D%5Bvalue%5D%5B0%5D=20&filter%5Bmeta_query%5D%5B1%5D%5Bvalue%5D%5B1%5D=100&filter%5Bmeta_query%5D%5B1%5D%5Btype%5D=numeric&filter%5Bmeta_query%5D%5B1%5D%5Bcompare%5D=BETWEEN
urldecode()
を使用すると、この場合はurldecode('http://yourwordpreswebssite.com/wp-json/wp/v2/posts?' . $field_string);
になります。このようなURLがあります。
http://yourwordpreswebssite.com/wp-json/wp/v2/posts?filter[taxonomy]=product&filter[meta_query][relation]=AND&filter[meta_query][0][key]=color&filter[meta_query][0][value]=blue&filter[meta_query][0][compare]==&filter[meta_query][1][key]=price&filter[meta_query][1][value][0]=20&filter[meta_query][1][value][1]=100&filter[meta_query][1][type]=numeric&filter[meta_query][1][compare]=BETWEEN
あなたが私たちにあなたのウェブサイトで直接postmanを使ってそれをテストすることができるようにあなたのライブウェブサイトURLを提供することができれば、それはlocalhostまたは既存のWordPressサイトでそれをテストするため
Wordpress 4.7ではfilter
引数は削除されました。
Wordpressチームが提供する this pluginをインストールして再起動することができます。その後初めて、あなたは他の答えで提案された解決策の1つを使うことができます。
私はまだプラグインをインストールせずに同じことをするための解決策を見つけていません。
あなたはこのようにRest APIなしでそれをすることができます(それは私の投稿フィルタです)
$ paged =(get_query_var( 'paged'))? get_query_var( 'paged'):1; $ args = array( 'paged' => $ paged、 'orderby' => 'date'、//сортировкапо датеуннссбудетвлюбомслучае(н/выможетитьэто) 'order' => 'DESC'、 ; .____ ..;。 if(isset($ _GET ['price_min'])|| 'set($ || isset($))|| isset($)|| isset($)|| isset($)|| $ _GET ['type'])) $ args ['meta_query'] = array( 'relation' => 'AND'); // ANDで始まるmeta_queryで始まる if($ type){ $ args ['meta_query'] [] = array( 'key' => 'type'、 'value' => $ type、 ); }; if( $ plan){ $ args ['meta_query'] [] = array( 'key' => 'plan'、 'value' => $ plan、[。 [(____)]; [ ]}; if($ room_num){ $ args ['meta_query'] [] =配列( ] 'key' => 'room_num'、 'value' => $ room_num、 ); }; if($ etage) ){ $ args ['meta_query'] [] =配列( 'key' => 'etage'、 'value' => $ etage、 ]); }; if($ price_min || $ price_max){ $ args ['meta_query'] [] = array( 'key' => 'price' 、 'value' => array($ price_min、$ price_max)、 'type' => 'numeric'、 'compare' => 'BETWEEN' ); }; if($ area_min || $ area_max){ $ args ['meta_query'] [] = array( 'key' => 'area' 、 'value' => array($ area_min、$ area_max)、 'type' => 'numeric'、 'compare' => 'BETWEEN' ); };