Поиск + фильтр по таксономиию Нужна помощь

Может кто-то сталкивался с такой проблемой:
нужен поиск в обычных поста + фильтр по таксономии, которая прикручена к этим постам.

Вот код формы поиска:


<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]

Anonymous
Отправить
Ответ на: