Проблема: почему важна отправка URL вариантов товаров в WooCommerce через IndexNow
В WooCommerce товары часто имеют несколько вариантов (атрибуты, размеры, цвета), каждый из которых может иметь уникальный URL. По умолчанию IndexNow-интеграция отправляет URL только основной страницы товара, что приводит к несвоевременному обновлению индекса поисковиков для вариантов. Это снижает актуальность выдачи и может повлиять на продажи.
Диагностика: как проверить, что IndexNow не отправляет URL вариантов товаров
- Откройте консоль сервера и проверьте логи отправки URL IndexNow - ищите отсутствие URL с параметрами варианта, например
?attribute_pa_color=red. - В панели разработчика браузера проверьте, есть ли на страницах вариантов мета-теги или ссылки, указывающие на уникальные URL.
- Используйте инструмент IndexNow API для просмотра последних отправленных URL — проверьте, есть ли среди них URL с вариантами товаров.
Пошаговое решение: как автоматически отправлять URL вариантов товаров при изменениях
1. Используем хук WooCommerce для отслеживания обновлений вариантов
WooCommerce хранит варианты как дочерние записи типа product_variation. Для отслеживания изменений используем хук save_post_product_variation:
add_action('save_post_product_variation', 'send_indexnow_url_for_variation', 10, 3);
function send_indexnow_url_for_variation($post_ID, $post, $update) {
// Получаем объект варианта
$variation = wc_get_product($post_ID);
if (!$variation) return;
// Получаем родительский товар
$parent_id = $variation->get_parent_id();
$parent = wc_get_product($parent_id);
if (!$parent) return;
// Генерируем URL варианта
$url = $variation->get_permalink();
// Отправляем URL в IndexNow
send_url_to_indexnow($url);
}2. Реализация функции отправки URL в IndexNow
Пример базовой функции, которая отправляет один URL в IndexNow. Замените YOUR_INDEXNOW_KEY и YOUR_INDEXNOW_ENDPOINT на реальные значения.
function send_url_to_indexnow($url) {
$key = 'YOUR_INDEXNOW_KEY';
$endpoint = 'https://api.indexnow.org/indexnow';
$payload = [
'host' => parse_url(home_url(), PHP_URL_HOST),
'key' => $key,
'keyLocation' => home_url('/').$key.'.txt',
'urlList' => [$url],
];
$response = wp_remote_post($endpoint, [
'headers' => ['Content-Type' => 'application/json'],
'body' => json_encode($payload),
'timeout' => 10,
]);
if (is_wp_error($response)) {
error_log('IndexNow error: '.$response->get_error_message());
} elseif (wp_remote_retrieve_response_code($response) !== 200) {
error_log('IndexNow HTTP error: '.wp_remote_retrieve_response_code($response));
}
}3. Обработка массовых обновлений
При массовом обновлении вариантов (например, через импорт) лучше собирать URL в очередь и отправлять пакетами. Для этого используйте транзиенты и Cron:
function queue_indexnow_url($url) {
$queue = get_transient('indexnow_url_queue') ?: [];
if (!in_array($url, $queue)) {
$queue[] = $url;
set_transient('indexnow_url_queue', $queue, 12 * HOUR_IN_SECONDS);
}
}
function indexnow_send_batch() {
$queue = get_transient('indexnow_url_queue');
if (!$queue) return;
$key = 'YOUR_INDEXNOW_KEY';
$endpoint = 'https://api.indexnow.org/indexnow';
$payload = [
'host' => parse_url(home_url(), PHP_URL_HOST),
'key' => $key,
'keyLocation' => home_url('/').$key.'.txt',
'urlList' => $queue,
];
$response = wp_remote_post($endpoint, [
'headers' => ['Content-Type' => 'application/json'],
'body' => json_encode($payload),
]);
if (!is_wp_error($response) && wp_remote_retrieve_response_code($response) === 200) {
delete_transient('indexnow_url_queue');
} else {
error_log('IndexNow batch send error');
}
}
// cron hook
add_action('indexnow_send_batch_hook', 'indexnow_send_batch');
// Запланировать cron, если не запланирован
if (!wp_next_scheduled('indexnow_send_batch_hook')) {
wp_schedule_event(time(), 'hourly', 'indexnow_send_batch_hook');
}Проверка результата после внедрения
- Проверьте логи ошибок сервера на предмет ошибок IndexNow.
- Используйте инструменты IndexNow API для просмотра отправленных URL — должны появиться URL вариантов товаров.
- В браузере откройте страницу варианта товара, скопируйте URL, затем через несколько часов проверьте в поисковиках, что он обновился (например, с помощью оператора site: и параметров варианта).
- При массовом обновлении товаров и вариантов проверьте, что в очереди не накапливаются URL и cron-задание работает корректно.
Частые ошибки и способы их исправления
- Отсутствие ключа IndexNow или неправильный путь к keyLocation. Проверьте, что ключ доступен по URL
https://example.com/YOUR_INDEXNOW_KEY.txt, иначе API отвергнет запрос. - Отправка URL без параметров варианта. Убедитесь, что для варианта вызывается
$variation->get_permalink(), а не основной товар. - Дублирование URL в очереди. Используйте проверку
in_array()перед добавлением URL в транзиент, чтобы избежать переполнения и повторных запросов. - Отсутствие cron-задачи для пакетной отправки. Проверьте планировщик WordPress, используйте плагин WP Crontrol для отладки.
- Ошибка HTTP 403 или 401 при отправке. Проверьте корректность ключа и IP-адреса сервера, используйте HTTPS и валидный сертификат.
Практические советы по безопасности и производительности
- Храните ключ IndexNow вне публично доступных областей, используйте .htaccess или правила сервера для защиты, если ключ не должен быть доступен всем.
- Используйте пакетную отправку URL, чтобы избежать превышения лимитов API и не нагружать сервер.
- Ограничьте частоту отправок URL одного и того же варианта, чтобы не создавать избыточные запросы.
- При большом магазине WooCommerce интегрируйте отправку URL с очередями и WP Cron, чтобы избежать блокировок и ошибок тайм-аутов.
Сравнение подходов к отправке URL вариантов товаров в WooCommerce через IndexNow
| Метод | Плюсы | Минусы | Пример кода |
|---|---|---|---|
| Отправка сразу при сохранении варианта | Мгновенное обновление индекса | Высокая нагрузка при массовых изменениях | save_post_product_variation |
| Очередь и пакетная отправка через Cron | Оптимизация нагрузки, стабильность | Задержка обновления индекса (до часа) | Транзиенты + cron |
| Ручной запуск отправки URL | Полный контроль | Требует вмешательства администратора | WP CLI или кнопка в админке |