Может кто-то сталкивался с такой проблемой:
нужен поиск в обычных поста + фильтр по таксономии, которая прикручена к этим постам.
Вот код формы поиска:
<div class="search">
<?php
$args = array(
'show_option_all' => 'Часть тела',
'echo' => 0,
'hide_empty' => 0,
'name' => 'in_mesto',
'class' => 'select search-select select-part',
'taxonomy' => 'cat_mesto',
);
$dropdowncatsmesto = wp_dropdown_categories($args);
$argst = array(
'show_option_all' => 'Стиль',
'echo' => 0,
'hide_empty' => 0,
'name' => 'in_stil',
'class' => 'select search-select select-style',
'taxonomy' => 'cat_stil',
);
$dropdowncatsstil = wp_dropdown_categories($argst);
?>
<form id="searchform" role="search" method="get" action="<?php echo home_url( '/' ); ?>" >
<input name="s" id="s" placeholder="Название" class="search-input" value="<?php echo get_search_query() ?>" >
<div class="search_item">
<?php echo $dropdowncatsmesto; ?>
</div>
<div class="search_item">
<?php echo $dropdowncatsstil; ?>
</div>
<div class="search_item find"><input type="submit" name="submit" id="searchsubmit" class="submit search-button" value="Найти татуировку" /></div>
<button class="search-button_mob"></button>
</form>
</div>
Прописал в файле functions.php где искать:
add_filter( 'posts_where', 'title_like_posts_where', 10, 2 );
function title_like_posts_where( $where, &$wp_query ) {
global $wpdb;
if ( $post_title_like = $wp_query->get( 'post_title_like' ) ) {
$where .= ' AND ' . $wpdb->posts . '.post_title LIKE \'% ' . esc_sql( $wpdb->esc_like( $post_title_like ) ) . '\'
OR '. $wpdb->posts . '.post_title LIKE \'' . esc_sql( $wpdb->esc_like( $post_title_like ) ) . '%\'
OR '. $wpdb->posts . '.post_content LIKE \'%' . esc_sql( $wpdb->esc_like( $post_title_like ) ) . '\'
OR '. $wpdb->posts . '.post_content LIKE \'' . esc_sql( $wpdb->esc_like( $post_title_like ) ) . '%\'
OR '. $wpdb->posts . '.post_title LIKE \'%' . esc_sql( $wpdb->esc_like( $post_title_like ) ) . '%\'
OR '. $wpdb->posts . '.post_content LIKE \'%' . esc_sql( $wpdb->esc_like( $post_title_like ) ) . '%\' ' ;
}
return $where;
}
И на странице результатов поиска формирую цыкл:
if ( $_GET['s'] != '' && $_GET['in_mesto'] >= '1' && $_GET['in_stil'] >= '1' ) {
$args = array(
'post_type' => 'post',
'paged' => get_query_var( 'paged' ),
'posts_per_page' => '-1',
'post_title_like' => $_GET['s'],
'tax_query' => array(
'relation' => 'AND',
array(
'taxonomy' => 'cat_mesto',
'field' => 'term_id',
'terms' => $_GET['in_mesto'],
),
array(
'taxonomy' => 'cat_stil',
'field' => 'term_id',
'terms' => $_GET['in_stil'],
)
)
);
}
$filter = new WP_Query( $args );
Вот тут и вылазит моя головна боль. По слову ищет без проблем, но фильтрации по таксономии нету. Такое ощущение, что tax_query вовсе не отрабатывает.
Куда копать, что искать уже не пойму.
Подскажите, где и что искать то…
И еще, если в масиве закоментировать строку ‘post_title_like’ => $_GET[‘s’], , то фильтрация по таксономии работает
Как оказалось, поиск блокировал плагин – три дня мучался, не мог понять в чем проблема.
Осталась небольшая проблема поиск сейчас работает по 100% совпадению слова.
Как можно сделать морфологический поиск (без плагинов)? Есть какие то идеи по этому?
Тему можно закрыть )
Вот костыль, может кому пригодится, как я сделал поиск по неточному запросу:
[code-
function __search_by_title_only( $search, &$wp_query ) {
global $wpdb;
if ( empty( $search ) )
return $search; // skip processing – no search term in query
$q = $wp_query->query_vars;
$n = ! empty( $q[‘exact’] ) ? ” : ‘%’;
$search = ”;
$searchand = ”;
$qs = $q[‘search_terms’];
$str_s = implode(‘ ‘, $qs);
preg_match_all(‘~(\pL+)~u’,$str_s,$matches);
$words=array_unique($matches[0]);
$true_words=Array();
if (count($words)) {
foreach($words as $word) {
// Обрабатывать только слова длиннее 3 символов
if (strlen($word)>3) {
// От слов длиннее 7 символов отрезать 2 последних буквы
if (strlen($word)>7) {
$word=substr($word,0,(strlen($word)-2));
}
// От слов длиннее 5 символов отрезать последнюю букву
elseif (strlen($word)>5) {
$word=substr($word,0,(strlen($word)-1));
}
$true_words
=addcslashes(addslashes($word),’%_’);
}
}
}
// Список уникальных поисковых слов
$true_words=array_unique($true_words);
foreach ( $true_words as $term ) {
$term = esc_sql( like_escape( $term ) );
$search .= "{$searchand}($wpdb->posts.post_title LIKE ‘{$n}{$term}{$n}’)";
$searchand = ‘ AND ‘;
}
if ( ! empty( $search ) ) {
$search = " AND ({$search}) ";
if ( ! is_user_logged_in() )
$search .= " AND ($wpdb->posts.post_password = ”) ";
}
return $search;
}
add_filter( ‘posts_search’, ‘__search_by_title_only’, 500, 2 );
[/code]