[英]Meta Query for Custom Post Type not working
我正在尝试将 WordPress REST API 用于自定义帖子并使用参数进行过滤。 我创建了参数course_no
、 course_cycles
和course_type
。 这些是课程帖子的元字段。
我rest_course_query
使用了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_type
的non_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_key
和meta_value
而不是meta_query
工作正常。 但是我不能使用meta_key
和meta_value
组合不同的参数,所以我必须使用meta_query
。
有谁知道,为什么这在 WordPress 5.7 和 5.8 中不起作用?
我发现了问题。 我添加了一个额外的meta_query
来使用pre_get_posts
对帖子进行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');
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.