Мы будем пользоваться протоколом GET для передачи одного url-а.
Как пользоваться
- Придумываем свой ключ (требования: от 8 до 128 символов, разрешаются только a-z, A-Z , 0-9, -)
- Сохраняем в корне сайта файл — ваш_ключ.txt, внутри файла только ключ в одну строку без пробелов)
- Добавляем в bitrix/php_interface/init.php код
!! Внимание! Добавлять в init.php желательно только имея доступ к FTP сайта.
/* Отправляем get-запрос Яндексу для индексирования только что добавленной страницы */
AddEventHandler("iblock", "OnStartIBlockElementAdd", "OnStartIBlockElementUpdateHandler");
AddEventHandler("iblock", "OnStartIBlockElementUpdate", "OnStartIBlockElementUpdateHandler");
function OnStartIBlockElementUpdateHandler ($arParams) {
$iblockID = 12;
$protocol = 'https';
$siteUrl = 'xxxxxxxxx.ru';
$indexKey = 'xxxxxxxxxxxx';
// Если добавлена статья в нужный нам инфоблок
if($arParams['IBLOCK_ID'] == $iblockID) {
// Если статья активна и имеет дату начала активности
if($arParams['ACTIVE'] == 'Y' && $arParams['ACTIVE_FROM']) {
$filename = $_SERVER['DOCUMENT_ROOT'] . '/upload/indexNowSended.txt';
// Если файл логирования ID-шников существует
if (file_exists($filename)) {
$newfile = FALSE;
// Делаем массив из файла с ID-s
$sendedIDS = file($filename);
} else {
$newfile = TRUE;
}
// Если ID нет в массиве отправленных статей
if(!in_array($arParams['ID'], $sendedIDS)) {
$fullUrl = $protocol . '://' . $siteUrl . '/';
// Если статья в разделе инфоблока
if(!empty($arParams['IBLOCK_SECTION'][0])) {
// Получаем данные о разделе
$res = CIBlockSection::GetByID($arParams['IBLOCK_SECTION'][0]);
$section = $res->GetNext();
// Добавляем секцию к адресу страницы
$fullUrl .= $section['CODE'] . '/';
}
// Добавляем код статьи к адресу
$fullUrl .= $arParams['CODE'] . '/';
$getURL = 'https://yandex.com/indexnow';
// Кодируем url в формат
$getURL .= '?url='.rawurlencode($fullUrl);
// Добавляем ключ к адресу
$getURL .= '&key=' . $indexKey;
// Отправка get-запроса
$result = file_get_contents($getURL);
// Кодируем ответ из json в массив
$answer = json_decode($result, true);
// Если все ок, то в ключе SUCCESS будет 1 (единица)
if($answer['SUCCESS']) {
if($newfile) {
// Если файла нет, то создаем его
file_put_contents($filename, $arParams['ID']);
} else {
// Добавляем ID в конец файла логирования
file_put_contents($filename, PHP_EOL . $arParams['ID'], FILE_APPEND);
}
}
}
}
}
}
Обязательно замените в начале переменные на свои — iblockID, протокол вашего сайта, название сайта, ваш придуманный ключ.
Объясняем принцип действия: скрипт срабатывает при сохранении или изменении статьи и проверяется — есть ли галочка "Активно" и указана ли дата "Начало активности". То есть вы можете сначала делать черновики и сохранять их неактивными.
Далее проверяется наличие файла /upload/indexNowSended.txt - если он уже есть, то в нем должны быть ID уже отправленных статей. Если сохраняемого ID нет в этом списке, то подготавливаем ссылку, отправляем в Яндекс и добавляем новые ID в конец этого файла. Если файла нет (первый раз срабатывает скрипт), то просто создаем файл и записываем туда один ID текущей статьи.
Дополнительные ссылки
Инструкция от ЯндексаОписание протокола IndexNow (на английском языке)