Диагностика проблемы: почему товары с отсутствием в наличии остаются в индексе
В крупных WooCommerce-магазинах часто возникает ситуация, когда товары, которых нет в наличии, продолжают индексироваться поисковыми системами. Это приводит к попаданию пользователей на неактуальные страницы, увеличению показателя отказов и снижению качества SEO. Главная причина — отсутствие автоматического обновления индекса после изменения статуса товара на «нет в наличии».
Проверить, что такие товары остались в индексе, можно через Google Search Console (раздел «Страницы») или используя API IndexNow для получения списка отправленных URL.
Автоматизация удаления URL товаров без наличия с помощью IndexNow
Настройка отслеживания статуса наличия товара
WooCommerce хранит данные о наличии товара в метаполе _stock_status с возможными значениями instock, outofstock и onbackorder. Чтобы автоматически отправлять запросы на удаление URL товаров, у которых _stock_status изменился на outofstock, используем хук save_post_product.
function indexnow_remove_outofstock_product_url( $post_id ) {
if ( wp_is_post_revision( $post_id ) ) {
return;
}
$stock_status = get_post_meta( $post_id, '_stock_status', true );
if ( $stock_status === 'outofstock' ) {
$url = get_permalink( $post_id );
indexnow_send_url_removal( $url );
}
}
add_action( 'save_post_product', 'indexnow_remove_outofstock_product_url', 20 );Функция отправки URL на удаление в IndexNow
Ниже пример функции, которая формирует запрос на удаление URL через IndexNow API. Важно использовать свой ключ API и endpoint поисковой системы.
function indexnow_send_url_removal( $url ) {
$key = 'ВАШ_КЛЮЧ_INDEXNOW';
$endpoint = 'https://api.indexnow.org/indexnow';
$payload = [
'host' => parse_url( home_url(), PHP_URL_HOST ),
'key' => $key,
'keyLocation' => home_url( 'indexnow-key.txt' ),
'urlList' => [$url],
'action' => 'delete'
];
$response = wp_remote_post( $endpoint, [
'headers' => [ 'Content-Type' => 'application/json' ],
'body' => wp_json_encode( $payload ),
'timeout' => 10
] );
if ( is_wp_error( $response ) ) {
error_log( 'IndexNow removal error: ' . $response->get_error_message() );
} elseif ( wp_remote_retrieve_response_code( $response ) !== 200 ) {
error_log( 'IndexNow removal failed: ' . wp_remote_retrieve_body( $response ) );
}
}Проверка результата после внедрения
Чтобы убедиться, что URL товаров с отсутствием в наличии удаляются из индекса, нужно:
- Изменить статус одного из товаров на «нет в наличии»;
- В логе ошибок (error_log) проверить отсутствие ошибок IndexNow;
- Убедиться, что запрос с параметром
action=deleteбыл отправлен; - Отслеживать через Google Search Console или API IndexNow, что URL удаляется из индекса в течение нескольких дней.
Частые ошибки и как их исправить
- Неправильный ключ IndexNow: убедитесь, что ключ API совпадает с ключом, размещенным в
indexnow-key.txtв корне сайта. - Отправка запросов на добавление вместо удаления: в payload обязательно указывайте
'action' => 'delete'для удаления URL. - Отсутствие правильного хука: хук
save_post_productсрабатывает не всегда — проверяйте, что функция вызывается при изменении наличия, а не только при создании. - Блокировка запросов сервером: проверьте, что wp_remote_post не блокируется firewall или плагинами безопасности.
Практические советы по безопасности и производительности
- Кэширование ключа IndexNow: загрузите ключ один раз при инициализации, чтобы не делать лишних запросов к файлу
indexnow-key.txt. - Ограничение частоты отправки: при массовом обновлении товаров лучше использовать WP Cron для пакетной отправки запросов, чтобы не создавать нагрузку на API и сервер.
- Логирование ошибок: используйте отдельный лог-файл для ошибок IndexNow, чтобы оперативно выявлять проблемы.
- Валидация URL: перед отправкой убедитесь, что URL корректен и соответствует домену сайта.
Сравнение способов автоматического удаления URL товаров с отсутствием в наличии
| Метод | Плагин | Код | Плюсы | Минусы |
|---|---|---|---|---|
| Отправка сразу при смене статуса | Нет | Да (хук save_post_product) | Мгновенное обновление индекса | Может создавать нагрузку при массовом обновлении |
| Пакетная отправка через WP Cron | Возможно, есть плагины | Да (через wp_schedule_event) | Снижает нагрузку, упорядочивает отправку | Задержка между обновлениями, сложность реализации |
| Ручное удаление URL | Плагины SEO | Нет | Простота | Требует ручного контроля, не подходит для больших магазинов |