Как я могу сделать этот поиск WordPress опционально учитывать мета значения?

Я пытаюсь настроить функцию поиска 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');

1

Решение

Попробуйте что-то вроде:

    $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;
}

Обратите внимание, что я не проверял вышеизложенное, но это даст вам общее представление о том, что вам нужно делать.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]