私はメタクエリでフィルタリングしようとしていますが、何をしようとしてもそれを機能させることはできません。
基本的に、私は残りの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には当てはまりません。
必要に応じて、カスタムクエリ用に独自の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]==
次のコードは、すべての投稿タイプに複数のメタクエリー機能を追加する必要があります。 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をサポートしています!
インストール後、 _ get _ リクエストを次の形式で実行してください。
https://domain.com/wp-json/acf/v3/customposttype?filter[meta_key]=acfkey&filter[meta_value]=acfvalue
Github からプラグインのソースコードをチェックしてください。
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で投稿を検索してください 。
利用可能なフィルタ