我正在尝试使用自定义字段在帖子中创建一些过滤器。
因此,在我的searchpage.php
中添加了以下内容:
$args = array(
'post_type' => 'cp_course', 'numberposts' =>-1,'orderby' => 'ID', 'order' => 'ASC', 's' => $searchterm,
'meta_query' => array(
'relation' => 'AND',
array(
'key' => 'course_code',
'value' => $code,
),
array(
'key' => 'course_duration',
'value' => $duration,
)
)
);
$course = get_posts($args);
但是如果我仅提供$code
或仅提供$duration
,则将无法正常工作,由于AND
的关系,我必须同时提供它们。是否有比多个IFs
更简单的方法来检查是否未提供$code
,然后仅按$duration
编辑
通过使用ash0ur solution,我使用了以下代码:
$args = array(
'post_type' => 'cp_course', 'numberposts' =>-1,'orderby' => 'ID', 'order' => 'ASC', 's' => $searchterm,
'meta_query' => array(
'relation' => 'OR',
array(
'relation' => 'AND',
array(
'key' => 'course_code',
'value' => $code,
),
array(
'key' => 'course_duration',
'value' => $duration,
),
),
array(
'key' => 'course_duration',
'value' => $duration,
),
array(
'key' => 'course_code',
'value' => $code,
)
)
);
但是,如果要扩展它以添加更多搜索词,则会在数据库中遇到许多INNER JOIN
查询,这会导致服务器出现问题。这是我尝试过导致问题的原因:
$args = array(
'post_type' => 'cp_course', 'numberposts' =>-1,'orderby' => 'ID', 'order' => 'ASC', 's' => $searchterm,
'meta_query' => array(
'relation' => 'OR',
array(
'relation' => 'AND',
array(
'key' => 'course_code',
'value' => $code,
),
array(
'key' => 'course_duration',
'value' => $duration,
),
array(
'key' => 'course_iteration_start',
'value' => $date_from,
),
array(
'key' => 'course_iteration_end',
'value' => $date_to,
),
),
array(
'key' => 'course_duration',
'value' => $duration,
),
array(
'key' => 'course_code',
'value' => $code,
)
)
);
其中course_iteration_start
和course_iteration_end
是sub fields
course_iteration
的{{1}}(重复者)。
答案 0 :(得分:2)
您可以使用嵌套关系:
'meta_query' => array(
'relation' => 'OR',
array(
'relation' => 'AND',
array(
'key' => 'course_code',
'value' => $code,
),
array(
'key' => 'course_duration',
'value' => $duration,
)
),
array(
'key' => 'course_duration',
'value' => $duration,
)
)