Почему важно правильно организовать очередь отправки URL в WooCommerce с IndexNow
В больших интернет-магазинах на WooCommerce количество товаров и их вариаций может достигать десятков тысяч. При массовых изменениях — обновление остатков, цен, статусов доступности — некорректная отправка URL в IndexNow приводит к перегрузке API, ошибкам и задержкам в индексации. Правильная организация очереди и пакетная отправка URL решают эти проблемы, минимизируют нагрузку на сервер и повышают эффективность индексации поисковиками.
Диагностика проблем с отправкой URL в WooCommerce и IndexNow
Типичные признаки неправильной обработки очереди
- Большое количество ошибок 429 (Too Many Requests) от API IndexNow;
- Задержки или отсутствие обновлений в индексе после массовых изменений;
- Нестабильная работа сайта из-за долгих PHP-процессов, связанных с отправкой URL;
- Потеря URL в очереди из-за тайм-аутов или ошибок выполнения Cron-задач.
Инструменты для проверки
- Логи сервера и ошибок WordPress (wp-content/debug.log);
- Отладочный вывод с помощью
error_log()в функциях отправки URL; - Проверка ответа IndexNow API через curl или Postman;
- Плагины для мониторинга Cron-задач, например WP Crontrol.
Пошаговое решение: реализация оптимальной очереди и пакетной отправки URL
1. Создание таблицы для хранения очереди URL
Используем собственную таблицу в базе данных для надежного хранения и управления URL, которые нужно отправить.
global $wpdb;
$table_name = $wpdb->prefix . 'indexnow_queue';
$charset_collate = $wpdb->get_charset_collate();
$sql = "CREATE TABLE $table_name (
id bigint(20) unsigned NOT NULL AUTO_INCREMENT,
url varchar(2083) NOT NULL,
status tinyint(1) NOT NULL DEFAULT 0, /* 0 - в очереди, 1 - отправлен */
created_at datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (id),
UNIQUE KEY url (url)
) $charset_collate;";
require_once( ABSPATH . 'wp-admin/includes/upgrade.php' );
dbDelta( $sql );2. Добавление URL в очередь после событий обновления товаров
Подключаемся к хукам WooCommerce, например woocommerce_update_product, чтобы добавить URL измененного товара.
function enqueue_indexnow_url( $product_id ) {
if ( ! $product_id ) {
return;
}
$url = get_permalink( $product_id );
if ( ! $url ) {
return;
}
global $wpdb;
$table_name = $wpdb->prefix . 'indexnow_queue';
$wpdb->query( $wpdb->prepare(
"INSERT IGNORE INTO $table_name (url) VALUES (%s)",
$url
) );
}
add_action( 'woocommerce_update_product', 'enqueue_indexnow_url' );3. Реализация пакетной отправки URL по Cron
Для снижения нагрузки отправляем URL пакетами по 100 штук каждые 10 минут.
function indexnow_send_batch_urls() {
global $wpdb;
$table_name = $wpdb->prefix . 'indexnow_queue';
$batch_size = 100;
$urls = $wpdb->get_col( "SELECT url FROM $table_name WHERE status = 0 LIMIT $batch_size" );
if ( empty( $urls ) ) {
return;
}
$api_endpoint = 'https://api.indexnow.org/indexnow';
$key = 'YOUR_INDEXNOW_KEY';
$payload = [
'host' => parse_url( home_url(), PHP_URL_HOST ),
'key' => $key,
'keyLocation' => home_url( '/indexnow-key.txt' ),
'urlList' => $urls,
];
$response = wp_remote_post( $api_endpoint, [
'headers' => [ 'Content-Type' => 'application/json' ],
'body' => wp_json_encode( $payload ),
'timeout' => 15,
]);
if ( is_wp_error( $response ) || wp_remote_retrieve_response_code( $response ) !== 200 ) {
error_log( 'IndexNow batch send failed: ' . print_r( $response, true ) );
return;
}
// Помечаем отправленные URL как обработанные
foreach ( $urls as $url ) {
$wpdb->update( $table_name, [ 'status' => 1 ], [ 'url' => $url ] );
}
}
add_action( 'indexnow_batch_send_cron', 'indexnow_send_batch_urls' );
// Регистрация Cron-задачи
if ( ! wp_next_scheduled( 'indexnow_batch_send_cron' ) ) {
wp_schedule_event( time(), 'ten_minutes', 'indexnow_batch_send_cron' );
}
// Добавление интервала 10 минут
add_filter( 'cron_schedules', function( $schedules ) {
$schedules['ten_minutes'] = [
'interval' => 600,
'display' => 'Every 10 Minutes'
];
return $schedules;
} );Проверка результата после внедрения
- Проверить таблицу
wp_indexnow_queue: статус URL должен переходить в 1 после успешной отправки. - В логах error.log не должно появляться ошибок отправки.
- Проверить HTTP-ответ API IndexNow через логи или отладчик — должен быть 200 OK.
- Проверить в панели WooCommerce и на сайте, что нет задержек при обновлении товаров.
- Использовать инструменты поисковых систем (например, Bing Webmaster Tools) для отслеживания индексации новых URL.
Частые ошибки и как их исправить
- Ошибка 429 Too Many Requests: частая отправка URL без очереди. Решение — использовать пакетную отправку и увеличить интервал Cron.
- Дублирование URL в очереди: возникает при отсутствии уникального ограничения. Решение — добавить уникальный индекс на поле URL в таблице.
- Потеря URL после сбоя: если сразу удаляете URL из очереди, может возникнуть потеря данных. Решение — менять статус на «отправлен» после успешного ответа API.
- Долгое выполнение Cron-задачи: отправка слишком большого количества URL за раз. Решение — уменьшить размер пакета.
Практические советы по безопасности и производительности
- Храните ключ IndexNow в
wp-config.phpили в защищенных опциях, не в открытом коде. - Используйте
wp_remote_postс таймаутом, чтобы избежать зависаний. - Регулярно очищайте таблицу очереди от старых и обработанных записей, например, с помощью отдельной Cron-задачи.
- Проверяйте нагрузку на сервер и при необходимости корректируйте частоту отправки и размер пакета.
- Для сайтов с большим количеством вариаций товаров расширяйте очередь с учетом вариаций, чтобы не пропускать их изменения.
Сравнение подходов к отправке URL в IndexNow для WooCommerce
| Метод | Описание | Плюсы | Минусы |
|---|---|---|---|
| Отправка сразу при событии | Отправка URL прямо при обновлении товара | Простая реализация | Высокая нагрузка, ошибки 429 |
| Очередь + пакетная отправка (рекомендуется) | Добавление URL в таблицу и периодическая отправка пакетами | Стабильность, контроль нагрузки, надежность | Сложнее реализовать, требуется управление очередью |
| Использование сторонних плагинов | Плагины для IndexNow с готовой логикой | Экономия времени | Может быть избыточно или не адаптировано под большие магазины |