Диагностика проблем с отправкой URL в IndexNow при массовых изменениях
При массовом обновлении контента в WordPress и особенно в WooCommerce (например, изменение цен, остатков или атрибутов товаров) часто возникают проблемы с корректной отправкой URL в сервис IndexNow. Основная симптоматика:
- URL не появляются в логе отправки;
- задержки в обработке из-за лимитов на количество запросов;
- ошибки HTTP 429 (Too Many Requests) или тайм-ауты;
- неполное обновление индекса с новыми данными;
- повторные попытки отправки вызывают нагрузку на сервер.
Причины обычно связаны с неправильной реализацией очереди отправки, отсутствием пакетной обработки, игнорированием ограничений IndexNow на частоту запросов или проблемами кэширования в WordPress.
Как реализовать оптимальную очередь и пакетную обработку URL для IndexNow
1. Использование Transient API для очереди URL
Transient API позволяет хранить временные данные с автоматическим удалением по сроку. Для очереди URL стоит использовать транзиенты для накопления адресов перед отправкой.
function indexnow_enqueue_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, HOUR_IN_SECONDS );
}
}2. Пакетная отправка URL с ограничением по количеству
IndexNow рекомендует отправлять не более 1000 URL за один запрос. Для больших объемов лучше делить очередь на пакеты.
function indexnow_send_batch_urls() {
$queue = get_transient( 'indexnow_url_queue' );
if ( empty( $queue ) ) {
return;
}
$batch_size = 1000;
$batch = array_slice( $queue, 0, $batch_size );
$api_key = 'ВАШ_API_КЛЮЧ';
$indexnow_endpoint = 'https://api.indexnow.org/indexnow?url=' . rawurlencode( $batch[0] ) . '&key=' . $api_key . '&keyLocation=' . rawurlencode( site_url( 'indexnow.txt' ) );
$response = wp_remote_post( $indexnow_endpoint, [
'headers' => [ 'Content-Type' => 'application/json' ],
'body' => json_encode([ 'host' => parse_url( home_url(), PHP_URL_HOST ), 'key' => $api_key, 'urlList' => $batch ])
]);
if ( is_wp_error( $response ) || wp_remote_retrieve_response_code( $response ) !== 200 ) {
error_log( 'IndexNow send failed: ' . wp_remote_retrieve_response_message( $response ) );
return;
}
$remaining = array_slice( $queue, $batch_size );
if ( ! empty( $remaining ) ) {
set_transient( 'indexnow_url_queue', $remaining, HOUR_IN_SECONDS );
} else {
delete_transient( 'indexnow_url_queue' );
}
}3. Автоматизация отправки через WP-Cron
Создайте задачу cron для регулярной отправки очереди, чтобы избежать перегрузок при массовых правках.
add_action( 'indexnow_send_batch_hook', 'indexnow_send_batch_urls' );
if ( ! wp_next_scheduled( 'indexnow_send_batch_hook' ) ) {
wp_schedule_event( time(), 'five_minutes', 'indexnow_send_batch_hook' );
}
// Регистрируем интервал 'five_minutes' если не существует
add_filter( 'cron_schedules', function( $schedules ) {
$schedules['five_minutes'] = [
'interval' => 300,
'display' => 'Every Five Minutes'
];
return $schedules;
} );Проверка результата после внедрения решения
Чтобы проверить корректность работы:
- Убедитесь, что в базе или через
get_transient('indexnow_url_queue')накапливаются URL для отправки. - Проверьте логи сервера на сообщения об успешной отправке или ошибках.
- Используйте инструменты отладки WordPress для просмотра cron-задач (например, плагин WP Crontrol) и убедитесь, что задача
indexnow_send_batch_hookвыполняется регулярно. - Проверьте индекс поисковых систем (Bing, Yandex), что изменения отражаются в течение 1-2 дней.
Частые ошибки и как их исправить
- Отправка URL по одному при большом объеме: приводит к блокировкам и ошибкам 429. Решение — пакетная отправка.
- Отсутствие очереди отправки: при массовых изменениях скрипт выполняется слишком долго и выдает тайм-ауты. Нужно использовать транзиенты и WP-Cron.
- Неправильное формирование URL: невалидные или относительные URL приводят к отказу API. Обязательно используйте
esc_url_raw()иhome_url()для построения адресов. - Отсутствие ключа API или неправильный путь к ключу: IndexNow не принимает запросы. Проверьте файл
indexnow.txtв корне сайта и ключ.
Практические советы по безопасности и производительности
- Храните ключ API для IndexNow в
wp-config.phpили в настройках плагина, не в открытом коде. - Используйте nonces и проверки прав при добавлении URL в очередь, если эта функция доступна из публичных хуков.
- Ограничивайте количество URL в очереди, чтобы не создавать излишнюю нагрузку.
- Интегрируйте решение с кешем (например, Clearfy Pro https://wpshop.ru/plugins/clearfy?utm_source=indexnow.su&utm_medium=article&utm_campaign=indexnow-wordpress-i-woocommerce-reshenie-problem-s-otpravkoj-url-pri-massovyh-redaktirovaniyah) для очистки кеша при отправке, чтобы поисковые системы получали актуальные данные.
Сравнение вариантов реализации очереди отправки URL
| Метод | Плюсы | Минусы |
|---|---|---|
| Транзиенты + WP-Cron | Легко реализовать, встроено в WordPress, автоматизация | Зависит от работы WP-Cron, возможны задержки |
| Внешняя очередь (Redis, RabbitMQ) | Высокая производительность, надежность при больших объемах | Сложность настройки, дополнительные зависимости |
| Пакетная отправка при событиях (hook) | Простота, мгновенная отправка при изменениях | Риск тайм-аутов и нагрузки при массовых изменениях |