Диагностика проблемы: почему важно отправлять URL при изменении наличия товаров
В интернет-магазинах на WooCommerce статус наличия товаров часто меняется: товары могут появляться в наличии, уходить в резерв или становиться недоступны. Поисковые системы должны быстро узнавать об этих изменениях, чтобы корректно индексировать страницы и показывать актуальную информацию пользователям. Без автоматической отправки обновленных URL в IndexNow вы рискуете получить устаревшую выдачу и снизить конверсию.
Как отслеживать изменения наличия товаров в WooCommerce
WooCommerce хранит статус наличия товара в метаполе _stock_status, возможные значения — instock, outofstock и onbackorder. Для отслеживания изменений используем хук updated_postmeta, который срабатывает при обновлении метаданных.
Код для отслеживания изменения статуса наличия
add_action('updated_postmeta', 'send_indexnow_on_stock_status_change', 10, 4);
function send_indexnow_on_stock_status_change($meta_id, $post_id, $meta_key, $meta_value) {
if ($meta_key !== '_stock_status') {
return;
}
$post_type = get_post_type($post_id);
if ($post_type !== 'product') {
return;
}
// Получаем URL товара
$url = get_permalink($post_id);
// Вызываем функцию отправки URL в IndexNow
indexnow_send_url([$url]);
}
Пошаговое решение: как автоматизировать отправку URL в IndexNow при изменении наличия
- Создайте функцию отправки URL в IndexNow. Ниже пример минимальной реализации с использованием CURL.
function indexnow_send_url(array $urls) {
$endpoint = 'https://api.indexnow.org/indexnow';
$host = parse_url(home_url(), PHP_URL_HOST);
$key = 'ВАШ_КЛЮЧ_API_INDEXNOW'; // Замените на ваш ключ
$payload = [
'host' => $host,
'key' => $key,
'keyLocation' => home_url('/'.$key.'.txt'),
'urlList' => $urls
];
$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 error: HTTP '.$http_code.' Response: '.$response);
} else {
error_log('IndexNow URL отправлены успешно: '.implode(', ', $urls));
}
}
- Добавьте ключ API IndexNow и разместите файл ключа на сайте. Создайте текстовый файл с именем ключа, например
ВАШ_КЛЮЧ_API_INDEXNOW.txt, в корне сайта с содержимым равным ключу. - Подключите функцию отправки к хуку изменения статуса наличия (пример выше).
- Проверьте, что CURL включен на сервере и нет ограничений на исходящие запросы.
Проверка результата после внедрения
- Измените наличие товара через админку WooCommerce.
- Проверьте лог ошибок PHP (error_log) на предмет сообщений от функции
indexnow_send_url. - Убедитесь, что IndexNow ответил HTTP 200.
- Используйте инструменты поисковых систем для проверки индексации обновленных страниц.
Частые ошибки и как их исправить
- Отсутствие ключа API или неправильный путь к файлу ключа. Проверьте, что файл
ВАШ_КЛЮЧ_API_INDEXNOW.txtдоступен по адресуhttps://ваш-домен/ВАШ_КЛЮЧ_API_INDEXNOW.txt. - CURL не установлен или отключен на сервере. Проверьте с помощью
phpinfo()или командной строки. - Хук срабатывает слишком часто и вызывает лимит по отправкам. Добавьте кэширование или очередь отправки URL, если сайт с большим числом товаров.
- Некорректный формат URL в списке. Используйте
get_permalink()для получения правильных адресов.
Практические советы по безопасности и производительности
- Храните ключ API вне публичных директорий или используйте константы в
wp-config.php. - Для большого каталога товаров реализуйте очередь отправки URL через WP Cron или внешние очереди, чтобы не перегружать сервер.
- Добавьте логирование с ограничением по размеру файла или используйте сторонние сервисы мониторинга.
- Обрабатывайте ошибки HTTP и повторяйте попытки отправки с экспоненциальной задержкой.
Сравнение методов отправки URL при изменении наличия товаров
| Метод | Плюсы | Минусы | Пример |
|---|---|---|---|
Хук updated_postmeta | Мгновенная реакция, простая реализация | Много запросов при массовом обновлении, возможна нагрузка | Пример кода выше |
| Периодический запуск WP Cron | Контроль нагрузки, возможность пакетной отправки | Задержка между обновлением и отправкой | Запуск функции с выборкой измененных товаров за интервал |
| Вебхуки сторонних систем | Интеграция с внешними сервисами, гибкость | Требует дополнительной настройки, зависит от внешних сервисов | Обработка вебхуков и вызов IndexNow API |