Как ускорить поиск товаров WooCommerce (текстовый фильтр HUSKY)
Если на вашем сайте большое количество товаров (3000+) и поиск товаров WooCommerce [woof_text_filter] работает медленно, это руководство поможет вам его оптимизировать.
Проблема
По умолчанию HUSKY использует метод SQL JOIN для поиска, что может замедлять работу на больших базах данных. Частые симптомы: поиск по тексту занимает более 10 секунд, а фильтрация по категориям вызывает задержки.
Решение 1: Включить быстрый метод поиска (post__in)
Плагин имеет встроенный более быстрый метод поиска, который использует post__in вместо SQL JOIN. Это гораздо эффективнее для больших каталогов товаров.
Реализация
Добавьте эту единственную строку в файл вашего functions.php темы:
add_filter('woof_husky_query_post__in', '__return_true');
Ожидаемые результаты
- Скорость поиска по тексту: От 10+ секунд до 1-3 секунд
- Работает сразу после добавления кода
- Изменения базы данных не требуются
Решение 2: Оптимизация фильтрации по категориям
Если фильтрация по категориям остается медленной после включения быстрого поиска, у вас есть два варианта:
Вариант А: Добавить индексы базы данных (Рекомендуется)
Индексы базы данных значительно ускоряют запросы по категориям, оптимизируя term_relationships and term_taxonomy таблицы.
Добавьте этот код в ваш functions.php:
add_action('admin_init', 'add_woof_category_indexes', 999);
function add_woof_category_indexes() {
global $wpdb;
// Run only once
if (get_option('woof_category_indexes_added')) {
return;
}
// Add index to term_relationships table
$wpdb->query("
ALTER TABLE {$wpdb->term_relationships}
ADD INDEX woof_cat_idx (object_id, term_taxonomy_id)
");
// Add index to term_taxonomy table
$wpdb->query("
ALTER TABLE {$wpdb->term_taxonomy}
ADD INDEX woof_tax_idx (taxonomy, term_id)
");
// Mark as completed
update_option('woof_category_indexes_added', true);
}
Как это работает:
- Выполняется один раз при первой загрузке страницы администратора
- Создает оптимизированные индексы базы данных
- Сохраняет флаг завершения, чтобы предотвратить повторное выполнение
Ожидаемые результаты:
- Фильтрация по категориям: От нескольких секунд до < 1 секунды
- Постоянное решение (индексы остаются после удаления кода)
Вариант Б: Кэширование запросов по категориям
Если вы не можете изменять структуру базы данных или хотите другой подход, кэширование обеспечивает хорошее повышение производительности.
Add this code to your functions.php:
add_filter('woof_get_query_args', 'cache_woof_category_queries', 10, 1);
function cache_woof_category_queries($args) {
// Only cache when category filter is used
if (empty($_GET['product_cat'])) {
return $args;
}
// Generate cache key based on current filters
$cache_key = 'woof_cat_' . md5(serialize($_GET));
$cached_ids = get_transient($cache_key);
// Return cached results if available
if ($cached_ids !== false) {
$args['post__in'] = $cached_ids;
return $args;
}
return $args;
}
add_action('pre_get_posts', 'store_woof_category_cache', 999);
function store_woof_category_cache($query) {
// Store query results in cache
if (!empty($_GET['product_cat']) && !empty($query->posts)) {
$cache_key = 'woof_cat_' . md5(serialize($_GET));
$post_ids = wp_list_pluck($query->posts, 'ID');
set_transient($cache_key, $post_ids, HOUR_IN_SECONDS);
}
}
How it works:
- Кэширует результаты фильтра по категориям на 1 час
- Генерирует уникальный ключ кэша для каждой комбинации фильтров
- Возвращает кэшированные ID товаров при последующих идентичных поисках
Expected Results:
- Первый поиск: Нормальная скорость
- Последующие идентичные поиски: Практически мгновенные результаты
- Кэш автоматически истекает через 1 час
Какое решение использовать?
Для проблем со скоростью поиска по тексту:
Используйте Решение 1 (фильтр post__in) — это самое простое и эффективное исправление.
Для проблем со скоростью фильтрации по категориям:
Используйте Решение 2А (Индексы базы данных), если:
- У вас есть доступ к базе данных
- Вы хотите постоянную оптимизацию
- Вам нужна стабильная скорость для всех запросов
Используйте Решение 2Б (Кэширование), если:
- Вы не можете изменять структуру базы данных
- Ваши пользователи часто повторяют одни и те же поиски
- У вас переменные шаблоны поиска
Комбинирование решений:
Вы можете безопасно использовать все решения вместе для максимальной производительности:
- Включить
post__inметод (Решение 1) - Добавить индексы базы данных (Решение 2А)
- Добавить кэширование (Решение 2Б) — опционально для дополнительного ускорения
Важные замечания
- Требуется дочерняя тема: Всегда добавляйте код в
functions.phpдочерней темы, чтобы избежать потери при обновлении темы - Сначала сделайте резервную копию: Перед добавлением индексов базы данных сделайте резервную копию вашей базы данных
- Тестовая среда: По возможности сначала протестируйте решения на тестовом сайте
- Очистка кэшаЕсли вы используете решение для кэширования, помните, что кэшированные результаты обновляются ежечасно
Тестирование ваших изменений
- Добавьте код в свой
functions.php - Очистить весь кэш (браузера, WordPress, сервера)
- Протестируйте поиск, который ранее работал медленно
- Отслеживайте улучшение времени поиска
Оптимизация на стороне сервера
Если эти решения не дают достаточного улучшения, рассмотрите:
- Переход на более быстрый хостинг
- Включение кэширования объектов (Redis/Memcached)
- Оптимизация конфигурации вашего серверного ПО базы данных
- Уменьшение количества активных плагинов
Источник: https://pluginus.net/support/topic/very-slow-woof_text_filter-searches/