Диагностика проблемы массовой отправки URL в IndexNow при обновлении остатков товаров WooCommerce
При массовом обновлении остатков товаров в WooCommerce часто возникает проблема с отправкой URL в IndexNow. Стандартная автоматизация отправки URL может не справляться с большим объемом данных: отправка происходит слишком часто или, наоборот, задерживается, что приводит к расходу лимитов API и задержкам в обновлении индекса поисковиков.
Типичные симптомы:
- Задержка обновления индекса после массовых изменений остатков.
- Ошибки 429 (Too Many Requests) от IndexNow API.
- Перегрузка сервера из-за одновременной отправки большого количества запросов.
Как проверить проблему?
Для начала включите логирование отправки URL в IndexNow. Если используется собственный плагин или кастомный код, добавьте логирование HTTP-ответов и статусов отправки. Например:
function log_indexnow_response( $response, $urls ) {
error_log( 'IndexNow отправка URL: ' . implode( ',', $urls ) );
error_log( 'Ответ API: ' . wp_remote_retrieve_response_message( $response ) );
}
// Вызов внутри функции отправки
log_indexnow_response( $response, $urls );Также проверьте серверные логи на наличие ошибок 429 или превышения лимитов.
Пошаговое решение: оптимизация очереди и пакетной отправки URL при обновлении остатков WooCommerce
1. Создание очереди URL для отправки
Используйте transient API или отдельную таблицу для накопления URL товаров, изменившихся в остатках. Ниже пример с transient:
function enqueue_indexnow_url( $url ) {
$queue = get_transient( 'indexnow_url_queue' );
if ( ! is_array( $queue ) ) {
$queue = [];
}
if ( ! in_array( $url, $queue, true ) ) {
$queue[] = $url;
set_transient( 'indexnow_url_queue', $queue, 12 * HOUR_IN_SECONDS );
}
}2. Хук на массовое обновление остатков
Используйте хук woocommerce_update_product_stock для добавления URL товаров в очередь при изменении остатков:
add_action( 'woocommerce_update_product_stock', function( $product ) {
$url = get_permalink( $product->get_id() );
enqueue_indexnow_url( $url );
} );3. Пакетная отправка очереди через WP-Cron
Настройте WP-Cron задачу, которая будет раз в 10-15 минут отправлять накопленные URL пакетами по 10-20 штук:
function send_indexnow_urls_batch() {
$queue = get_transient( 'indexnow_url_queue' );
if ( empty( $queue ) || ! is_array( $queue ) ) {
return;
}
$batch_size = 20;
$batch = array_splice( $queue, 0, $batch_size );
$api_url = 'https://api.indexnow.org/indexnow';
$key = 'ВАШ_API_КЛЮЧ';
$payload = json_encode(["host" => parse_url( home_url(), PHP_URL_HOST), "key" => $key, "keyLocation" => home_url("key.txt"), "urlList" => $batch]);
$response = wp_remote_post( $api_url, [
'body' => $payload,
'headers' => [ 'Content-Type' => 'application/json' ],
'timeout' => 15,
]);
if ( ! is_wp_error( $response ) && wp_remote_retrieve_response_code( $response ) === 200 ) {
// Удаляем отправленные URL из очереди
set_transient( 'indexnow_url_queue', $queue, 12 * HOUR_IN_SECONDS );
error_log( 'IndexNow: успешно отправлено URL: ' . implode( ',', $batch ) );
} else {
error_log( 'IndexNow: ошибка отправки: ' . wp_remote_retrieve_response_message( $response ) );
}
}
if ( ! wp_next_scheduled( 'indexnow_send_urls_cron' ) ) {
wp_schedule_event( time(), 'fifteen_minutes', 'indexnow_send_urls_cron' );
}
add_action( 'indexnow_send_urls_cron', 'send_indexnow_urls_batch' );4. Регистрация интервала Cron 15 минут
add_filter( 'cron_schedules', function( $schedules ) {
$schedules['fifteen_minutes'] = [
'interval' => 900,
'display' => 'Каждые 15 минут',
];
return $schedules;
} );Проверка результата после внедрения решения
- В логах сервера должны появляться сообщения об успешной отправке URL пакетами.
- Через 1-2 часа после массового обновления остатков проверьте, что URL товаров обновились в индексе (через search console или API поисковиков).
- Отсутствие ошибок 429 или превышения лимитов в логах.
- Снижение нагрузки на сервер в периоды массовых обновлений остатков.
Частые ошибки и как их исправить
- Отсутствие планировщика WP-Cron: Если WP-Cron не срабатывает (например, на низкоактивных сайтах), настройте системный cron для запуска
wp-cron.phpили реализуйте внешний триггер. - Повторяющиеся URL в очереди: Используйте проверку
in_array, чтобы не дублировать URL, иначе API может блокировать за повторные запросы. - Ошибки 429 при частых запросах: Увеличьте интервал отправки или уменьшите размер пакета URL.
- Некорректный ключ API: Проверьте, что ключ IndexNow указан правильно и файл ключа доступен по адресу
https://example.com/key.txt.
Практические советы по безопасности и производительности
- Не храните ключ API в открытых файлах темы — используйте константы в
wp-config.phpили защищенные переменные окружения. - Ограничивайте размер пакетов для отправки URL — 10-20 URL за раз оптимальны для большинства хостингов.
- Используйте объекты кеширования (например, Redis или Memcached) вместо transient на крупных сайтах для надежного хранения очереди.
- Логирование отправки URL отключайте в рабочем режиме, чтобы не перегружать лог-файлы.
- Проверяйте время выполнения WP-Cron задачи, чтобы избежать тайм-аутов при больших объемах данных.
Сравнение вариантов реализации очереди отправки URL
| Метод | Плюсы | Минусы | Рекомендации |
|---|---|---|---|
| Transient API | Простая реализация, не требует доп. таблиц | Ограничен по объему, зависит от типа кеша | Подходит для сайтов с небольшим числом товаров |
| Отдельная таблица в базе | Гибкая, подходит для больших сайтов | Нужно писать SQL-запросы, администрировать таблицу | Рекомендуется для магазинов >10 000 товаров |
| Внешние очереди (Redis, RabbitMQ) | Максимальная производительность и масштабируемость | Сложность внедрения, зависимость от инфраструктуры | Для крупных проектов с высокой нагрузкой |