Skip to content

Instantly share code, notes, and snippets.

@Isa3v
Last active January 15, 2025 13:27
Show Gist options
  • Save Isa3v/fe461020414c23fb7553ef6c0aed7099 to your computer and use it in GitHub Desktop.
Save Isa3v/fe461020414c23fb7553ef6c0aed7099 to your computer and use it in GitHub Desktop.
Пагинация в мета-тегах и h1 (Bitrix)

Пагинация в мета-тегах, h1 + canonical (Bitrix)

Задача:

*Добавить на страницах пагинации в title, description и h1 приписку с номером страницы

Решение:

*В bitrix/php_interface/init.php (если нет, то создаем) добавляем в конец функцию разбирающая мета-теги и собирающая обратно

Событие "OnEpilog" вызывается в конце визуальной части эпилога сайта. (После того как битрикс получит уже все данные страницы)

<?php
//Добавляем в конец init.php
AddEventHandler('main', 'OnEpilog', 'orPagenMeta');
function orPagenMeta() {
if ($page = preg_grep("/PAGEN_(.*)/i", array_keys($_REQUEST))) {
$page = intval($_REQUEST[reset($page)]);
// canonical
$GLOBALS['APPLICATION']->SetPageProperty('canonical',((!empty($_SERVER["HTTPS"])) ? "https://" : "http://") . $_SERVER['SERVER_NAME'].$GLOBALS['APPLICATION']->sDirPath ,true);
//h1
$GLOBALS['APPLICATION']->SetTitle($GLOBALS['APPLICATION']->GetTitle(false) . ' — Страница ' . $page;
//title
$title = $GLOBALS['APPLICATION']->GetProperty('title');
$GLOBALS['APPLICATION']->SetPageProperty('title', $title . ' — Страница ' . $page);
//description
$description = $GLOBALS['APPLICATION']->GetProperty('description');
$GLOBALS['APPLICATION']->SetPageProperty('description', $description . ' — Страница ' . $page);
}
}
@domosed1963
Copy link

Спасибо за ответ, но указанный код не сработал в init.php. Там же тоже проверяется PAGEN, а на первой странице его нет!

@Isa3v
Copy link
Author

Isa3v commented Jun 18, 2019

Спасибо за ответ, но указанный код не сработал в init.php. Там же тоже проверяется PAGEN, а на первой странице его нет!

Ну можно так или что-то подобное.

if($GLOBALS['APPLICATION']->sDirPath == $GLOBALS['APPLICATION']->GetCurDir()){
$GLOBALS['APPLICATION']->SetPageProperty('canonical',((!empty($_SERVER["HTTPS"])) ? "https://" : "http://") . $_SERVER['SERVER_NAME'].$GLOBALS['APPLICATION']->sDirPath ,true);
}

@domosed1963
Copy link

Мне SEO-шники поставили задачу, чтобы canonical был не на первую страницу, а на страницу пагинации, очищенную от разных параметров.
Я сделал вот так:
$GLOBALS['APPLICATION']->SetPageProperty('canonical',(($_SERVER["HTTPS"] == "on") ? "https://" : "http://") . $_SERVER['SERVER_NAME'].$GLOBALS['APPLICATION']->GetCurPageParam("", array ("num", "sort", "view", "order", "back_url_admin", "clear_cache")) ,false);
И всё получилось, НО вторым заданием было то, чтобы при PAGEN_1=100500 выдавался canonical на первую или 404 (они сами ещё не определились). Я в system.pagenavigation добавил вот такой код
if($current_page > $quantity_pages) echo "<!-- it_more_page_stranation -->";
и <!-- it_more_page_stranation --> появляется при превышении PAGEN view-source:https://ladogaru.by/catalog/shkivy-klinovye-pod-zazhimnuyu-vtulku/?PAGEN_1=670
В init.php добавил вот такой код
` // canonical

     //Проверка на 100500 страницу
     $it_more_page = false;
     if(strpos($page_content, "<!-- it_more_page_stranation -->")!==false) $it_more_page = true;


     if($it_more_page==false)
{
$GLOBALS['APPLICATION']->SetPageProperty('canonical',(($_SERVER["HTTPS"] == "on") ? "https://" : "http://") . $_SERVER['SERVER_NAME'].$GLOBALS['APPLICATION']->GetCurPageParam("", array ("num", "sort", "view", "order", "back_url_admin", "clear_cache")) ,false);

}

// canonical на 100500 страницах

     if(strpos($page_content, "<!-- it_more_page_stranation -->")==false) $it_more_page = false;

     if($it_more_page==true)
     {
$GLOBALS['APPLICATION']->SetPageProperty('canonical',(($_SERVER["HTTPS"] == "on") ? "https://" : "http://") . $_SERVER['SERVER_NAME'].$GLOBALS['APPLICATION']->GetCurPageParam("", array ("PAGEN_1", "num", "sort", "view", "order", "back_url_admin", "clear_cache")) ,false);

}
`
Но что-то не сработало и пока не могу разобраться. Может быть вы что-то посоветуете?

@Isa3v
Copy link
Author

Isa3v commented Jun 20, 2019

Но что-то не сработало и пока не могу разобраться. Может быть вы что-то посоветуете?
init.php без привязки к событию выполняется до компонента да и в любом случае переменную не глобальную он не получит.

А вообще можно проверку для пагинации по типу вашей сразу на 404 выводить:

if($current_page > $quantity_pages){
\Bitrix\Iblock\Component\Tools::process404();
}

Да и куча тем было на форумах битрикса

@domosed1963
Copy link

Сработал вот такой код в init.php.
<? AddEventHandler("main", "OnEpilog", "valery_page_epilog"); function valery_page_epilog() { global $APPLICATION; //Проверка на 404 страницу $is_page_404 = false; if(defined("ERROR_404")==true) $is_page_404 = true; //Добавление тегов rel=canonical: начало if($is_page_404==false ) { $page_content = ob_get_contents(); if($page_content!=false && strpos($page_content, '<!-- has_stranation_pagen_1 -->')!==false) { //canonical на существующей странице $GLOBALS['APPLICATION']->SetPageProperty('canonical',(($_SERVER["HTTPS"] == "on") ? "https://" : "http://") . $_SERVER['SERVER_NAME'].$GLOBALS['APPLICATION']->GetCurPageParam("", array ("num", "sort", "view", "order", "back_url_admin", "clear_cache")) ,false); } elseif(strpos($page_content, '<!-- it_more_page_stranation -->')) //canonical на не существующей странице { $GLOBALS['APPLICATION']->SetPageProperty('canonical',(($_SERVER["HTTPS"] == "on") ? "https://" : "http://") . $_SERVER['SERVER_NAME'].$GLOBALS['APPLICATION']->GetCurPageParam("", array ("PAGEN_1", "num", "sort", "view", "order", "back_url_admin", "clear_cache")) ,false); } } } //Добавление тегов rel=canonical: конец ?>
Или 404 можно.
//404 на не существующей странице $GLOBALS['APPLICATION']->SetPageProperty('canonical',(($_SERVER["HTTPS"] == "on") ? "https://" : "http://") . $_SERVER['SERVER_NAME'].$GLOBALS['APPLICATION']->GetCurPageParam("", array ("num", "sort", "view", "order", "back_url_admin", "clear_cache")) ,false); } elseif(strpos($page_content, '<!-- it_more_page_stranation -->')) Bitrix\Iblock\Component\Tools::process404( 'Не найден', //Сообщение true, // Нужно ли определять 404-ю константу true, // Устанавливать ли статус true, // Показывать ли 404-ю страницу false // Ссылка на отличную от стандартной 404-ю ); } } //Добавление тегов rel=canonical: конец ?>

@violentino
Copy link

Пролистав over 200 страниц, я наткнулся на это хорошее решение. Благодарю вас от всей души.

@glsem
Copy link

glsem commented Dec 19, 2024

Все ок, спасибо! Только на 10 строчке пропустили скобку

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment