IndexNow — современный протокол для мгновенного уведомления поисковых систем об обновлениях контента сайта. Многие WordPress-разработчики уже внедрили автоматическую отправку URL через Cron или REST API, но мало кто использует преимущества webhook-ов для интеграции с внешними сервисами и плагинами. В этой статье разберём, как с помощью webhook-ов автоматически отправлять в IndexNow URL-адреса при различных событиях WordPress, например, при публикации или обновлении записи, а также как это расширить для пользовательских типов записей и таксономий.
Что такое Webhook и зачем он нужен для IndexNow в WordPress
Webhook — это механизм, при котором один сервис отправляет HTTP-запрос другому при наступлении определённого события. В контексте WordPress и IndexNow это значит, что при изменении контента сайт сам мгновенно уведомляет поисковые системы, передавая URL новой или обновлённой страницы.
Преимущество webhook-ов в том, что они позволяют легко интегрироваться с внешними системами, например, с плагинами кеширования, системами мониторинга, а также с собственными скриптами, которые могут обрабатывать и фильтровать URL перед отправкой.
Использование webhook-ов снижает нагрузку на сервер, так как не нужно постоянно дергать IndexNow API по расписанию — уведомления идут только при реальных изменениях.
Типичные сценарии использования webhook-ов для IndexNow
- Отправка URL при публикации или обновлении поста или страницы.
- Отправка URL пользовательских типов записей (CPT), например, портфолио или товара.
- Интеграция с плагинами, которые управляют SEO, чтобы отправлять URL после оптимизации.
- Взаимодействие с внешними системами, например, CRM или ERP, которые влияют на контент.
Как создать webhook для отправки URL в IndexNow при публикации записи в WordPress
Для начала создадим плагин, который реализует webhook — обработчик изменения постов и отправляет URL в IndexNow.
Основная идея — использовать хук save_post, который вызывается при сохранении записи, и отправлять URL, если это публикация или обновление.
<?php
/**
* Plugin Name: IndexNow Webhook Sender
* Description: Автоматическая отправка URL в IndexNow через webhook при изменении постов
* Version: 1.0
* Author: indexnow.su
*/
function indexnowsu_send_url_to_indexnow($post_id) {
// Проверяем, что это не автосохранение
if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) return;
// Проверяем права пользователя
if (!current_user_can('edit_post', $post_id)) return;
$post = get_post($post_id);
// Отправляем только для опубликованных постов
if ($post->post_status !== 'publish') return;
$url = get_permalink($post_id);
if (!$url) return;
$api_key = 'ВАШ_КЛЮЧ_API_INDEXNOW';
$endpoint = 'https://api.indexnow.org/indexnow?url=' . urlencode($url) . '&key=' . $api_key;
$response = wp_remote_get($endpoint);
if (is_wp_error($response)) {
error_log('IndexNow webhook error: ' . $response->get_error_message());
} else {
error_log('IndexNow webhook sent for URL: ' . $url);
}
}
add_action('save_post', 'indexnowsu_send_url_to_indexnow');Этот код — базовый пример. Он отправляет GET-запрос к API IndexNow с URL и ключом. В реальной практике лучше использовать POST-запрос, соответствующий официальной спецификации IndexNow, и обрабатывать ошибки более детально.
Расширение: отправка нескольких URL и поддержка пользовательских типов записей
Если сайт использует пользовательские типы записей, например, portfolio или product, нужно добавить проверку и для них. Также полезно отправлять не только основной URL, но и связанные — например, родительские страницы или таксономии.
function indexnowsu_send_url_to_indexnow_extended($post_id) {
if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) return;
if (!current_user_can('edit_post', $post_id)) return;
$post = get_post($post_id);
if ($post->post_status !== 'publish') return;
$supported_post_types = ['post', 'page', 'portfolio', 'product'];
if (!in_array($post->post_type, $supported_post_types, true)) return;
$urls = [];
$urls[] = get_permalink($post_id);
// Добавляем URL родительской страницы, если есть
if ($post->post_parent) {
$parent_url = get_permalink($post->post_parent);
if ($parent_url) $urls[] = $parent_url;
}
// Добавляем URL таксономий
$taxonomies = get_object_taxonomies($post->post_type);
foreach ($taxonomies as $taxonomy) {
$terms = wp_get_post_terms($post_id, $taxonomy);
foreach ($terms as $term) {
$term_link = get_term_link($term);
if (!is_wp_error($term_link)) {
$urls[] = $term_link;
}
}
}
$api_key = 'ВАШ_КЛЮЧ_API_INDEXNOW';
$endpoint = 'https://api.indexnow.org/indexnow';
$body = json_encode(['host' => parse_url(home_url(), PHP_URL_HOST), 'key' => $api_key, 'keyLocation' => home_url('/'. $api_key .'.txt'), 'urlList' => $urls]);
$response = wp_remote_post($endpoint, [
'headers' => ['Content-Type' => 'application/json'],
'body' => $body,
'timeout' => 15,
]);
if (is_wp_error($response)) {
error_log('IndexNow webhook error: ' . $response->get_error_message());
} else {
error_log('IndexNow webhook sent for URLs: ' . implode(', ', $urls));
}
}
add_action('save_post', 'indexnowsu_send_url_to_indexnow_extended');Использование плагинов для расширения функционала webhook-ов с IndexNow
Если вы не хотите писать собственный код, можно воспользоваться плагинами, которые поддерживают webhook-и и интеграцию с внешними API:
- WP Webhooks — мощный плагин для создания и управления webhook-ами, можно настроить отправку данных при публикации или обновлении записи, а дальше — через кастомный PHP-код отправлять URL в IndexNow.
- Clearfy Pro — плагин для оптимизации WordPress, который частично автоматизирует работу с индексацией и может быть расширен для интеграции с IndexNow.
- Custom webhook plugins — существуют узкоспециализированные решения, которые позволяют создавать шаблоны webhook-ов и отправлять запросы к любым API по событиям WordPress.
Использование плагинов удобно, если вы хотите гибко управлять событиями и не писать код, но для максимальной производительности и точечной настройки лучше создать небольшой кастомный плагин, как показано выше.
Пример интеграции WP Webhooks с IndexNow
В настройках WP Webhooks создайте событие, которое срабатывает при публикации записи. В качестве действия добавьте "Отправить POST-запрос" на адрес вашего собственного обработчика, который будет делать запрос к IndexNow API, используя полученные URL.
Вот пример простого обработчика, который можно разместить в корне сайта или как отдельный PHP-файл плагина:
<?php
// Получаем JSON из POST-запроса
$data = json_decode(file_get_contents('php://input'), true);
if (!$data || empty($data['url'])) {
http_response_code(400);
echo 'No URL provided';
exit;
}
$url = $data['url'];
$api_key = 'ВАШ_КЛЮЧ_API_INDEXNOW';
$endpoint = 'https://api.indexnow.org/indexnow?url=' . urlencode($url) . '&key=' . $api_key;
$response = file_get_contents($endpoint);
if ($response === false) {
http_response_code(500);
echo 'Error sending to IndexNow';
} else {
echo 'URL sent to IndexNow: ' . $url;
}
?>Тонкости и подводные камни при использовании webhook-ов с IndexNow
Несмотря на простоту реализации, есть несколько важных моментов, которые нужно учитывать:
- Ограничение частоты запросов. IndexNow рекомендует не превышать определённое количество запросов в секунду. При массовом обновлении контента нужно реализовать очередь или дебаунсинг отправки URL.
- Обработка ошибок. В случае сетевых сбоев или ошибок API нужно предусмотреть повторную отправку или логирование с последующим разбором.
- Безопасность webhook-ов. Если вы принимаете входящие webhook-запросы, обязательно проверяйте их источники и используйте секреты для аутентификации.
- Проверка формата URL. Отправляйте только корректные и релевантные URL, чтобы не засорять индекс.
Как контролировать нагрузку и избежать блокировок
Для крупных проектов с частыми изменениями можно использовать следующие методы:
- Буферизация URL в базе данных и отправка их пакетами по расписанию.
- Использование очередей (например, через WP Cron или внешние сервисы).
- Анализ логов и мониторинг успешности отправки.
Заключение
Интеграция IndexNow в WordPress через webhook-и — мощный и гибкий способ обеспечить мгновенную индексацию контента, снизить нагрузку на сервер и легко расширять функционал. Выше мы рассмотрели как написать собственный плагин с webhook-ом, расширить его для пользовательских типов записей и таксономий, а также использовать сторонние плагины для автоматизации процесса.
Для более удобной работы с IndexNow рекомендуем изучить и использовать плагины Clearfy Pro и WP Webhooks, которые помогут управлять SEO и интеграцией без лишнего кода. Подробнее о них можно узнать на WPSHOP.ru.