Как изменить rel="canonical" в "Человекопонятной навигации", выполненной по инструкции pdoPage?

Подскажите, как исправить следующее.
Воспользовался инструкцией "Человекопонятная навигация"

В результате при переходе на страницу отличную от первой в исходном коде страницы meta тег rel=«canonical» ведет не на каноническую страницу (как было до изменений без параметров page-№), а на текущую, и выглядит следующим образом:

<link rel="canonical" href="https://mysite.ru/category/page-2"/>
<link rel="canonical" href="https://mysite.ru/category/page-3"/>

Немного переделал под свои нужды URLы страниц пагинации, но сути не меняет, rel=«canonical» все равно ведет на текущую страницу:
<link rel="canonical" href="https://mysite.ru/category/page/2/"/>
<link rel="canonical" href="https://mysite.ru/category/page/3/"/>

Подскажите, как сделать, чтобы rel=«canonical» при нахождении на любой странице пагинации вел на первую страницу пагинации, вот так:
<link rel="canonical" href="https://mysite.ru/category/"/>

Вот мой код шаблона:
[[!pdoPage@MyPagination?
&element=`pdoResources`
&limit=`3`
&parents=`{$_modx->resource.id}`
&hideContainers=`1`
&fastMode=`1`
&sortby=`publishedon`
&sortdir=`ASK`
&pageLinkScheme=`[[+pageVarKey]]/[[+page]]/`
&includeTVs=`img_sh,alt_img_sh`
&tpl=`@FILE chunks/sh/sh.tpl` 
]]	  
	  
[[!+page.nav]]
Код плагина:
<?php
// Реагируем только на событие OnPageNotFound
if ($modx->event->name == 'OnPageNotFound') {
    // Определяем ключ запроса из настроек
    $req = $modx->getOption('request_param_alias');
    // Ловим нужный ключ страницы
    $pageVarKey = 'page';
    // Если в запросе повторяется наш шаблон "pageVarKey-page", то работаем дальше
    if (preg_match("#.*?(/{$pageVarKey}/(\d+))/#", $_REQUEST[$req], $matches)) {
        // Отрезаем ЧПУ строку и получаем точный адрес текущей страницы
        $uri = str_replace($matches[1], '', $matches[0]);

        // Ищем страницу по этому адресу
        $id = 0;
        // Сначала как есть, со слешем на конце
        if (!$id = $modx->findResource($uri)) {
            // Если не находим - то пробуем отрезать слэш и ищем повторно
            $id = $modx->findResource(rtrim($uri, '/'));
        }

        // Если ресурс найден
        if ($id) {
            // Добавляем номер страницы в глобальные массивы, чтобы pdoPage их там увидел
            $_GET[$pageVarKey] = $_REQUEST[$pageVarKey] = $matches[2];
            // И загружаем эту страницу
            $modx->sendForward($id);
        }
        // Если ресурс не был найден - ничего не делаем, возможно запрос поймает другой плагин
    }
}

Заранее, благодарю!
Дмитрий
16 декабря 2018, 05:16
modx.pro
585
0

Комментарии: 21

Дмитрий
16 декабря 2018, 22:38
0
Неужели нет решения?
    Rasul
    17 декабря 2018, 01:33
    0
    Здравствуйте!
    Пробывали установить в шаблоне адрес, а в вызове снипета установить &setMeta=0?
    Добавить в head —
    <link rel="canonical" href="[[~[[*id]]? &scheme=`full`]]" />
    А в вызов pdoPage добавить параметр —
    &setMeta=0
    Надеюсь был полезен)))
      Дмитрий
      17 декабря 2018, 01:38
      0
      Сейчас попробую.
        Rasul
        17 декабря 2018, 01:42
        0
        [[!pdoPage?
        &любые параметры вызова
        &setMeta=`0`
        ]]
        Ну а тег head редактируете руками…
          Дмитрий
          17 декабря 2018, 01:47
          0
          Этот вариант отключает, например, если находишься на второй странице отключаются мета теги:
          <link rel="prev" href="https://mysite.ru/category/"/>
          <link rel="next" href="https://mysite.ru/category/page/3/"/>
          И

          <link rel="canonical" href="[[~[[*id]]? &scheme=`full`]]" />
          будет висеть на каждой странице шаблона, даже там, где нет пагинации.
            Rasul
            17 декабря 2018, 02:14
            0
            Так ведь
            <link rel="canonical" href="[[~[[*id]]? &scheme=`full`]]" />
            дает Вам каноничную ссылку на всех страницах категории. Ведь Вы этого хотели?

            Так понимаю должно получиться:
            <link rel="canonical" href="https://mysite.ru/category/"/>
            на всех страницах…
              Дмитрий
              17 декабря 2018, 03:47
              0
              Да, но при такой реализации следующие мета-теги не регистрируются в head:
              <link rel="prev" href="https://mysite.ru/category/"/>
              <link rel="next" href="https://mysite.ru/category/page/3/"/>
                Rasul
                17 декабря 2018, 16:10
                0
                Так Вам что нужно видить в head?
                <link rel="prev" href="https://mysite.ru/category/"/>
                <link rel="next" href="https://mysite.ru/category/page/3/"/>
                или
                <link rel="canonical" href="https://mysite.ru/category/"/>
                ?
                Не очень Вас понимаю…
                  Дмитрий
                  17 декабря 2018, 16:43
                  0
                  pdoPage (БЕЗ ПЕРЕДЕЛКИ ПО ВЫШЕУКАЗАННОЙ ИНСТРУКЦИИ) регистрирует в head если находиться, например, на 2 странице:
                  <link rel="canonical" href="https://mysite.ru/category/"/>
                  <link rel="prev" href="https://mysite.ru/category/"/>
                  <link rel="next" href="https://mysite.ru/category/?page=3"/>
                  Я переделал по инструкции, с rel=«prev» и rel=«next» все нормально, выводит правильно, а rel=«canonical» выводится таким образом, что на какой бы странице не находился, канонический адрес указывает на текущую страницу, а не на главную страницу категории.
                  Надо сделать, чтобы было как до переделки, чтобы rel=«canonical» указывал на страницу категории без page№

                  Где-то в коде плагина надо внести изменения, но к сожалению не особо силен в php, конечно если «долго мучиться, что нибудь получится», по крайней мере всегда получалось если ответа не находилось.
                    Rasul
                    17 декабря 2018, 18:51
                    0
                    Странно. Я ведь не просил запутать еще больще)))
                    Покажите что у Вас сейчас и что Вы хотите видить…
                    После будем разбираться. И думаю php нам не понадобится)
                      Rasul
                      17 декабря 2018, 19:29
                      0
                      Если я верно представляю Вашу проблему, то можно поковыряться с такой конструкцией:
                      [[*id:is=`8`:or:is=`9`:then=``:else=`<link rel="canonical" href="[[~[[*id]]? &scheme=`full`]]" />`]]
                      Ее изменить как нужно и добавить зависимости…
                      Подробнее:
                      https://docs.modx.pro/sistema/osnovyi/filtryi-vvoda-i-vyivoda
                      Дмитрий
                      17 декабря 2018, 19:53
                      0
                      У меня сейчас:
                      <link rel="canonical" href="https://mysite.ru/category/page/2/"/>
                      <link rel="prev" href="https://mysite.ru/category/"/>
                      <link rel="next" href="https://mysite.ru/category/page/3/"/>

                      Хочу чтобы было:
                      <link rel="canonical" href="https://mysite.ru/category/"/>
                      <link rel="prev" href="https://mysite.ru/category/"/>
                      <link rel="next" href="https://mysite.ru/category/page/3/"/>

                      Если делать по Вашему варианту, отключить регистрацию мета-тегов — &setMeta=`0` и в head прописать:
                      <link rel="canonical" href="[[~[[*id]]? &scheme=`full`]]" />
                      то останется только:

                      <link rel="canonical" href="https://mysite.ru/category/"/>
                      Rasul
                      17 декабря 2018, 23:42
                      0
                      Попробуйте что то типа:
                      <link rel="canonical" href="[[~[[*id]]? &scheme=`full`]]" />
                      <link rel="prev" href="[[~[[*id]]? &scheme=`full`]][[+page:ne=`1`:then=`/page/[[+page:add]]`/]]">
                      <link rel="next" href="[[~[[*id]]? &scheme=`full`]][[+page:ne=`1`:then=`/page/[[+page:decr]]`]]">
                      Ну и соответственно отключите setMeta в основном вызове…
                      Остальные 2 по аналогии)
                      Дмитрий
                      18 декабря 2018, 20:57
                      0
                      По крайнему Вашему варианту на любой странице в коде вот это:
                      <link rel="canonical" href="https://mysite.ru/uslugi/" />
                      <link rel="prev" href="https://rmysite.ru/uslugi/">
                      <link rel="next" href="https://mysite.ru/uslugi//page/-1">

                      Спасибо за участие, но думаю предложенная концепция не подойдет, так как 3 эти мета-тега постоянно будут в исходном коде. В то время как при нахождении на первой и последней странице должно быть 2 мета-тега.

                      То есть,
                      если находиться на 1 странице должно быть:
                      <link rel="canonical" href="https://rmysite.ru/uslugi/"/>
                      <link rel="next" href="https://rmysite.ru/uslugi/page/2/"/>
                      Если находиться на последней (3-последняя страница), то должно быть:
                      <link rel="canonical" href="https://rmysite.ru/uslugi/"/>
                      <link rel="prev" href="https://rmysite.ru/uslugi/page/2/"/>

                      Поэтому без правки php кода, думаю, не обойтись.
                      Rasul
                      18 декабря 2018, 21:04
                      0
                      Ну тут смотрите сами, как удобно…
                      Просто к примеру можно один из тегов можно не выводить при нахождении к примеру на первой или второй странице… Проблема только в настройке ведь…
                      Дмитрий
                      18 декабря 2018, 21:28
                      0
                      Проблема в том, что у разных категорий могут быть свои шаблоны, это придется там где пагинация, прописывать каждый раз в шаблоне.
                      Хочется сделать в одном месте и там где пагинация, чтобы это включалось.

                      Думаю, как-то в плагине надо прописать условие, что если это rel=«canonical» то не применять /page/№/
                      Дмитрий
                      18 декабря 2018, 21:44
                      0
                      или хотя бы один раз прописать в шаблоне по вашему варианту, но с условиями, что если ресурс с пагинацией, то выводить нужное…
                      Rasul
                      18 декабря 2018, 22:07
                      0
                      Думаю, как-то в плагине надо прописать условие, что если это rel=«canonical» то не применять /page/№/
                      Так в статье, которую я указывал Выше и есть такие примеры вывода…
Роман Л.
Роман Л.
17 июня 2019, 10:11
0
Добрый день!
Удалось найти решение?
Также столкнулся с проблемой неправильного формирования canonical при включение «человекопонятной навигации» в pdoPage
    Роман Л.
    Роман Л.
    17 июня 2019, 11:13
    2
    0
    Работает, если только в сиппете PdoPage заменить строку 244:
    $modx->regClientStartupHTMLBlock('<link rel="canonical" href="' . $canurl . '"/>');
    на
    $modx->regClientStartupHTMLBlock('<link rel="canonical" href="' . $pdoPage->makePageLink($canurl) . '"/>');
    но при очередном обновлении это все слетит =(
      Rasul
      05 июля 2019, 03:28
      0
      Спасибо большое)
      Все чудесным образом получилось!)
    Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
    21