Диагностика проблемы: почему отсутствующие товары продолжают индексироваться
В WooCommerce часто возникает ситуация, когда товары со статусом "отсутствует на складе" или "нет в наличии" продолжают появляться в поисковой выдаче. Это происходит из-за того, что поисковые системы не получают своевременную информацию об изменении статуса или удалении товара с сайта. В результате снижается релевантность выдачи и увеличивается количество неактуальных страниц в индексе.
Для решения этой задачи можно использовать протокол IndexNow, который позволяет оперативно уведомлять поисковики об изменениях URL, включая удаление неактуальных страниц.
Как автоматически отправлять IndexNow уведомления об отсутствии товаров в WooCommerce
Использование хуков WooCommerce для отслеживания изменения статуса товара
WooCommerce хранит статус наличия товара в метаполе _stock_status. При изменении статуса с "instock" на "outofstock" нужно отправить уведомление в IndexNow, чтобы поисковики удалили URL товара из индекса.
Ниже пример кода для functions.php вашей темы или в виде мини-плагина:
add_action('update_postmeta', 'indexnow_woocommerce_stock_status_change', 10, 4);
function indexnow_woocommerce_stock_status_change($meta_id, $post_id, $meta_key, $_meta_value) {
if ($meta_key !== '_stock_status') {
return;
}
$old_status = get_metadata_by_mid('post', $meta_id)->meta_value ?? null;
$new_status = $_meta_value;
if ($old_status === $new_status) {
return; // статус не изменился
}
if ($new_status === 'outofstock') {
$url = get_permalink($post_id);
if ($url) {
indexnow_send_url($url);
}
}
}
function indexnow_send_url($url) {
$key = 'ВАШ_КЛЮЧ_INDEXNOW'; // вставьте свой ключ
$endpoint = 'https://api.indexnow.org/indexnow';
$payload = [
'host' => parse_url($url, PHP_URL_HOST),
'key' => $key,
'keyLocation' => home_url('/') . $key . '.txt',
'urlList' => [$url],
];
$args = [
'headers' => [
'Content-Type' => 'application/json',
],
'body' => wp_json_encode($payload),
'timeout' => 10,
];
$response = wp_remote_post($endpoint, $args);
if (is_wp_error($response)) {
error_log('IndexNow error: ' . $response->get_error_message());
} else {
error_log('IndexNow sent for URL: ' . $url);
}
}Обратите внимание, что необходимо создать в корне сайта файл ВАШ_КЛЮЧ_INDEXNOW.txt с содержимым ключа для верификации на стороне IndexNow.
Проверка результата после внедрения
Для проверки работы решения выполните следующие шаги:
- Измените статус наличия товара в админке WooCommerce с "в наличии" на "нет в наличии".
- Просмотрите лог ошибок PHP (error_log) или используйте плагин для просмотра логов — там должно появиться сообщение об успешной отправке URL в IndexNow.
- Проверьте в Google Search Console или Bing Webmaster Tools, что URL товара помечается как удалённый из индекса (обычно это занимает некоторое время).
Частые ошибки и как их исправить
- Неверный ключ IndexNow или отсутствует файл в корне сайта: убедитесь, что файл
ВАШ_КЛЮЧ_INDEXNOW.txtдоступен по адресуhttps://ваш-сайт.ru/ВАШ_КЛЮЧ_INDEXNOW.txtи содержит правильную строку ключа. - Хук не срабатывает при обновлении статуса: метаполе может обновляться не через
update_postmeta, тогда используйте альтернативные хуки, напримерwoocommerce_update_productилиsave_post_product, с проверкой метаполей. - Отправка уведомления не происходит: проверьте, что у вас включена функция
wp_remote_post, и нет блокировок на сервере для внешних запросов. - URL не соответствует каноническому: используйте
get_permalinkдля получения точного URL товара, чтобы избежать проблем с индексированием.
Практические советы по безопасности и производительности
- Не храните ключ IndexNow в открытом виде в публичных файлах темы — лучше определить его в
wp-config.phpили в настройках плагина с ограничением доступа. - Добавьте дебаунс или кеширование отправки URL, чтобы избежать частых повторных запросов при массовом обновлении товаров.
- Рекомендуется использовать WP Cron для пакетной отправки URL в случае массовых изменений, чтобы не перегружать сервер.
Сравнение вариантов реализации автоматического удаления URL товара из индекса
| Способ | Плюсы | Минусы |
|---|---|---|
Хук update_postmeta | Точная реакция на изменение статуса, простота реализации | Может не сработать при массовом обновлении, требует логирования |
| WP Cron пакетной отправки URL | Экономит ресурсы при массовых изменениях, гибкость | Задержка в отправке уведомлений, сложнее в настройке |
| Плагины с интеграцией IndexNow | Удобство, поддержка обновлений, интерфейс | Меньше контроля, возможна нагрузка, платные решения |
Чек-лист для внедрения автоматического удаления отсутствующих товаров из индекса с помощью IndexNow
- Создать и разместить файл ключа IndexNow в корне сайта
- Настроить хук для отслеживания изменения статуса товара
- Реализовать функцию отправки URL в API IndexNow
- Проверить логи ошибок и успешных отправок
- Протестировать изменение статуса товара и проверку индексации в поисковиках
- Рассмотреть автоматизацию отправки через WP Cron при большом количестве товаров
- Обеспечить безопасность хранения ключа