Как в HUSKY — Products Filter для WooCommerce отображать товары при фильтрации по параметру search со значением "visibility"?

Как просто настроить фильтрацию в каталоге с помощью HUSKY — Products Filter for WooCommerce, чтобы в результатах отображались товары с параметром visibility = 'search' так же, как товары с visibility = 'visible' и 'catalog'?
  • 2 апреля 2026 г. 21:00
Ответы на вопрос 1
Коротко — причина в том, что WooCommerce хранит видимость товаров в таксономии product_visibility. Значение "search" в UI соответствует терму product_visibility: exclude-from-catalog (товар виден только в поиске, но исключён из каталога). Плагин фильтра по-умолчанию может не добавлять эти товары в результаты. Поэтому нужно либо настроить сам Husky (если в настройках есть опция маппинга видимостей), либо дополнительно подправить запрос WP_Query — добавить в tax_query term exclude-from-catalog, когда выбран фильтр "search".

Пример простого кода, который можно вставить в functions.php дочерней темы или в небольшой плагин. Он проверяет GET-параметры (популярные имена) и если выбран visibility = search, добавляет в запрос товары с product_visibility = exclude-from-catalog:

```php
add_action( 'pre_get_posts', 'husky_include_search_visibility_products' );
function husky_include_search_visibility_products( $query ) {
    if ( is_admin() || ! $query->is_main_query() ) {
        return;
    }

    // Популярные имена параметра, которые может отправлять Husky
    $param_names = array( 'visibility', 'pf_visibility', 'product_visibility' );
    $vis = '';
    foreach ( $param_names as $p ) {
        if ( ! empty( $_GET[ $p ] ) ) {
            $vis = sanitize_text_field( wp_unslash( $_GET[ $p ] ) );
            break;
        }
    }
    if ( ! $vis ) {
        return;
    }

    // Если в фильтре выбран "search" — добавляем term 'exclude-from-catalog'
    if ( strpos( $vis, 'search' ) === false && $vis !== 'search' ) {
        return;
    }

    $tax_query = $query->get( 'tax_query' ) ?: array();

    // Убедимся, что связь между clause'ами — OR, чтобы новый clause не "отсекал" результаты
    if ( isset( $tax_query['relation'] ) ) {
        $tax_query['relation'] = 'OR';
    } else {
        array_unshift( $tax_query, array( 'relation' => 'OR' ) );
    }

    $tax_query[] = array(
        'taxonomy' => 'product_visibility',
        'field'    => 'slug',
        'terms'    => array( 'exclude-from-catalog' ), // это и есть "search" видимость
        'operator' => 'IN',
    );

    $query->set( 'tax_query', $tax_query );
}
```

Несколько замечаний:
- Подставьте реальное имя GET‑параметра, которое использует ваш Husky (обычно это visibility или pf_visibility). Если не уверены — посмотрите URL при применении фильтра в каталоге.
- Код добавляет term 'exclude-from-catalog' (видимость "search"). Если нужно, можно добавить и другие термы или менять логику.
- Помещайте код в functions.php дочерней темы или в свой плагин; делайте резервную копию перед изменениями.
- После правки очистите кеш (если используется кеширование) и протестируйте фильтры.

Если хотите, могу:
- Подогнать код под точный параметр, который использует ваш Husky (вставьте пример URL с фильтром).
- Дать вариант кода, если Husky предоставляет свой хук для модификации запроса (тогда решение будет чище).
Похожие вопросы