Диагностика проблемы: почему массовые изменения наличия товаров не отражаются в индексе
В WooCommerce при изменении статуса наличия большого количества товаров часто возникает задержка в обновлении индекса поисковых систем. Это связано с тем, что стандартные методы отправки URL в IndexNow запускаются индивидуально и не учитывают массовые операции. В итоге поисковики продолжают показывать устаревшую информацию о наличии товаров, что негативно сказывается на конверсии и пользовательском опыте.
Проверить проблему можно следующим образом:
- Измените наличие сразу у нескольких товаров через админку WooCommerce или с помощью импорта.
- Отследите логи запросов к IndexNow (если ведется логирование) или используйте сетевой монитор в браузере для отслеживания отправки URL.
- Проверьте через инструменты поисковых систем актуальность индексации страниц товаров с обновленным наличием.
Пошаговое решение: реализация пакетной отправки URL в IndexNow при массовом обновлении товаров
1. Перехват массового обновления наличия товаров
WooCommerce не предоставляет стандартного хука для массового изменения наличия, но можно использовать woocommerce_product_set_stock для отслеживания изменения остатков каждого товара. Чтобы минимизировать нагрузку, собираем URL товаров в пакет и отправляем по таймеру.
add_action('woocommerce_product_set_stock', 'indexnow_collect_product_url_for_batch', 10, 1);
function indexnow_collect_product_url_for_batch($product) {
$url = get_permalink($product->get_id());
$batch = get_option('indexnow_url_batch', []);
if (!in_array($url, $batch)) {
$batch[] = $url;
update_option('indexnow_url_batch', $batch);
}
}2. Создание Cron задачи для отправки URL партиями
Чтобы избежать превышения лимитов IndexNow и не перегружать сервер, отправляем URL из накопленного списка порциями по 10 штук каждые 5 минут.
if (!wp_next_scheduled('indexnow_send_url_batch')) {
wp_schedule_event(time(), 'five_minutes', 'indexnow_send_url_batch');
}
add_action('indexnow_send_url_batch', 'indexnow_send_batch_urls');
function indexnow_send_batch_urls() {
$batch = get_option('indexnow_url_batch', []);
if (empty($batch)) {
return;
}
$chunk = array_splice($batch, 0, 10);
$endpoint = 'https://api.indexnow.org/indexnow';
$api_key = 'ваш_ключ_из_IndexNow'; // Замените на ваш ключ
$payload = [
'host' => home_url(),
'key' => $api_key,
'keyLocation' => home_url('/' . $api_key . '.txt'),
'urlList' => $chunk
];
$response = wp_remote_post($endpoint, [
'headers' => ['Content-Type' => 'application/json'],
'body' => json_encode($payload),
'timeout' => 15
]);
if (!is_wp_error($response) && wp_remote_retrieve_response_code($response) === 200) {
update_option('indexnow_url_batch', $batch); // очистить отправленные URL
} else {
// При ошибке можно логировать или попытаться повторить позже
}
}3. Регистрация интервала Cron 5 минут
add_filter('cron_schedules', 'indexnow_add_five_minutes_cron');
function indexnow_add_five_minutes_cron($schedules) {
$schedules['five_minutes'] = [
'interval' => 300,
'display' => __('Каждые 5 минут')
];
return $schedules;
}Проверка результата после внедрения
- Отредактируйте наличие нескольких товаров в WooCommerce одновременно.
- Подождите 5–10 минут, чтобы сработал Cron.
- Проверьте логи сервера или включите временную запись в лог отправки в функцию
indexnow_send_batch_urlsдля подтверждения успешной отправки URL. - Воспользуйтесь инструментами для вебмастеров (например, Яндекс Вебмастер или Bing Webmaster) для проверки статуса последних отправленных URL.
- Проверьте, что страницы с обновленным наличием отображаются корректно в поиске через несколько часов.
Частые ошибки и как их исправить
- Отсутствие ключа API или неправильный ключ: проверьте, что ключ правильно прописан в коде и файл
{ключ}.txtразмещен в корне сайта. - Ошибки при отправке из-за превышения лимита URL: используйте пакетную отправку по 10-20 URL и интервал не менее 5 минут.
- Повторяющиеся URL в пакете: фильтруйте дубликаты при сборе URL в опцию.
- Cron не срабатывает: проверьте, активен ли WP Cron или настройте реальный системный cron для wp-cron.php.
- URL не отправляются из-за кеширования: отключите кеширование страницы с ключом
.txt, добавьте исключение в плагинах кеша.
Практические советы по безопасности и производительности
- Храните ключ API IndexNow в
wp-config.phpили используйте константу вместо хардкода в плагине для безопасности:
define('INDEXNOW_API_KEY', 'ваш_ключ_из_IndexNow');
// В коде:
$api_key = defined('INDEXNOW_API_KEY') ? INDEXNOW_API_KEY : '';- Ограничьте размер пакета до 10 URL, чтобы не перегружать сервер и не блокировать индексацию.
- Добавьте логирование ошибок отправки в отдельный файл с ротацией, чтобы отслеживать сбои.
- Используйте транзиенты WordPress для временного хранения URL, если обновления происходят слишком часто.
- Минимизируйте количество вызовов
update_option— собирайте URL в массив и обновляйте опцию раз в несколько минут.
Сравнение вариантов реализации отправки URL в IndexNow для массовых изменений WooCommerce
| Метод | Плюсы | Минусы | Компромисс |
|---|---|---|---|
| Отправка URL сразу при изменении продукта | Простая реализация Мгновенное обновление | Высокая нагрузка при массовых изменениях Риск блокировки API | Подходит для сайтов с низкой частотой изменений |
| Пакетная отправка через Cron (описано выше) | Оптимизация нагрузки Управляемый трафик к IndexNow | Задержка в обновлении индекса Сложнее в отладке | Лучший баланс для крупных магазинов |
| Отправка через очередь сообщений (RabbitMQ, Redis) | Высокая масштабируемость Гибкость управления | Сложная инфраструктура Требует навыков DevOps | Подходит для очень больших проектов |