Проблема: устаревшие товары с нулевым остатком остаются в индексе поисковых систем
В магазинах на WooCommerce часто возникает ситуация, когда товары временно или навсегда оказываются без наличия — количество на складе равно 0 или товар снят с продажи. При этом URL таких товаров продолжают оставаться в индексе поисковиков, что ведет к ухудшению SEO, снижению CTR и появлению 404 или редиректов при попытках перехода.
Задача — автоматически отправлять в IndexNow удаление URL с отсутствующими товарами, чтобы поисковики оперативно исключали их из индекса.
Диагностика проблемы с индексацией отсутствующих товаров
Чтобы понять, что URL товаров с нулевым остатком остались в индексе, проверьте:
- В поисковиках по запросу
site:вашдомен.ruнайдите URL товаров, которых физически нет на складе. - Просмотрите логи сервера и Google Search Console (или Bing Webmaster Tools) — ошибки 404 или редиректы на такие URL.
- Настройте плагин для анализа SEO, например, Clearfy Pro, чтобы выявить устаревшие URL.
Как реализовать автоматическую отправку удаления URL отсутствующих товаров в IndexNow
1. Отслеживаем изменение наличия товара
Лучше всего использовать хук WooCommerce woocommerce_update_product, который вызывается при обновлении данных товара, и проверять наличие.
add_action('woocommerce_update_product', 'send_indexnow_delete_for_out_of_stock', 10, 1);
function send_indexnow_delete_for_out_of_stock($product_id) {
$product = wc_get_product($product_id);
if (!$product) {
return;
}
if ($product->get_stock_quantity() === 0 || !$product->is_in_stock()) {
send_indexnow_url_delete(get_permalink($product_id));
}
}2. Функция отправки удаления URL в IndexNow
Ниже пример базовой реализации отправки с использованием curl. Замените YOUR_API_KEY и YOUR_INDEXNOW_ENDPOINT на свои данные.
function send_indexnow_url_delete($url) {
$api_key = 'YOUR_API_KEY';
$endpoint = 'https://api.indexnow.org/indexnow';
$payload = [
'host' => parse_url(home_url(), PHP_URL_HOST),
'key' => $api_key,
'urlList' => [$url],
'action' => 'delete'
];
$ch = curl_init($endpoint);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($payload));
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);
$http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
if ($http_code === 200) {
error_log('IndexNow: Успешно отправлено удаление URL: ' . $url);
} else {
error_log('IndexNow: Ошибка отправки удаления URL: ' . $url . ' Ответ: ' . $response);
}
}3. Оптимизация отправки при массовом обновлении
При обновлении большого количества товаров не стоит отправлять запросы на каждый товар сразу. Рекомендуется накапливать URL в очередь и отправлять пакетами (до 1000 URL за один запрос), используя WP Cron для периодической отправки.
function queue_indexnow_delete_url($url) {
$queue = get_option('indexnow_delete_queue', []);
if (!in_array($url, $queue, true)) {
$queue[] = $url;
update_option('indexnow_delete_queue', $queue);
}
}
function send_indexnow_queue() {
$queue = get_option('indexnow_delete_queue', []);
if (empty($queue)) {
return;
}
$batch = array_splice($queue, 0, 1000);
update_option('indexnow_delete_queue', $queue);
// Отправка batch в IndexNow с action delete (аналогично функции выше)
// ...
}
add_action('indexnow_cron_send_delete', 'send_indexnow_queue');
// Запланировать Cron при активации плагина или темы
if (!wp_next_scheduled('indexnow_cron_send_delete')) {
wp_schedule_event(time(), 'hourly', 'indexnow_cron_send_delete');
}Проверка результата после внедрения
- В логах сервера (error_log) появятся записи об успешной отправке удаления URL.
- В Bing Webmaster Tools и других консолях следите за статусом удаленных URL — они должны исчезать из индекса за несколько дней.
- Проверьте, что URL отсутствующих товаров возвращают 404 или корректно редиректятся, чтобы не было конфликтов.
Частые ошибки и как их исправить
- Отправка URL без правильного формата. URL должен быть абсолютным и совпадать с реальным адресом товара. Используйте
get_permalink(). - Отсутствие проверки наличия товара. Если отправлять удаление для товара, который на самом деле в наличии, это приведет к неправильной индексации.
- Перегрузка запросами IndexNow. При массовом обновлении без пакетной отправки сервер может блокировать запросы. Используйте очередь и WP Cron.
- Неправильный ключ API или endpoint. Проверьте актуальность ключа и URL сервиса IndexNow.
- Проблемы с кэшированием. Если кэш не очищается после обновления товара, поисковики будут видеть устаревшую версию. Настройте очистку кэша при изменении товара.
Практические советы по безопасности и производительности
- Храните ключ API в
wp-config.phpили в защищенной опции, не в открытом коде. - Ограничьте частоту отправки запросов, чтобы не превышать лимиты IndexNow и не нагружать сервер.
- Используйте асинхронные запросы или WP Cron для пакетной отправки, чтобы не блокировать пользовательские запросы.
- При большом каталоге товаров рассмотрите использование специализированных плагинов, например Clearfy Pro, которые могут интегрироваться с IndexNow и оптимизировать отправку.
Сравнение вариантов реализации автоматического удаления товаров в IndexNow
| Метод | Плюсы | Минусы | Когда выбирать |
|---|---|---|---|
| Прямой вызов отправки при обновлении товара | Простая реализация, мгновенная реакция | Высокая нагрузка при массовых изменениях, риск превышения лимитов | Маленькие магазины с редкими обновлениями |
| Отправка через очередь и WP Cron | Оптимизация нагрузки, пакетная отправка до 1000 URL | Задержки до часа, сложнее реализация | Большие магазины с частыми обновлениями |
| Использование готовых плагинов (например, Clearfy Pro) | Готовое решение, поддержка и обновления | Платные, ограничены функционалом плагина | Кому нужно быстро и без собственного кода |