Як прискорити пошук текстового фільтра WOOF
Якщо ваш сайт має велику кількість товарів (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: Оптимізація фільтрації категорій
Якщо фільтрація за категоріями все ще повільна після увімкнення швидкого пошуку, у вас є два варіанти:
Варіант А: Додати індекси бази даних (Рекомендовано)
Індекси бази даних значно прискорюють запити до категорій шляхом оптимізації 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щоб уникнути втрати під час оновлень теми - Спочатку зробіть резервну копію: Перед додаванням індексів бази даних, зробіть резервну копію бази даних
- Тестове середовище: Спочатку тестуйте рішення на тестовому сайті, якщо можливо
- Очищення кешу: Якщо використовуєте рішення для кешування, пам’ятайте, що кешовані результати оновлюються щогодини
Тестування ваших змін
- Додайте код до вашого
functions.php - Очистити всі кеші (браузер, WordPress, сервер)
- Тестуйте пошук, який раніше був повільним
- Відстеження покращення часу пошуку
Оптимізація на стороні сервера
Якщо ці рішення не забезпечують достатнього покращення, розгляньте:
- Оновлення до швидшого хостингу
- Увімкнення кешування об'єктів (Redis/Memcached)
- Оптимізація конфігурації вашого серверу бази даних
- Зменшення кількості активних плагінів
Source: https://pluginus.net/support/topic/very-slow-woof_text_filter-searches/