下面的代码应该为所有帖子类型添加多个元查询功能。它支持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.