Проблема: устаревшие товары без наличия остаются в поисковой выдаче
В интернет-магазинах на WooCommerce часто возникает ситуация, когда товары, которых нет в наличии, остаются проиндексированными поисковыми системами. Это ухудшает поведенческие факторы и снижает релевантность магазина. IndexNow позволяет оперативно уведомлять поисковики об удалении или изменении URL, но без автоматизации процесс становится трудоемким.
Диагностика проблемы
Для начала нужно проверить, какие товары отсутствуют на складе и при этом остаются в индексе. Пошагово:
- В панели WooCommerce откройте раздел Товары и отфильтруйте по статусу
Нет в наличии. - Проверьте, что эти товары доступны для индексирования (не скрыты robots.txt или мета-тегом
noindex). - Используйте инструмент IndexNow или логи сервера для оценки, отправлялись ли запросы на удаление таких URL.
Если URL товаров с отсутствием не отправляются в IndexNow, значит автоматизация не настроена или работает некорректно.
Пошаговое решение: автоматическая отправка удаления URL товаров без наличия
1. Создаем функцию для отправки URL в IndexNow
function send_url_to_indexnow($url, $action = 'update') {
$api_key = 'ВАШ_КЛЮЧ_API_INDEXNOW';
$endpoint = 'https://api.indexnow.org/indexnow';
$payload = [
'host' => parse_url(home_url(), PHP_URL_HOST),
'key' => $api_key,
'keyLocation' => home_url('/indexnow-key.txt'),
'urlList' => [$url],
'action' => $action,
];
$args = [
'body' => json_encode($payload),
'headers' => [
'Content-Type' => 'application/json',
],
'timeout' => 10,
];
$response = wp_remote_post($endpoint, $args);
if (is_wp_error($response)) {
error_log('IndexNow error: ' . $response->get_error_message());
return false;
}
$code = wp_remote_retrieve_response_code($response);
return $code === 200;
}2. Отслеживаем изменение наличия товара и отправляем URL на удаление
Добавим хук на сохранение товара, который проверит статус наличия и при отсутствии отправит URL с действием delete.
add_action('woocommerce_update_product', function($product_id) {
$product = wc_get_product($product_id);
if (!$product) return;
// Проверяем, что товар нет в наличии и опубликован
if (!$product->is_in_stock() && $product->is_visible()) {
$url = get_permalink($product_id);
$sent = send_url_to_indexnow($url, 'delete');
if ($sent) {
error_log("IndexNow: URL удален из индекса - $url");
}
}
});3. Создаем WP-Cron задачу для массовой проверки товаров без наличия
Чтобы не пропускать товары, изменившие статус вне интерфейса, настроим ежедневный скрипт.
function indexnow_remove_out_of_stock_products() {
$args = [
'post_type' => 'product',
'posts_per_page' => 100,
'meta_query' => [
[
'key' => '_stock_status',
'value' => 'outofstock',
],
],
'fields' => 'ids',
];
$query = new WP_Query($args);
if (!$query->have_posts()) return;
foreach ($query->posts as $product_id) {
$url = get_permalink($product_id);
send_url_to_indexnow($url, 'delete');
}
}
if (!wp_next_scheduled('indexnow_daily_cleanup')) {
wp_schedule_event(time(), 'daily', 'indexnow_daily_cleanup');
}
add_action('indexnow_daily_cleanup', 'indexnow_remove_out_of_stock_products');Проверка результата после внедрения
- Посмотрите логи ошибок WordPress, чтобы убедиться, что запросы к IndexNow проходят без ошибок.
- Используйте инструменты IndexNow (например, https://www.bing.com/webmaster/tools/indexnow) для проверки отправленных URL.
- Проверьте HTTP-ответы сервера на URL товаров без наличия — должны быть 200, но с мета-тегом noindex или 410, если удалены.
- Через несколько дней убедитесь, что поисковые системы исключили эти страницы из индекса.
Частые ошибки и как исправить
- Неверный API-ключ или отсутствие файла ключа: Проверьте, что файл
indexnow-key.txtдоступен по указанному пути и ключ совпадает с API-ключом. - Отправка URL, которые не существуют или возвращают 404: Убедитесь, что URL товаров действительно доступны на сайте.
- Функция отправки вызывается слишком часто: Используйте частное кеширование или лимитирование вызовов, чтобы не превышать лимит запросов IndexNow.
- Отсутствие проверки статуса наличия товара: Проверяйте актуальный статус, а не только метаданные, чтобы не отправлять лишние запросы.
Практические советы по производительности и безопасности
- Используйте встроенный WP-Cron для планирования задач, но если сайт большой, лучше настроить системный cron для надежности.
- Храните API-ключ в
wp-config.phpили в безопасном месте, не в коде плагина. - Ограничьте количество URL в одном запросе до 10-20 для стабильной работы IndexNow.
- Логируйте результаты отправки в отдельный файл для отладки и мониторинга.
- Если используете кэширование (Redis, Memcached), очищайте кэш при изменении статуса товара.
Сравнение методов автоматизации удаления товаров без наличия
| Метод | Плюсы | Минусы | Пример кода/плагин |
|---|---|---|---|
| Хук на обновление товара | Мгновенная отправка URL при изменении | Не ловит изменения вне админки (импорт, БД) | Пример кода выше |
| Ежедневный WP-Cron | Обрабатывает массовые изменения, надежен | Задержка до 24 часов, нагрузка на БД | Пример кода выше |
| Плагины автоматизации (например, Clearfy Pro) | Готовые решения с UI и расширенными настройками | Платные, менее гибкие под кастомные задачи | Clearfy Pro |