Проблема отправки большого объема URL из WooCommerce в IndexNow
WooCommerce-магазины часто имеют тысячи товаров, вариаций и пользовательских таксономий. При массовых изменениях (обновление наличия, цен, статусов) необходимо быстро и корректно информировать поисковые системы через IndexNow. Однако массовая отправка URL без контроля нагрузки приводит к ошибкам, превышению лимитов и даже блокировкам со стороны IndexNow API.
Проблемы, с которыми сталкиваются разработчики
- Отправка сотен или тысяч URL за один запрос — IndexNow не принимает большие пакеты.
- Нет контроля частоты запросов — сервер перегружается, возникают таймауты.
- Ошибки повторной отправки одних и тех же URL без проверки статуса.
- Отсутствие логики повторной отправки при сбоев.
Диагностика проблем с отправкой URL из WooCommerce в IndexNow
Для выявления проблем используйте следующие методы:
- Логирование запросов и ответов IndexNow API — ошибки 429 (Too Many Requests) или 500 указывают на перегрузку.
- Отслеживание времени выполнения функций отправки URL — если процесс занимает больше 30 секунд, нужна оптимизация.
- Проверка очереди URL — дублируются ли URL и как часто они повторно отправляются.
- Мониторинг состояния сервера: нагрузка CPU, память, PHP-FPM процессы.
Пошаговое решение: оптимальная очередь и пакетная обработка URL
1. Создание собственной очереди отправки URL
Создайте кастомную таблицу или используйте wp_options с сериализованным массивом для хранения URL, которые нужно отправить. Добавляйте URL при изменении товара, но не отправляйте сразу.
function enqueue_indexnow_url($url) {
$queue = get_option('indexnow_url_queue', []);
if (!in_array($url, $queue)) {
$queue[] = $url;
update_option('indexnow_url_queue', $queue);
}
}2. Пакетная отправка URL по 10-20 штук с интервалом
IndexNow рекомендует отправлять URL пачками до 10-20 штук. Для этого создайте WP-Cron задачу с интервалом в 1-2 минуты, которая будет брать из очереди пакет и отправлять.
function send_indexnow_batch() {
$queue = get_option('indexnow_url_queue', []);
if (empty($queue)) return;
$batch = array_slice($queue, 0, 20);
$endpoint = 'https://api.indexnow.org/indexnow?key=YOUR_KEY&keyLocation=https://your-site.com/key-file.txt';
$response = wp_remote_post($endpoint, [
'headers' => ['Content-Type' => 'application/json'],
'body' => json_encode(['host' => 'your-site.com', 'key' => 'YOUR_KEY', 'urlList' => $batch]),
'timeout' => 15
]);
if (!is_wp_error($response) && wp_remote_retrieve_response_code($response) === 200) {
// Успешная отправка - удаляем из очереди
$queue = array_slice($queue, count($batch));
update_option('indexnow_url_queue', $queue);
} else {
// Логируем ошибку для отладки
error_log('IndexNow send failed: ' . print_r($response, true));
}
}
add_action('indexnow_send_batch_hook', 'send_indexnow_batch');
if (!wp_next_scheduled('indexnow_send_batch_hook')) {
wp_schedule_event(time(), 'two_minutes', 'indexnow_send_batch_hook');
}
// Регистрируем интервал 2 минуты
add_filter('cron_schedules', function($schedules){
$schedules['two_minutes'] = ['interval' => 120, 'display' => 'Every 2 Minutes'];
return $schedules;
});3. Автоматическое добавление URL в очередь при изменении товара
Подключитесь к хукам WooCommerce для отслеживания обновлений товаров и вариаций:
add_action('woocommerce_update_product', function($product_id) {
$url = get_permalink($product_id);
enqueue_indexnow_url($url);
});
add_action('woocommerce_update_product_variation', function($variation_id) {
$url = get_permalink($variation_id);
enqueue_indexnow_url($url);
});Проверка результата после внедрения
- Проверьте, что в
wp_optionsпостепенно уменьшается размер массиваindexnow_url_queueпосле запуска WP-Cron. - Посмотрите логи ошибок сервера и WordPress — отсутствуют ли ошибки отправки.
- Используйте инструмент IndexNow API для проверки состояния ключа и получаемых URL.
- Мониторьте время выполнения и нагрузку сервера — они не должны превышать норму.
Частые ошибки и как исправить
- Отправка слишком большого пакета URL: приводит к ошибкам 400/429. Решение — уменьшить размер пакета до 10-20 URL.
- Дублирование URL в очереди: из-за отсутствия проверки. Решение — использовать проверку
in_arrayпри добавлении в очередь. - Отсутствие повторной отправки при ошибках: приводит к потере обновлений. Решение — логировать ошибки и повторять отправку с экспоненциальной задержкой.
- WP-Cron не запускается из-за низкой посещаемости: используйте системный Cron для надежности.
Практические советы по безопасности и производительности
- Храните ключ API IndexNow вне публичных директорий, например в
wp-config.phpи загружайте динамически. - Ограничьте права пользователя, который может изменять URL-очередь, чтобы избежать злоупотреблений.
- Используйте транзиенты для кеширования результатов отправки и уменьшения нагрузки.
- При больших магазинах рассмотрите использование внешнего очередного сервиса (Redis, RabbitMQ) для управления задачами.
Сравнение подходов к отправке URL
| Метод | Плюсы | Минусы |
|---|---|---|
| Отправка сразу всех URL | Простая реализация | Ошибки API, блокировки, высокая нагрузка |
| Отправка по одному URL при изменении | Точные обновления | Много запросов, нагрузка на сервер |
| Пакетная очередь с WP-Cron | Оптимальная нагрузка, надежность | Сложнее в реализации, зависит от Cron |