Диагностика проблемы массовой отправки URL в IndexNow при больших объемах WooCommerce
При масштабных интернет-магазинах на WooCommerce с тысячами товаров и частыми обновлениями (наличие, цена, описание) возникает проблема: одновременная отправка большого количества URL в IndexNow ведет к превышению лимитов API, замедлению сайта и ошибкам в логах. Чаще всего наблюдаются следующие симптомы:
- Ошибки 429 (Too Many Requests) от API IndexNow;
- Падение производительности сайта из-за блокирующих HTTP-запросов;
- Отправка URL происходит не своевременно, либо дублируется;
- Накопление большого объема необработанных URL в базе данных.
Для эффективного решения важно правильно организовать очередь URL с пакетной обработкой и ограничением скорости отправки.
Пошаговое решение: создание очереди и пакетная отправка URL в IndexNow для WooCommerce
1. Отслеживание изменений URL товаров
Используйте хук save_post_product для регистрации URL измененных товаров. Добавьте URL в кастомную очередь в базе (например, отдельную таблицу или опцию с сериализованным массивом).
function enqueue_product_url_for_indexnow($post_id) {
if (get_post_type($post_id) !== 'product') return;
$url = get_permalink($post_id);
$queue = get_option('indexnow_url_queue', []);
if (!in_array($url, $queue)) {
$queue[] = $url;
update_option('indexnow_url_queue', $queue);
}
}
add_action('save_post_product', 'enqueue_product_url_for_indexnow');2. Создание Cron-задачи для пакетной отправки
Настройте WP-Cron, который раз в 5 минут будет отправлять URL пакетами по 10 штук, очищая отправленные из очереди.
function indexnow_send_batch() {
$queue = get_option('indexnow_url_queue', []);
if (empty($queue)) return;
$batch = array_slice($queue, 0, 10);
$api_key = 'ВАШ_КЛЮЧ_API';
$endpoint = 'https://api.indexnow.org/indexnow?key=' . $api_key;
$payload = [
'host' => parse_url(home_url(), PHP_URL_HOST),
'key' => $api_key,
'keyLocation' => home_url('/indexnow-key.txt'),
'urlList' => $batch
];
$response = wp_remote_post($endpoint, [
'body' => json_encode($payload),
'headers' => ['Content-Type' => 'application/json'],
'timeout' => 10
]);
if (!is_wp_error($response) && wp_remote_retrieve_response_code($response) === 200) {
// Удаляем отправленные URL из очереди
$queue = array_slice($queue, count($batch));
update_option('indexnow_url_queue', $queue);
}
}
if (!wp_next_scheduled('indexnow_send_batch_hook')) {
wp_schedule_event(time(), 'five_minutes', 'indexnow_send_batch_hook');
}
add_action('indexnow_send_batch_hook', 'indexnow_send_batch');3. Регистрируем интервал Cron 5 минут
function custom_cron_intervals($schedules) {
$schedules['five_minutes'] = [
'interval' => 300, // 5 минут
'display' => __('Каждые 5 минут')
];
return $schedules;
}
add_filter('cron_schedules', 'custom_cron_intervals');Проверка результата после внедрения
- В базе данных (опции или таблице) должна постепенно уменьшаться очередь URL после выполнения Cron-задачи.
- В логах сервера и WordPress не должно быть ошибок 429 и сетевых таймаутов, связанных с IndexNow.
- Проверить успешность отправки можно через ответ API и статус
wp_remote_retrieve_response_code200. - С помощью внешних инструментов (например, Search Console или панели IndexNow) убедитесь, что URL обновляются в индексе поисковиков.
Частые ошибки и как их исправить
- Ошибка 429 или блокировка API: Обычно вызвана слишком частыми запросами. Решение — увеличить интервал Cron или уменьшить размер пакета.
- Дублирование URL в очереди: Проверьте, что URL добавляются в очередь только один раз. Используйте проверку
in_arrayперед добавлением. - Cron не запускается: Убедитесь, что WordPress Cron активен и что нет конфликтов с плагинами кеширования или серверными настройками.
- URL не обновляются в индексе: Проверьте правильность ключа API, наличие файла ключа
indexnow-key.txtв корне сайта и корректность формата отправляемых данных.
Практические советы по безопасности и производительности
- Храните ключ API IndexNow в
wp-config.phpили в защищенном хранилище, не в базе данных. - Минимизируйте объем данных в очереди — удаляйте устаревшие или дублирующие URL.
- Используйте асинхронные HTTP-запросы, если плагин или тема поддерживают, чтобы не блокировать загрузку страниц.
- Включите логирование ошибок отправки и реализуйте повторную попытку при временных сбоях.
Сравнительная таблица вариантов реализации очереди и отправки URL
| Метод | Плюсы | Минусы |
|---|---|---|
| WP-Cron с опцией в базе (как в статье) | Простота реализации, не требует внешних БД | Опции базы могут расти, ограничение по размеру, возможны коллизии |
| Отдельная таблица MySQL для очереди | Масштабируемость, удобство управления | Сложнее в реализации, требует миграции и очистки |
| Использование внешних очередей (Redis, RabbitMQ) | Высокая производительность, надежность | Требует дополнительной инфраструктуры |