我试图通过先过滤post_type(使用PODS的CPT),然后再过滤post_type中的字段来扩展wordpress主题中的搜索范围。
我有以下代码:
add_filter( 'request', 'custom_filter_search_result_by_post_type' );
function custom_filter_search_result_by_post_type( $query_vars ) {
if ( empty( $query_vars['s'] ) || empty( $_GET['post_type'] ) ) {
return $query_vars;
}
$post_type = $_GET['post_type'];
$search_value = $_GET['s'];
$valid_post_types = get_post_types( array(
'public' => TRUE,
'publicly_queryable' => TRUE
) );
if ( ! isset( $valid_post_types[ $post_type ] ) ) {
return $query_vars;
}
$query_vars['post_type'] = $post_type;
echo '<script>console.log("Searching in ' . $post_type . ' for ' . $search_value . '")</script>';
switch( $post_type ) {
case 'book':
$query_vars->set('meta_query', array(
'relation' => 'OR',
array(
'key' => 'book_author',
'value' => $search_value,
'compare' => 'LIKE'
)
));
break;
case 'jobs':
break;
default:
break;
}
echo '<script>console.log(' . json_encode($query_vars) . ')</script>';
return $query_vars;
}
但是,开关内部的数组导致黑屏,因此在某处显然存在错误,但是我对找到它的语法非常熟悉。
从本质上讲,我只有一个搜索词,我希望与书名,图书作者或出版商相匹配。在上面的过滤器代码中这可能吗?
****编辑****
我已将代码更新为:
$meta_query = array(
'relation' => 'OR',
array(
'key' => 'book_author',
'value' => $_GET['author'],
'compare' => 'LIKE'
)
);
$query_vars->set( 'meta_query', $meta_query );
我现在确实得到了结果,但是我不得不将's'传递为空并将作者添加到查询字符串中(不需要)。这导致所有书籍都被显示并且根本没有被过滤。
我认为这可能是因为搜索的大部分是在主题本身内进行的,因此当仅使用s参数作为标准时,它已经有零个结果要过滤。 -不解释为什么当“ s”为空白但填写了作者时,它仍不过滤结果的原因。