我尝试配置WordPress搜索功能,以便考虑存储在Advanced Custom Fields插件创建的元字段中的数据。
我正在使用此代码尝试实现这一目标:
if (!is_admin() && $query->is_search) {
$query->set('meta_query', array(
array(
'key' => 'detailed_product_title',
'value' => sanitize_text_field($_GET['s']),
'compare' => 'LIKE'
)
));
}
这对我来说只是在meta字段中包含搜索字词的帖子的搜索结果。例如,如果我搜索" white",我只会在搜索结果中收到包含其中包含白色的元值的帖子。
这引出了我的问题:
这是我目前的代码:
function searchProductTitle($query) {
if (!is_admin() && $query->is_search) {
$query->set('meta_query', array(
'relation' => 'OR',
array(
'key' => 'detailed_product_title',
'value' => sanitize_text_field($_GET['s']),
'compare' => 'LIKE'
),
array(
'key' => 'detailed_product_title',
'compare' => 'NOT EXISTS'
)
));
}
}
add_filter('pre_get_posts', 'searchProductTitle');
function my_posts_where($where) {
global $wpdb;
if ( isset( $_GET['s'] ) && !empty( $_GET['s'] ) ) {
$search = sanitize_text_field($_GET['s']);
$where .= " OR wp_posts.post_content LIKE '%' . $search . '%'";
}
return $where;
}
add_filter('posts_where' , 'my_posts_where');
答案 0 :(得分:0)
尝试类似:
$query->set('meta_query', array(
'relation' => 'OR',
array(
'key' => 'detailed_product_title',
'value' => sanitize_text_field($_GET['s']),
'compare' => 'LIKE'
),
array(
'key' => 'detailed_product_title',
'compare' => 'NOT EXISTS'
)
));
<强>更新强>
您将无法直接将上面的meta_query与搜索post_content字段(使用和OR关系)结合起来。您可以做的不是上述内容,而是添加custom query,如下所示:
add_filter( 'posts_where', 'my_posts_where' );
function my_posts_where( $where ) {
if ( is_search() ) {
global $wpdb;
$search = get_search_query();
$search = like_escape( $search );
// include postmeta in search
$where .= " OR {$wpdb->posts}.ID IN (SELECT {$wpdb->postmeta}.post_id FROM {$wpdb->posts}, {$wpdb->postmeta} WHERE {$wpdb->postmeta}.meta_key = 'detailed_product_title' AND {$wpdb->postmeta}.meta_value LIKE '%$search%' AND {$wpdb->posts}.ID = {$wpdb->postmeta}.post_id)";
}
return $where;
}
请注意,我没有对上述内容进行过测试,但这样可以让您了解自己需要做什么。