При больших объемах сайта на WordPress автоматическая отправка URL в IndexNow может сталкиваться с проблемами — задержками, таймаутами или блокировками со стороны поисковых систем. В этой статье подробно разберём, как оптимизировать процесс отправки, чтобы обеспечить стабильную и быструю индексацию новых и обновлённых страниц.
Особенности работы IndexNow с большими сайтами WordPress
IndexNow — протокол мгновенного уведомления поисковых систем об изменениях на сайте. При большом количестве URL важны следующие аспекты:
- Ограничения на число URL, отправляемых за один запрос.
- Необходимость контролировать частоту отправок, чтобы не перегружать сервер и не вызвать блокировки.
- Обработка ошибок и повторная отправка URL при сбоях.
- Гибкое формирование очередей URL с приоритетами.
Без оптимизации отправка URL может превратиться в «узкое место» при обновлении контента.
Использование очередей и пакетной отправки URL
Для больших сайтов нельзя слать все URL одномоментно. Нужно разбивать список на пакеты и отправлять их по очереди. Это помогает снизить нагрузку и избежать ошибок 429 (Too Many Requests).
Пример функции для пакетной отправки URL с префиксом indexnowSu:
function indexnowSu_send_url_batch(array $urls, string $key, string $keyLocation) {
$endpoint = 'https://api.indexnow.org/indexnow';
$max_batch_size = 1000; // Рекомендуемый максимум за один запрос
$batches = array_chunk($urls, $max_batch_size);
foreach ($batches as $batch) {
$payload = [
'host' => parse_url(home_url(), PHP_URL_HOST),
'key' => $key,
'keyLocation' => $keyLocation,
'urlList' => $batch
];
$response = wp_remote_post($endpoint, [
'headers' => ['Content-Type' => 'application/json'],
'body' => wp_json_encode($payload),
'timeout' => 10
]);
if (is_wp_error($response)) {
error_log('IndexNow batch send error: ' . $response->get_error_message());
// Можно реализовать повторную попытку или запись в очередь на повтор
}
sleep(1); // Пауза между запросами для снижения нагрузки
}
}В этом примере URL разбиваются на пакеты по 1000, отправляются с паузой, что снижает нагрузку на сервер и API IndexNow.
Автоматизация формирования списка URL для отправки
Для крупных сайтов важно выбирать только изменённые или новые URL, чтобы не отправлять весь список постоянно.
Можно использовать хуки WordPress для добавления URL в очередь отправки при публикации, обновлении или удалении записей:
function indexnowSu_on_post_save($post_id, $post, $update) {
if ($post->post_status !== 'publish') {
return;
}
$url = get_permalink($post_id);
indexnowSu_add_url_to_queue($url);
}
add_action('save_post', 'indexnowSu_on_post_save', 10, 3);
function indexnowSu_add_url_to_queue($url) {
$queue = get_option('indexnowSu_url_queue', []);
if (!in_array($url, $queue)) {
$queue[] = $url;
update_option('indexnowSu_url_queue', $queue);
}
}Такой подход позволяет динамически формировать список URL, которые требуют отправки.
Планирование отправки через WP-Cron и предотвращение конфликтов
Для отправки очереди URL используйте cron-задачу, которая срабатывает, например, каждые 5–10 минут. Это позволит равномерно распределять нагрузку на API и сервер.
function indexnowSu_schedule_cron() {
if (!wp_next_scheduled('indexnowSu_send_url_cron')) {
wp_schedule_event(time(), 'ten_minutes', 'indexnowSu_send_url_cron');
}
}
add_action('wp', 'indexnowSu_schedule_cron');
add_action('indexnowSu_send_url_cron', 'indexnowSu_send_url_queue');
function indexnowSu_send_url_queue() {
$queue = get_option('indexnowSu_url_queue', []);
if (empty($queue)) {
return;
}
$key = 'ВАШ_КЛЮЧ_INDEXNOW';
$keyLocation = home_url('/indexnow.key');
indexnowSu_send_url_batch($queue, $key, $keyLocation);
// Очищаем очередь после успешной отправки
update_option('indexnowSu_url_queue', []);
}
// Добавляем интервал 10 минут для WP-Cron
add_filter('cron_schedules', function($schedules) {
$schedules['ten_minutes'] = [
'interval' => 600,
'display' => 'Каждые 10 минут'
];
return $schedules;
});Так мы гарантируем, что отправка не будет запускаться слишком часто и не создаст конфликтов.
Использование плагинов для оптимизации IndexNow на больших сайтах
Для упрощения настройки и расширения функционала можно использовать готовые плагины с поддержкой IndexNow и оптимизацией отправки URL:
- Clearfy Pro — плагин с расширенными возможностями оптимизации, включая управление индексацией и отправкой URL.
- WPCommunity — позволяет создавать кастомные типы записей с автоматической отправкой в IndexNow.
Плагины помогают избежать ошибок в реализации и экономят время.
Обработка ошибок и повторные попытки отправки
При работе с большим количеством URL важно логировать ошибки и повторять попытки отправки, чтобы не потерять важные изменения.
Реализуйте механизм записи неотправленных URL в отдельную очередь с последующим повтором:
function indexnowSu_send_url_batch_with_retry(array $urls, string $key, string $keyLocation) {
$failed_urls = [];
$max_batch_size = 1000;
$batches = array_chunk($urls, $max_batch_size);
foreach ($batches as $batch) {
$payload = [
'host' => parse_url(home_url(), PHP_URL_HOST),
'key' => $key,
'keyLocation' => $keyLocation,
'urlList' => $batch
];
$response = wp_remote_post('https://api.indexnow.org/indexnow', [
'headers' => ['Content-Type' => 'application/json'],
'body' => wp_json_encode($payload),
'timeout' => 10
]);
if (is_wp_error($response) || wp_remote_retrieve_response_code($response) !== 200) {
$failed_urls = array_merge($failed_urls, $batch);
error_log('IndexNow batch send failed');
}
sleep(1);
}
if (!empty($failed_urls)) {
$retry_queue = get_option('indexnowSu_retry_queue', []);
$retry_queue = array_unique(array_merge($retry_queue, $failed_urls));
update_option('indexnowSu_retry_queue', $retry_queue);
}
}Далее можно настроить отдельную cron-задачу для повторных попыток отправки из indexnowSu_retry_queue.
Проверка результатов и отладка отправки URL
Для контроля работы важно логировать ответы API и создавать панель в админке с информацией о статусе отправки. Это поможет оперативно выявлять проблемы и корректировать процесс.
Например, простая функция для логирования:
function indexnowSu_log_response($response) {
$log_file = WP_CONTENT_DIR . '/indexnowSu_log.txt';
$entry = date('Y-m-d H:i:s') . ' - ' . print_r($response, true) . "\n";
file_put_contents($log_file, $entry, FILE_APPEND);
}Вызывайте её после каждого запроса для сохранения подробностей.