Я пытаюсь настроить функцию поиска WordPress так, чтобы она также учитывала данные, хранящиеся в метаполе, созданном Расширенные пользовательские поля плагин.
Я использую этот код, чтобы попытаться сделать это:
if (!is_admin() && $query->is_search) {
$query->set('meta_query', array(
array(
'key' => 'detailed_product_title',
'value' => sanitize_text_field($_GET['s']),
'compare' => 'LIKE'
)
));
}
Это дает мне результаты поиска только постов, которые содержат поисковый запрос в метаполе. Например, если я ищу «белый», я получаю только сообщения с мета-значением, которое содержит белый цвет в моих результатах поиска.
Это приводит меня к моему вопросу:
Вот мой текущий код:
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');
Попробуйте что-то вроде:
$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'
)
));
ОБНОВИТЬ:
Вы не сможете напрямую объединить метазапрос выше с поиском в поле post_content (используя отношение OR). Что вы можете сделать, это вместо вышеупомянутого добавить пользовательский запрос как это:
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;
}
Обратите внимание, что я не проверял вышеизложенное, но это даст вам общее представление о том, что вам нужно делать.
Других решений пока нет …