Порылся в архивах. Как-то давно решал подобную проблему и совсем штатными средствами у меня не вышло. Возможно, сейчас есть лучший вариант, но на тот момент у меня получилось следующее:
function dco_posts_where_request( $where ) {
if ( is_search() ) {
$where = str_replace( "AND (
( wp_postmeta.meta_key = 'product_sku' AND CAST(wp_postmeta.meta_value AS CHAR) LIKE '%" . get_search_query() . "%' )
)", '', $where );
$where = str_replace( "OR (wp_posts.post_content LIKE '%" . get_search_query() . "%')", "OR (wp_posts.post_content LIKE '%" . get_search_query() . "%') OR (
wp_postmeta.meta_key = 'product_sku' AND CAST(wp_postmeta.meta_value AS CHAR) LIKE '%" . get_search_query() . "%'
)", $where );
}
return $where;
}
add_action( 'pre_get_posts', 'alter_query' );
function alter_query( $query ) {
if ( !is_admin() && $query->is_main_query() ) {
if ( $query->is_search ) {
$query->set( 'post_type', 'post' );
$query->set( 'posts_per_page', 6 );
$query->set( 'orderby', 'title' );
$query->set( 'order', 'asc' );
$meta_query_args = array(
array(
'key' => 'product_sku',
'value' => get_search_query(),
'compare' => 'LIKE'
)
);
$query->set( 'meta_query', $meta_query_args );
//we remove the actions hooked on the '__after_loop' (post navigation)
remove_all_actions( '__after_loop' );
add_filter( 'posts_where', 'dco_posts_where_request' );
}
}
}
Насколько помню, заменять куски запроса пришлось, так как в WP не было возможности поставить условие или контент или поле.
при поиске на главной
Так при поиске (результат в search.php) или на главной (др шаблоны с разными способами вывода контента)?
Для поиска и фильтрации есть напр. https://wordpress.org/plugins/search-filter/
-
Ответ изменён 8 лет, 3 месяца назад пользователем SeVlad.