Диагностика проблемы с индексацией товаров при изменении остатков
В интернет-магазинах на WooCommerce частые изменения статуса наличия товаров (например, из "в наличии" в "нет в наличии" и обратно) не всегда корректно отражаются в поисковых системах. Это связано с тем, что поисковый бот может не сразу узнать о смене статуса товара, если URL не обновляется или не отправляется автоматически через IndexNow.
Основные признаки проблемы:
- Поисковая выдача показывает устаревшую информацию о наличии товара.
- Товары, которых нет в наличии, продолжают индексироваться и занимать место в выдаче.
- Отсутствие автоматической отправки URL в IndexNow при изменении статуса товара.
Как автоматически отправлять URL товаров в IndexNow при изменении остатков в WooCommerce
1. Использование хука woocommerce_update_product для отслеживания изменений товаров
Хук woocommerce_update_product срабатывает при обновлении любого товара. Можно использовать его для проверки изменений в поле наличия и отправки URL в IndexNow.
2. Пример кода для автоматической отправки URL
add_action('woocommerce_update_product', 'indexnow_send_url_on_stock_change', 10, 1);
function indexnow_send_url_on_stock_change($product_id) {
static $previous_stock_status = [];
$product = wc_get_product($product_id);
if (!$product) {
return;
}
$current_status = $product->get_stock_status(); // 'instock' или 'outofstock'
// Проверка изменения статуса наличия
if (isset($previous_stock_status[$product_id]) && $previous_stock_status[$product_id] === $current_status) {
return; // Статус не изменился, отправлять не нужно
}
$previous_stock_status[$product_id] = $current_status;
// Формируем URL товара
$url = get_permalink($product_id);
// Отправка через IndexNow
indexnow_send_url($url);
}
function indexnow_send_url($url) {
$indexnow_key = 'ВАШ_КЛЮЧ_API_INDEXNOW'; // Замените на ваш ключ
$endpoint = 'https://api.indexnow.org/indexnow';
$payload = json_encode([
'host' => parse_url(home_url(), PHP_URL_HOST),
'key' => $indexnow_key,
'keyLocation' => home_url('/'.$indexnow_key.'.txt'),
'urlList' => [$url]
]);
$args = [
'headers' => [
'Content-Type' => 'application/json'
],
'body' => $payload,
'timeout' => 10
];
$response = wp_remote_post($endpoint, $args);
if (is_wp_error($response)) {
error_log('IndexNow отправка URL не удалась: ' . $response->get_error_message());
} elseif (wp_remote_retrieve_response_code($response) !== 200) {
error_log('IndexNow получил ошибочный ответ: ' . wp_remote_retrieve_response_code($response));
}
}В этом коде мы отслеживаем изменение статуса наличия товара и при его изменении отправляем URL в IndexNow.
Проверка результата после внедрения
- Обновите наличие товара в админке WooCommerce.
- Проверьте логи ошибок PHP (если включено) на предмет сообщений об ошибках отправки.
- Используйте инструмент отладки IndexNow или сторонние сервисы для проверки успешной отправки URL.
- Через несколько дней убедитесь, что поисковики обновляют данные о товаре.
Частые ошибки и как их исправить
- Неправильный ключ API IndexNow: проверьте, что ключ совпадает с опубликованным файлом
ВАШ_КЛЮЧ_API_INDEXNOW.txtв корне сайта. - Отсутствие файла ключа на сайте: IndexNow требует файл с ключом для верификации. Создайте файл с именем
ВАШ_КЛЮЧ_API_INDEXNOW.txtи содержимым ключа в корне сайта. - Проблемы с SSL: убедитесь, что сайт доступен по HTTPS без ошибок сертификата, иначе IndexNow не примет запросы.
- Кэширование: если используется агрессивное кэширование, настройте исключения для URL товаров или автоматическую очистку кэша при изменении наличия.
- Отсутствие проверки изменения статуса: без проверки статус может отправляться при любом обновлении товара, перегружая IndexNow и снижая эффективность.
Практические советы по производительности и безопасности
- Используйте transient или опции для хранения предыдущего статуса наличия, чтобы не держать массив в статике и не терять данные при перезапуске PHP.
- Добавьте ограничение частоты отправок URL для одного товара, например, не чаще 1 раза в час.
- Отправляйте URL пакетами, если обновляется много товаров сразу (например, при массовом обновлении остатков), чтобы не создавать множество отдельных запросов.
- Храните ключ API в
wp-config.phpили в безопасных настройках, не в коде напрямую.
Сравнение способов реализации автоматической отправки URL при изменении остатков
| Метод | Преимущества | Недостатки | Рекомендуемая сфера |
|---|---|---|---|
Хук woocommerce_update_product + кастомный код | Гибкость, можно кастомизировать логику, без плагинов | Требует навыков разработки, ручная поддержка | Магазины с уникальными требованиями, опытные разработчики |
| Плагины IndexNow для WooCommerce | Простота установки, готовые решения | Могут быть избыточными, нагрузка, ограниченная кастомизация | Малые и средние магазины без команды разработчиков |