Диагностика проблемы с индексацией отсутствующих товаров в WooCommerce
В интернет-магазинах на WooCommerce часто возникает ситуация, когда товары, которых нет в наличии, продолжают индексироваться поисковыми системами. Это ведет к снижению качества индекса, появлению неактуальных страниц в результатах поиска и ухудшению пользовательского опыта.
Проверить наличие такой проблемы можно с помощью анализа поисковых выдач и инструментов для веб-мастеров (например, Bing Webmaster Tools или Google Search Console) — если в индексе остаются товары с меткой «нет в наличии», значит, индексация не настроена корректно.
Как определить статус наличия товаров программно
WooCommerce хранит статус наличия в мета-поле _stock_status. Значения могут быть instock (в наличии) или outofstock (нет в наличии). Этот параметр удобно использовать для фильтрации товаров.
Пошаговое решение: автоматическая отправка IndexNow для удаления товаров без наличия
Ниже представлен пример реализации автоматической отправки URL товаров с отсутствием запасов в IndexNow для удаления из индекса.
1. Реализация функции отправки URL в IndexNow
function send_url_to_indexnow($url) {
$key = 'ВАШ_КЛЮЧ_INDEXNOW';
$host = 'https://api.indexnow.org/indexnow';
$payload = [
'host' => parse_url(home_url(), PHP_URL_HOST),
'key' => $key,
'keyLocation' => home_url('/indexnow-key.txt'),
'urlList' => [$url],
];
$args = [
'headers' => [
'Content-Type' => 'application/json',
],
'body' => json_encode($payload),
'timeout' => 10,
];
$response = wp_remote_post($host, $args);
if (is_wp_error($response)) {
error_log('IndexNow отправка не удалась: ' . $response->get_error_message());
return false;
}
$code = wp_remote_retrieve_response_code($response);
if ($code === 200) {
return true;
} else {
error_log('IndexNow вернул код ответа: ' . $code);
return false;
}
}2. Отправка URL товара при смене статуса наличия на «outofstock»
add_action('save_post_product', 'send_outofstock_product_to_indexnow', 20, 3);
function send_outofstock_product_to_indexnow($post_ID, $post, $update) {
if ($post->post_status !== 'publish') {
return;
}
$stock_status = get_post_meta($post_ID, '_stock_status', true);
if ($stock_status === 'outofstock') {
$url = get_permalink($post_ID);
send_url_to_indexnow($url);
}
}3. Регулярная проверка и отправка всех отсутствующих товаров (Cron)
Добавьте задание Cron для периодической отправки URL товаров без наличия, чтобы исключить пропуски при массовых изменениях.
if (!wp_next_scheduled('send_outofstock_products_indexnow_cron')) {
wp_schedule_event(time(), 'hourly', 'send_outofstock_products_indexnow_cron');
}
add_action('send_outofstock_products_indexnow_cron', function() {
$args = [
'post_type' => 'product',
'post_status' => 'publish',
'meta_query' => [
[
'key' => '_stock_status',
'value' => 'outofstock',
],
],
'fields' => 'ids',
'posts_per_page' => 100,
];
$products = get_posts($args);
foreach ($products as $product_id) {
$url = get_permalink($product_id);
send_url_to_indexnow($url);
}
});Проверка результата после внедрения
- В Bing Webmaster Tools проверьте логи отправки IndexNow — должны появляться успешные запросы на удаление URL.
- Через поисковик выполните поиск по URL отсутствующих товаров — они должны постепенно исчезать из выдачи.
- Проверьте логи ошибок WordPress, чтобы убедиться в отсутствии проблем при отправке запросов.
Частые ошибки и их исправление
- Неверный ключ API или отсутствие файла ключа на сайте: Убедитесь, что файл
indexnow-key.txtс ключом размещён в корне сайта и ключ совпадает с указанным в коде. - Отправка запросов без проверки статуса публикации товара: Добавляйте проверку
$post->post_status === 'publish', чтобы не отправлять неактивные страницы. - Проблемы с Cron: Проверьте, что задания Cron действительно выполняются, используя плагин WP Crontrol или аналогичные инструменты.
- Ошибки в JSON при отправке запроса: Проверяйте правильность JSON и наличие всех обязательных параметров.
Практические советы по безопасности и производительности
- Храните ключ IndexNow в
wp-config.phpили в защищённых настройках, а не жестко в коде. - Ограничьте частоту отправки запросов, чтобы не превышать лимиты API и избежать блокировок.
- Используйте пакетную отправку URL (до 10 за запрос), если необходимо массовое удаление для оптимизации нагрузки.
- Логируйте результаты отправки для своевременного обнаружения проблем.
Сравнение вариантов реализации автоматического удаления товаров без наличия
| Метод | Преимущества | Недостатки | Пример |
|---|---|---|---|
| Отправка при сохранении товара | Мгновенная реакция на изменение | Не работает при массовых изменениях | Хук save_post_product |
| Периодический Cron | Обрабатывает массовые изменения | Задержка до часа | WP Cron + get_posts с meta_query |
| Отправка через очередь (Queue) | Управляемая нагрузка, пакетная отправка | Сложнее в реализации | Использование Transients и WP Cron |