Автор: Александр Сырейщиков
Опубликовано:
Обновлено:

Содержание:

  1. Что такое IndexNow?
  2. Какие поисковые системы поддерживают протокол?
  3. Что нужно сделать для использования протокола?
  4. Как автоматизировать процесс отправки изменений на сайте Modx Revolution?

Что такое IndexNow?

IndexNow - новый способ быстрого информирования поисковых систем об изменениях на сайте. Информируя одну поисковую систему - она информирует остальные, которые поддерживают данный протокол.

Ссылка на официальный сайт IndexNow.

Какие поисковые системы поддерживают протокол?

Сейчас поддержка протокола есть у Microsoft Bing и Yandex. Google - находится в стадии тестирования протокола.

Что нужно сделать для использования протокола?

Нужно сформировать ключ и разместить его на вашем сайте. Он нужен для подтверждения прав на сайт.

После отправить HTTP запрос по URL адресу предоставляемый поисковой системой.

При изменении одной страницы сайта необходимо отправить GET запрос, при изменении нескольких - POST.

Документация по использованию протокола в Bing , в Yandex.

Как автоматизировать процесс отправки изменений на сайте Modx Revolution?

Для этого создадим простой плагин, который будет следить за событиями сохранения и удаления ресурсов.

В панели администратора перейдем на вкладку элементы и перейдем на страницу создания нового плагина.

Название плагина можно указать любое, я назову его indexNowEventsWatch. На вкладке системных событий отмечаем OnDocFormDelete, OnDocFormSave.

В плагине сформируем список измененных ресурсов и передадим список в сниппет для дальнейшей отправки в поисковую систему, добавляем код плагина:

<?php
$eventName = $modx->event->name;
$resources_list = null;
switch($eventName) {
    case 'OnDocFormDelete':
        // $resource, $id, $children
        $resources_list = [];
        $resources_list[] = $modx->getOption('site_url') . $resource->get('uri');
        
        foreach ($children as $childId) {
            $resourceChild = $modx->getObject('modResource', $childId);
            $resources_list[] = $modx->getOption('site_url') . $resourceChild->get('uri');
        }
        break;
    case 'OnDocFormSave':
        // $mode, $resource, $id
        $resources_list = [];
        $resources_list[] = $modx->getOption('site_url') . ($id !== 1 ? $resource->get('uri') : '');
        break;
}
if ($resources_list) {
    $modx->runSnippet('indexNowSend', array(
       'resources_list' => $resources_list
    ));
}

Примечание: при удалении ресурса удаляются и его дети, их также добавляем в список.

Теперь создадим сниппет с названием indexNowSend и добавим код:

<?php
if ( empty($resources_list) ) {
    $modx->log(modX::LOG_LEVEL_ERROR, 'indexNow Нет ресурсов!');
    return false;
}
$host =  'www.example.com'; // адрес вашего сайта
$key = '5becc8be3423471d82fb63a382d0374f';  // сформированный ключ находящийся у вас на сайте
$key_location = 'https://www.example.com/5becc8be3423471d82fb63a382d0374f.txt'; // путь до ключа подтверждения на вашем сайте
$url_search = "https://yandex.com/indexnow"; // адрес предоставляемый поисковой системой, в данном случае Яндекс

$count_resources = count($resources_list);
$options = array(
    'key' => $key,
    'keyLocation' => $key_location
);
$curl_options = array(
    CURLOPT_RETURNTRANSFER => true
);

if ($count_resources === 1) {
    $options['url'] = $resources_list[0];
    $url_search = $url_search . "?" .http_build_query($options);
} else {
    $options['host'] = $host;
    $options['urlList'] = $resources_list;
    $curl_options[CURLOPT_POST] = true;
    $curl_options[CURLOPT_POSTFIELDS] = json_encode($options);
    $curl_options[CURLOPT_HTTPHEADER] = array('Content-Type: application/json', 'charset=utf-8');
}
$curl_options[CURLOPT_URL] = $url_search;

$myCurl = curl_init();
curl_setopt_array($myCurl, $curl_options);
$data = curl_exec($myCurl);
if (!curl_errno($myCurl)) {
  switch ($http_code = curl_getinfo($myCurl, CURLINFO_HTTP_CODE)) {
    case 200:  # OK
        $modx->log(modX::LOG_LEVEL_ERROR, implode(", ", $resources_list) . '. IndexNow - успешно: ' . $http_code . ' ' . $data);
        break;
    default:
        $modx->log(modX::LOG_LEVEL_ERROR, implode(", ", $resources_list) . '. IndexNow - HTTP код: ' . $http_code . ' ' . $data);
  }
}
curl_close($myCurl);

Примечание: укажите свои данные в переменных $host, $key, $key_location, $url_search.

Готово! Теперь сайт на  Modx Revolution автоматически отправляет все изменения сайта в поисковые системы через протокол IndexNow.

Также при каждой отправке в логах сайта будет появляться информация об отправленных страницах и статусе отправленного запроса.