Оптимальная очередь и пакетная обработка URL для IndexNow в WooCommerce

Почему важно правильно организовать очередь отправки 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 с готовой логикойЭкономия времениМожет быть избыточно или не адаптировано под большие магазины

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

⭐⭐⭐⭐⭐
IndexNow и WooCommerce: автоматическое удаление товаров с отсутствием в наличии
09.05.2026
IndexNow для WooCommerce: автоматическое отправление URL при изменении атрибутов товаров
20.06.2026
Как сделать обновление метаданных WordPress без изменения контента
04.12.2025
IndexNow и SSL в WordPress: практические советы по устранению проблем с индексацией
17.01.2026
Как автоматизировать удаление и обновление URL в WordPress с помощью Webhooks и IndexNow
04.04.2026
×

AI-плагин от WPShop.ru

анализирует конкурентов

пишет статьи

готовит SEO

генерирует изображения

и еще кое-что...
WPGPT
Плагин, который наполняет ваш сайт WordPress
Узнать больше