Принудительно использовать фильтр Woocommerce по атрибуту, чтобы показывать только атрибуты, в которых искомый термин присутствует в заголовке - PullRequest
0 голосов
/ 26 января 2019

Я использую приведенный ниже код для поиска в WordPress только по названиям продуктов.Однако виджет woocommerce "Filter by Attributes" по-прежнему показывает фильтры, как если бы поиск был выполнен и по основному тексту.

Так, например, если я ищу "face", результаты, которые отображаются, все имеют "face" взаголовок, но виджет «Фильтровать по атрибуту» будет по-прежнему показывать «Шоколад» в качестве атрибута, потому что есть шоколадная плитка с описанием «Посмотрим правде в глаза, мы все любим шоколад»

Затем, если вы нажмете фильтр «Шоколад»,это не даст результатов, потому что в поиске отображаются результаты только с «лицом» в заголовке.

Я даже не знаю, с чего начать искать способ изменить поведение фильтра по атрибуту виджета.

// Search titles only 
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 = '';
    foreach ((array)$q['search_terms'] as $term) {
        $term = esc_sql($wpdb->esc_like($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);

1 Ответ

0 голосов
/ 27 января 2019

Я собрал свой собственный фильтр, который хорошо работает с приведенным выше поиском (только заголовки) и не показывает бренды, у которых есть элементы, у которых нет ключевого слова в заголовке. Моя единственная проблема сейчас - выяснить, как получить количество предметов.

<?php
 $searchterm = htmlentities($_GET["s"]);
 $filter_brand = htmlentities($_GET["filter_brand"]);
 $current = $_SERVER['REQUEST_URI'];
 $site_url = home_url();
 $args = array(
                'post_type' => 'product',
                'posts_per_page' => -1,
                'order' => 'ASC',
                'orderby' => 'title',
                's' => $searchterm
            );
    // The Query
  $the_query = new WP_Query( $args );



if( $the_query->have_posts() ) :
echo'<div id="woocommerce_layered_nav-3" class="widget woocommerce widget_layered_nav woocommerce-widget-layered-nav">
<ul class="woocommerce-widget-layered-nav-list">';
$unique_singler = array();
    while ( $the_query->have_posts() ) : $the_query->the_post();
     $brand_terms = get_the_terms( $post, 'pa_brand' );
     $singler = array_values($brand_terms)[0];
     $name = $singler->name;
     $name_string = strtolower($name);
     $name_slug = str_replace(" ","-",$name_string);
// only create option if city hasn't been added yet
        if( ! in_array( $name, $unique_singler ) ) :
            // add city to array so it doesn't repeat
            $unique_singler[] = $name;
       ;?>
    <li class="woocommerce-widget-layered-nav-list__item wc-layered-nav-term <?php if (!($filter_brand == $name_slug) && !empty($filter_brand)) { echo 'hidden'; }?>">
    <?php echo '<a class="remover ';
    if ($filter_brand == $name_slug) { echo 'shown'; }
    echo '" href="'.$site_url.'/?s='.$searchterm.'&tags=1&ixwps=1&post_type=product"><i class="fas fa-times"></i></a>';
 ?><?php
    echo '<a class="dup" href="'.$current.'&filter_brand='.$name_slug.'">'.$name.'</a> <span class="count">(' .count($XXXXXXX). ')</span>';
 ?></li>
            <?php
    endif;?>                
                            <?php endwhile;?>
                </ul>       
</div>              
                            <?php else :?>
    <p>Nothing to see</p>
<?php endif; ?>

 <style>
 li.woocommerce-widget-layered-nav-list__item.wc-layered-nav-term a.remover {
    display:none;
}

li.woocommerce-widget-layered-nav-list__item.wc-layered-nav-term a.remover.shown {
    display:inline-block;
}

li.woocommerce-widget-layered-nav-list__item.wc-layered-nav-term.hidden
{
    display:none;
}

.x-sidebar .widget ul li {
    border-top: 1px solid rgba(0,0,0,0.085) !important;
}

ul.woocommerce-widget-layered-nav-list
{
     border-top: 1px solid rgba(0,0,0,0.085) !important;
     border-bottom: 1px solid rgba(0,0,0,0.085) !important;
}

.woocommerce-widget-layered-nav-list, li.woocommerce-widget-layered-nav-list__item.wc-layered-nav-term {
    margin-left:0 !important;
}

 .x-sidebar .widget ul li a {
    padding-top: 8px;
    padding-bottom: 8px;
 }
 div#woocommerce_layered_nav-3 {
    margin: 0;
}

a.remover.shown i {
    text-decoration: underline !important;
    margin-right:0.5em;
}
</style>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...