Как ускорить текстовый поиск WOOF Text Filter
Если на вашем сайте большое количество товаров (3000+) и вы замечаете медленную работу поиска с [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: оптимизация фильтрации по категориям
Если фильтрация по категориям всё ещё медленная после включения быстрого поиска, есть два варианта:
Вариант A: добавить индексы базы данных (рекомендуется)
Индексы базы данных значительно ускоряют запросы по категориям, оптимизируя таблицы term_relationships и 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 секунды
- Постоянное решение (индексы остаются после удаления кода)
Вариант B: кэширование запросов по категориям
Если вы не можете изменить структуру базы данных или хотите другой подход, кэширование обеспечивает хороший прирост производительности.
Добавьте этот код в ваш 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);
}
}
Как это работает:
- Кэширует результаты фильтра по категориям на 1 час
- Генерирует уникальный ключ кэша для каждой комбинации фильтра
- Возвращает закэшированные ID товаров при последующих идентичных поисках
Ожидаемый результат:
- Первый поиск: обычная скорость
- Последующие идентичные поиски: почти мгновенный результат
- Кэш автоматически истекает через 1 час
Какое решение использовать?
Для проблем со скоростью текстового поиска:
Используйте Решение 1 (фильтр post__in) — это самое простое и эффективное исправление.
Для проблем со скоростью фильтрации по категориям:
Используйте Решение 2A (индексы базы данных), если:
- У вас есть доступ к базе данных
- Вы хотите постоянную оптимизацию
- Вам нужна стабильная скорость для всех запросов
Используйте Решение 2B (кэширование), если:
- Вы не можете изменить структуру базы данных
- Ваши пользователи часто повторяют одни и те же запросы поиска
- У вас разнообразные паттерны поиска
Комбинирование решений:
Можно безопасно использовать все решения вместе для максимальной производительности:
- Включите метод
post__in(Решение 1) - Добавьте индексы базы данных (Решение 2A)
- Добавьте кэширование (Решение 2B) — опционально для дополнительного ускорения
Важные замечания
- Требуется дочерняя тема: всегда добавляйте код в
functions.phpдочерней темы, чтобы не потерять его при обновлении темы - Сначала резервная копия: перед добавлением индексов базы данных сделайте резервную копию
- Тестовая среда: если возможно, сначала протестируйте решения на staging-сайте
- Очистка кэша: при использовании решения с кэшированием помните, что закэшированные результаты обновляются ежечасно
Проверка изменений
- Добавьте код в ваш
functions.php - Очистите все кэши (браузер, WordPress, сервер)
- Протестируйте поиск, который ранее был медленным
- Отследите улучшение скорости поиска
Оптимизация на стороне сервера
Если эти решения не дают достаточного улучшения, рассмотрите:
- Переход на более быстрый хостинг
- Включение объектного кэширования (Redis/Memcached)
- Оптимизацию конфигурации сервера базы данных
- Уменьшение количества активных плагинов
Источник: https://pluginus.net/support/topic/very-slow-woof_text_filter-searches/