Skip to content

Instantly share code, notes, and snippets.

@Isa3v
Last active February 2, 2024 14:22
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);
}
}
@Isa3v
Copy link
Author

Isa3v commented Jun 13, 2019

Хороший код. Использовал у себя. Не хватает только canonical первой страницы саму на себя, как многие рекомендуют. А как это сделать? Я не программист.

https://gist.github.com/Isa3v/3cf38740d729d9770b854311a0447bd5

@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 страниц, я наткнулся на это хорошее решение. Благодарю вас от всей души.

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