В современных проектах на WordPress часто используется WP REST API для управления контентом и интеграции с внешними сервисами. Если вы применяете IndexNow для ускоренной индексации и обновления страниц в поисковых системах, важно настроить автоматическую отправку URL при изменениях через REST API. В этой статье разберём, как реализовать такую интеграцию с примерами кода и рекомендациями.
Зачем нужна отправка URL в IndexNow при изменении через WP REST API
WP REST API позволяет создавать, обновлять и удалять записи программно, обходя стандартный интерфейс WordPress. Однако при таких изменениях стандартные хуки WordPress, которые обычно запускают отправку URL в IndexNow, могут не сработать автоматически. Это приводит к тому, что поисковые системы не получают информацию об изменениях и не обновляют индекс так быстро, как хотелось бы.
Реализация отправки URL в IndexNow непосредственно в обработчиках REST API поможет:
- Ускорить индексацию новых и обновлённых страниц;
- Автоматически удалять из индекса устаревшие или удалённые записи;
- Поддерживать актуальность данных в поисковых системах без лишних ручных действий.
Как работает отправка URL в IndexNow: краткое напоминание
IndexNow — это протокол, позволяющий сайтам мгновенно уведомлять поисковые системы об изменениях на сайте путём отправки URL изменённых страниц. Для этого нужен ключ API и вызов HTTP POST с JSON, содержащим список страниц.
Пример запроса IndexNow выглядит так:
POST https://api.indexnow.org/indexnow
Content-Type: application/json
{
"host": "example.com",
"key": "ваш_ключ_api",
"keyLocation": "https://example.com/ключ.txt",
"urlList": ["https://example.com/page1", "https://example.com/page2"]
}
Реализация отправки URL при изменении через WP REST API
Для интеграции будем использовать фильтры и хуки, которые позволяют отследить момент успешного создания, обновления или удаления записи через REST API.
Обработка создания и обновления постов
В WordPress есть хук rest_after_insert_{$post_type}, который вызывается после успешного сохранения записи через REST API. Его можно использовать для отправки URL в IndexNow.
function indexnow_su_send_url_after_rest_insert(\WP_Post $post, \WP_REST_Request $request, \bool $creating) {
// Проверим, что это нужный тип поста (например, только 'post' и 'page')
if (!in_array($post->post_type, ['post', 'page'])) {
return;
}
// Формируем URL
$url = get_permalink($post);
// Отправляем в IndexNow
indexnow_su_send_url_to_indexnow([$url]);
}
add_action('rest_after_insert_post', 'indexnow_su_send_url_after_rest_insert', 10, 3);
add_action('rest_after_insert_page', 'indexnow_su_send_url_after_rest_insert', 10, 3);
Обработка удаления постов через REST API
Удаление записей через REST API можно отследить через хук before_delete_post. Но чтобы убедиться, что удаление произошло через REST API, проверим контекст.
function indexnow_su_send_url_after_rest_delete($post_id) {
if (!wp_doing_ajax() && defined('REST_REQUEST') && REST_REQUEST) {
$post = get_post($post_id);
if (!$post) {
// Пост уже удалён, формируем URL вручную
// Предполагается, что URL уже не доступен, но можно отправить для удаления
$url = home_url('/?p=' . $post_id);
} else {
$url = get_permalink($post);
}
indexnow_su_send_url_to_indexnow([$url], true); // true — означает удаление URL
}
}
add_action('before_delete_post', 'indexnow_su_send_url_after_rest_delete');
Функция отправки URL в IndexNow
Создадим универсальную функцию, которая будет отправлять в IndexNow список URL. В параметрах можно указывать, что URL нужно удалить из индекса.
function indexnow_su_send_url_to_indexnow(array $urls, bool $is_delete = false) {
$api_key = 'ваш_ключ_api'; // Замените на свой ключ
$host = parse_url(home_url(), PHP_URL_HOST);
$endpoint = 'https://api.indexnow.org/indexnow';
$data = [
'host' => $host,
'key' => $api_key,
'keyLocation' => home_url('/' . $api_key . '.txt'),
'urlList' => $urls
];
$args = [
'headers' => ['Content-Type' => 'application/json'],
'body' => wp_json_encode($data),
'method' => 'POST',
'timeout' => 15,
];
$response = wp_remote_post($endpoint, $args);
if (is_wp_error($response)) {
error_log('IndexNow: Ошибка отправки URL - ' . $response->get_error_message());
return false;
}
$code = wp_remote_retrieve_response_code($response);
if ($code !== 200) {
error_log('IndexNow: Ошибка HTTP ' . $code . ' при отправке URL');
return false;
}
return true;
}
Практические рекомендации и отладка
1. Ключ API: Получите ключ IndexNow и загрузите файл ключа на сайт по адресу https://ваш_сайт/ключ.txt. Это подтверждает владение сайтом.
2. Логирование: В функции отправки URL добавьте логирование ошибок, чтобы быстро выявлять проблемы при разработке и эксплуатации.
3. Проверка REST API: Для сложных кастомных типов и расширенных REST эндпоинтов добавляйте аналогичные хуки rest_after_insert_{$post_type}.
4. Ограничение частоты: Если у вас большой сайт с частыми изменениями, добавьте очередь и ограничьте частоту отправок, чтобы не превысить лимиты IndexNow.
Использование плагинов для облегчения работы с IndexNow
Если не хотите писать код с нуля, рассмотрите плагин Clearfy Pro. Он поддерживает интеграцию с IndexNow и позволяет автоматически отправлять URL при изменениях, включая работу с REST API. В интерфейсе можно настроить ключ и исключения без программирования.
Также полезны плагины для расширенного логирования REST API и мониторинга запросов, чтобы проверить корректность вызова отправки URL.
Заключение
Отправка URL в IndexNow при изменениях через WP REST API — важный шаг в поддержании актуальности индекса поисковых систем. Используя хук rest_after_insert_{$post_type} и функцию отправки запросов, можно автоматизировать процесс и существенно ускорить индексацию.
Обязательно тестируйте интеграцию на тестовом сайте, учитывайте особенности вашего проекта и объёмы изменений. При необходимости используйте готовые решения из экосистемы WordPress, например, Clearfy Pro, чтобы сэкономить время и избежать ошибок.