IndexNow и WooCommerce: оптимизация отправки URL при массовом обновлении остатков товаров

Диагностика проблемы массовой отправки 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) Максимальная производительность и масштабируемость Сложность внедрения, зависимость от инфраструктуры Для крупных проектов с высокой нагрузкой

Добавь в закладки и поделись с друзьями:

⭐⭐⭐⭐⭐
IndexNow автоматическая отправка URL при изменении постов WordPress
07.02.2026
WordPress автоматическое удаление устаревших страниц из индекса с помощью IndexNow
07.11.2025
Как использовать IndexNow для удаления старых URL из WordPress
17.02.2026
IndexNow в WordPress: отладка проблем со сбором и отправкой URL
13.07.2026
IndexNow и WooCommerce: оптимизация отправки URL при массовом обновлении остатков товаров
26.07.2026
×

AI-плагин

WPGPT
Сам создает статьи для вашего сайта WordPress

SEO и мета-теги

Парсинг конкурентов

Изображения

Комментарии

Подробнее