繁体   English   中英

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

[英]Meta Query for Custom Post Type not working

我正在尝试将 WordPress REST API 用于自定义帖子并使用参数进行过滤。 我创建了参数course_nocourse_cyclescourse_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_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对帖子进行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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM