Диагностика проблемы: почему SKU и варианты товаров не всегда индексируются корректно
В интернет-магазинах на WooCommerce часто возникает ситуация, когда поисковые системы не индексируют все варианты товаров (например, разные цвета, размеры) или их SKU. Причины могут быть следующими:
- Отсутствие отправки URL вариантов товаров в IndexNow;
- Использование AJAX для загрузки вариаций без обновления URL;
- Неправильная конфигурация канонических URL, которые указывают на основной товар, игнорируя вариации;
- Большое количество вариаций приводит к превышению лимита отправляемых URL;
- Отсутствие автоматизации при изменении статуса товара или вариаций.
Чтобы исправить эти проблемы, необходимо настроить грамотную интеграцию WooCommerce с IndexNow, учитывающую особенности SKU и вариаций.
Пошаговое решение: автоматическая отправка URL SKU и вариантов в IndexNow
1. Формируем список URL вариаций и SKU
В WooCommerce вариации — это дочерние продукты типа product_variation. Для каждой вариации нужно получить URL и SKU. Пример кода для сбора URL всех опубликованных вариаций:
function get_all_variation_urls() {
$args = [
'post_type' => 'product_variation',
'post_status' => 'publish',
'numberposts' => -1
];
$variations = get_posts($args);
$urls = [];
foreach ($variations as $variation) {
$variation_obj = wc_get_product($variation->ID);
if ($variation_obj) {
$urls[] = $variation_obj->get_permalink();
}
}
return $urls;
}2. Автоматическая отправка URL при изменении вариации
Используем хук save_post_product_variation, чтобы отправлять URL в IndexNow сразу после обновления вариации:
add_action('save_post_product_variation', 'send_variation_url_to_indexnow', 10, 3);
function send_variation_url_to_indexnow($post_id, $post, $update) {
if ($post->post_status !== 'publish') {
return; // Отправляем только опубликованные вариации
}
$product = wc_get_product($post_id);
if (!$product) {
return;
}
$url = $product->get_permalink();
// Функция отправки в IndexNow
indexnow_send_url($url);
}
function indexnow_send_url($url) {
$key = 'ВАШ_КЛЮЧ_INDEXNOW';
$endpoint = 'https://api.indexnow.org/indexnow?url=' . urlencode($url) . '&key=' . $key;
$response = wp_remote_get($endpoint);
// Логируем ответ для отладки
if (is_wp_error($response)) {
error_log('IndexNow error: ' . $response->get_error_message());
} else {
error_log('IndexNow response: ' . wp_remote_retrieve_body($response));
}
}3. Пакетная отправка URL для большого каталога
При большом количестве вариаций отправлять URL по одному не эффективно. Используйте пакетную отправку (до 1000 URL за запрос):
function indexnow_send_urls_batch(array $urls) {
$key = 'ВАШ_КЛЮЧ_INDEXNOW';
$endpoint = 'https://api.indexnow.org/indexnow';
$body = [
'host' => parse_url(home_url(), PHP_URL_HOST),
'key' => $key,
'keyLocation' => home_url('/' . $key . '.txt'),
'urlList' => $urls
];
$response = wp_remote_post($endpoint, [
'headers' => ['Content-Type' => 'application/json'],
'body' => wp_json_encode($body),
'timeout' => 10
]);
if (is_wp_error($response)) {
error_log('IndexNow batch error: ' . $response->get_error_message());
} else {
error_log('IndexNow batch response: ' . wp_remote_retrieve_body($response));
}
}Проверка результата: как убедиться, что SKU и варианты отправляются правильно
- Проверьте логи ошибок сервера или wp_debug.log — там должны быть записи с ответом от IndexNow;
- Отправьте ручной запрос с URL вариации и проверьте ответ сервиса IndexNow (HTTP 200 – успех);
- Используйте инструменты поисковых систем для проверки индексации вариантов (например, Bing Webmaster Tools);
- Убедитесь, что на сайте доступны уникальные URL для каждой вариации, а канонические ссылки не блокируют их индексирование;
- Проверьте, что редиректы на уровне сервера и плагинов не мешают доступу к вариациям.
Частые ошибки и как их исправить
- Отправка URL без проверки статуса публикации вариации. Решение: фильтруйте вариации по статусу
publish, чтобы не отправлять неактивные страницы. - Неверный ключ IndexNow или отсутствие файла ключа на сайте. Проверьте, что ключ соответствует заданному и размещён по адресу
https://ваш-сайт/ключ.txt. - Переотправка большого количества URL без лимита. Используйте пакетную отправку и лимитируйте частоту запросов, чтобы не получить бан от IndexNow.
- Канонические URL указывают на главный товар, а не на вариации. Настройте правильные канонические ссылки для вариаций, если хотите их индексировать.
- Проблемы с кэшированием. После отправки URL очищайте кэш страниц с вариациями, чтобы поисковики видели актуальный контент.
Практические советы по безопасности и производительности
- Храните ключ IndexNow вне публичных директорий, используйте константы в
wp-config.phpили защищённые опции. - Ограничьте количество запросов к API IndexNow: рекомендуют не более 10 000 URL в сутки и пакетами до 1000 URL.
- Используйте транзиенты или опции для кеширования списка URL вариаций, чтобы не делать дорогостоящие запросы к базе при каждом сохранении.
- Для больших магазинов с десятками тысяч вариаций используйте WP-Cron или внешние планировщики для пакетной отправки URL с интервалом в несколько минут.
- Обратите внимание на правильное управление редиректами: постоянные 301 редиректы должны сопровождаться удалением старых URL из индекса через IndexNow.
Сравнение подходов к отправке URL вариаций в IndexNow
| Метод | Преимущества | Недостатки | Рекомендации |
|---|---|---|---|
| Отправка URL при сохранении вариации (по одному) | Простая реализация и мгновенная отправка | Большая нагрузка при массовых изменениях, риск превышения лимитов | Использовать для небольших магазинов или единичных обновлений |
| Пакетная отправка по расписанию (WP-Cron) | Оптимальная нагрузка, контроль лимитов, подходит для больших магазинов | Сложнее в реализации, задержка между изменением и отправкой | Рекомендуется для магазинов с большим каталогом |
| Ручная отправка через админку или CLI | Полный контроль, возможность выборочной отправки | Требует участия администратора, не автоматизировано | Использовать для отладки и единичных случаев |