Диагностика проблемы с обновлением наличия товаров в WooCommerce и IndexNow
Частая проблема при использовании IndexNow вместе с WooCommerce — индексация устаревшей информации о наличии товаров. Это происходит, когда изменение статуса товара (например, из «в наличии» в «нет в наличии») не приводит к своевременной отправке обновлённого URL в IndexNow. В результате поисковые системы продолжают показывать неверные данные, что негативно сказывается на пользовательском опыте и конверсии.
Чтобы выявить проблему, проверьте:
- Отправляются ли URL в IndexNow при изменении статуса товара. Это можно отследить через логи плагина или с помощью дебага REST-запросов.
- Настроено ли автоматическое срабатывание хуков после обновления товара.
- Не блокируют ли кэш или оптимизаторы вызов функций отправки URL.
- Корректно ли обрабатываются массовые изменения статусов товаров (например, при импорте).
Пошаговое решение: автоматическая отправка URL в IndexNow при изменении наличия товара
1. Используем правильный хук для отслеживания изменений статуса товара
Для WooCommerce статус наличия хранится в мета-данных _stock_status. Лучше всего использовать хук woocommerce_update_product, который срабатывает при обновлении товара, и проверять изменение статуса наличия.
2. Пример кода для отправки URL в IndexNow при изменении наличия
add_action('woocommerce_update_product', 'send_indexnow_url_on_stock_change', 10, 1);
function send_indexnow_url_on_stock_change($product_id) {
$product = wc_get_product($product_id);
if (!$product) {
return;
}
// Получаем текущий статус наличия
$current_stock_status = $product->get_stock_status(); // 'instock' или 'outofstock'
// Получаем прошлое значение из transient, если есть
$prev_status = get_transient('prev_stock_status_' . $product_id);
if ($prev_status !== $current_stock_status) {
// Статус изменился, отправляем URL в IndexNow
$url = get_permalink($product_id);
send_url_to_indexnow($url);
// Обновляем transient
set_transient('prev_stock_status_' . $product_id, $current_stock_status, 12 * HOUR_IN_SECONDS);
}
}
function send_url_to_indexnow($url) {
$indexnow_key = 'ВАШ_КЛЮЧ_API';
$indexnow_endpoint = 'https://api.indexnow.org/indexnow?url=' . urlencode($url) . '&key=' . $indexnow_key;
$response = wp_remote_get($indexnow_endpoint);
if (is_wp_error($response)) {
error_log('IndexNow: ошибка при отправке URL ' . $url . ' - ' . $response->get_error_message());
} else {
error_log('IndexNow: успешно отправлен URL ' . $url);
}
}3. Обработка массовых обновлений статусов
При импорте товаров или массовых изменениях лучше использовать WP-Cron для пакетной отправки URL, чтобы избежать превышения лимитов API и нагрузок.
add_action('my_mass_stock_update_cron', 'send_mass_indexnow_urls');
function send_mass_indexnow_urls() {
$args = [
'post_type' => 'product',
'meta_query' => [
[
'key' => '_stock_status',
'compare' => 'EXISTS',
],
],
'posts_per_page' => 50,
'fields' => 'ids',
];
$products = get_posts($args);
foreach ($products as $product_id) {
$url = get_permalink($product_id);
send_url_to_indexnow($url);
}
}Проверка результата после внедрения
- Проверьте логи ошибок и успешных отправок в
wp-content/debug.log(включите WP_DEBUG и WP_DEBUG_LOG). - Используйте инструменты IndexNow для проверки последней отправки URL.
- Проверьте в поисковых системах актуальность информации о наличии товаров спустя несколько дней.
- При массовых изменениях смотрите нагрузку на сайт и частоту вызова API.
Частые ошибки и их исправление
- Не срабатывает отправка URL при обновлении товара. Проверьте, что хук
woocommerce_update_productподключён и не конфликтует с другими плагинами, отключите кэширование на время теста. - Отправка URL в IndexNow приводит к ошибкам 4xx/5xx. Проверьте правильность ключа API и формат запроса, убедитесь, что сервер может делать исходящие запросы.
- Массовые обновления вызывают превышение лимитов API. Реализуйте пакетную отправку с задержками через WP-Cron.
- Статус наличия меняется, но URL не отправляется повторно. Проверьте логику транзиентов, возможно кеширование мешает обновлению.
Практические советы по производительности и безопасности
- Используйте transient API с разумным временем жизни для хранения предыдущего статуса, чтобы не перегружать базу данных.
- Ограничьте частоту отправки запросов к IndexNow, чтобы не получить блокировки.
- Храните ключ API в
wp-config.phpили через безопасные параметры, не в коде плагина. - При массовых изменениях запускайте отправку URL в фоне через WP-Cron, не при каждом запросе.
- Проверяйте права доступа — отправлять URL должен только администратор или системный процесс.
Сравнение вариантов реализации отправки URL в IndexNow
| Метод | Плюсы | Минусы | Когда использовать |
|---|---|---|---|
Хук woocommerce_update_product + моментальная отправка | Мгновенное обновление индекса, простота реализации | Высокая нагрузка при массовых обновлениях, риск превышения лимитов | Маленькие и средние магазины |
| WP-Cron пакетная отправка | Оптимизация нагрузки, контроль частоты запросов | Задержка между обновлением и индексацией, сложнее настройка | Большие магазины, массовые обновления |
| Ручной запуск через админку | Полный контроль, отсутствие лишних запросов | Требуется вмешательство, нельзя автоматизировать | Малые проекты, редкие обновления |