自定义帖子类型的元查询不起作用



我试图使用WordPress REST API自定义帖子和使用参数来过滤。我创建了参数course_no,course_cyclescourse_type。这些是课程帖子的元字段。

我使用rest_course_query过滤器钩子。这就是代码:

// Add custom field filters for REST API
function chld_thm_post_meta_request_params( $args, $request ) {
$hasFilterCourseNo = false;
$hasFilterCourseCycles = false;
$hasFilterCourseType = false;
// meta query for course number
if ($request['course_no'] != null) {
$hasFilterCourseNo = true;
$courseNoMetaQuery = array(
'key'     => 'course_no',
'value'   => $request['course_no'],
'compare' => '='
);
}
// meta query for course cycles
if ($request['course_cycles'] != null) {
$hasFilterCourseCycles = true;
$courseCycleMetaQuery = array(
'relation' => 'OR'
);
foreach (explode(",", $request['course_cycles']) as $course_cycle) {
$currentCycle = array(
'key' => 'course_cycles',
'value' => serialize($course_cycle),
'compare' => 'LIKE'
);
array_push($courseCycleMetaQuery, $currentCycle);
}
}
// meta query for course type
if ($request['course_type'] != null) {
$hasFilterCourseType = true;
$courseTypeMetaQuery = array(
'key'     => 'course_type',
'value'   => $request['course_type'],
'compare' => '='
);
}
$meta_query_args = array(
'relation' => 'AND'
);
if ($hasFilterCourseNo == true) {
array_push( $meta_query_args, $courseNoMetaQuery);
}
if ($hasFilterCourseCycles == true) {
array_push( $meta_query_args, $courseCycleMetaQuery);
}
if ($hasFilterCourseType == true) {
array_push( $meta_query_args, $courseTypeMetaQuery);
}
$meta_query = array(
'meta_query' => $meta_query_args
);
$args = $args + $meta_query; // TODO looks like meta_query is not working here
return $args;
}
add_filter( 'rest_course_query', 'chld_thm_post_meta_request_params', 99, 2 );

我可以使用以下请求:wp-json/wp/v2/course?search=&per_page=100&course_type=non_subsidized

不幸的是,这里没有过滤course_typenon_subsidized

使用meta_query创建一个完全好的WP查询。

'meta_query' => 
array (size=2)
'relation' => string 'AND' (length=3)
0 => 
array (size=3)
'key' => string 'course_type' (length=11)
'value' => string 'non_subsidized' (length=14)
'compare' => string '=' (length=1)

但是由于某些原因,WordPress REST API不承认meta_query参数。

使用meta_keymeta_value代替meta_query工作正常。但是我不能使用meta_keymeta_value组合不同的参数,所以我必须使用meta_query

有谁知道,为什么在WordPress 5.7和5.8中不能工作?

我找到问题了。我添加了一个额外的meta_query来使用pre_get_posts来排序帖子。

meta_query在那里被覆盖了。我没有覆盖它,而是合并了现有的meta_query,现在它可以工作了。

$meta_query = $query->get('meta_query');
$meta_query_order = array(
'order_course_date' => array(
'key' => 'course_date_start',
'value' => date("Ymdhi"),
'compare' => '<='
)
);
if (is_array($meta_query)) {
$meta_query_new = array_merge($meta_query, $meta_query_order);
} else {
$meta_query_new = $meta_query_order;
}
$query->set('meta_query', $meta_query_new);
$query->set('orderby', 'order_course_date');
$query->set('order', 'ASC');

最新更新