Якорные ссылки в MODX Revolution

Якорные ссылки в MODX Revolution MODX Revo

В случае если у вас настроено ЧПУ, в системной настройке «Использовать вложенные URL» — use_alias_path стоит ДА и в шаблонах присутствует тег <base href=""> (обычно используется для поддержки относительных ссылок), то у вас 100% будут проблемы с использованием якорных ссылок, так как благодаря тегу <base href=""> к ссылке якорю будет добавляться ссылка на главную страницу сайта и ссылка будет ломаться. Но к счастью есть несколько вариантов решения данной проблемы.

Вариант 1. Использование плагина для авто добавления URL при использовании якорей.

Создайте новый плагин jakorja с вот таким содержимым:

if($modx->resource->get('id') !=$modx->config['site_start']) { $modx->resource->_output =str_replace('href="#','href="' .$modx->makeUrl($modx->resource->get('id')) .'#',$modx->resource->_output);}

Создание плагина в modx

и на вкладке «Системные события» ставим галку на против события «OnWebPagePrerender» и сохраняем его.

Создание плагина в modx revo

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

Вариант 2. Приписываем нужный URL «вручную»

Чтобы создать ссылку на якорь «jakor» внутри текущего ресурса :

<a href="[[~[[*id]]]]#jakor">Ссылка на якорь</a>

fenon: <a href="{$_modx->makeUrl($_modx->resource.id)}#jakor">Ссылка на якорь</a>

А чтобы создать ссылку на якорь «jakor» в ресурсе с ID 7 :

<a href="[[~7]]#jakor">Ссылка на якорь</a>

fenon: <a href="{$_modx->makeUrl(7)}#jakor">Ссылка на якорь</a>

Ну а где находится якорь сам якорь: <a name="jakor"></a>

Вариант 3. Удаляем или заменяем <base href=»»>

MODX засовывает данный тег в стандартный шаблон и наверное большинство глядя на то делают также. А он по сути вообще не нужен. Зато минусов у него хватает, особенно это касается новичков, они не понимая основу основ, постоянно об него спотыкаются и задают вопросы типа: «А почему у меня страница без стилей загружается?» и т.д. И в добавок ко всему этому <base href=" "> ломает якорные-ссылки.
В общем, убирайте данный тег из всех своих шаблонов и не прописывайте его, так как мы его заменим тегом <link rel="canonical" href=" "> и за вывод данного тега у нас будет отвечать сниппет Canonical со следующим содержимым:

$resourceId = $modx->resource->get('id');
if (!$resourceId) { return ''; }

/** @var string|array $args */
$args = '';
if (!empty($scriptProperties['args'])) {
  $args = $scriptProperties['args'];
  if (strpos(ltrim($args), '{') === 0) {
    $args = $modx->fromJSON($args);
    $args = (is_array($args)) ? $args : '';

    foreach ($args as $k => $v) {
      if (is_string($k) && !trim($k) && is_string($v) && !trim($v)) {
        unset($args[$k]);
      }
    }
  }
}

$canonicalUrl = $modx->makeUrl($resourceId, '', $args, 'full');

return '<link rel="canonical" href="'. $canonicalUrl .'" />';

Как создавать сниппеты можете почитать в уроке MODX cниппеты

Так вот, данный сниппет может принимать один параметр args, в который можно передать строку запроса вида «qwe=asd&zxc=123» либо json-строку, пригодную для преобразования в массив и последующей его передачи в php-функцию http_build_query.

Да и кстати канонические урл избавляют от дублирования контента)

Итак создали сниппет, удалили во всех шаблонах <base href=""> и на его месте вызвали сниппет [[Canonical]].

Да еще чуть не забыл MODX система канонических URL позволяет делать правильные автоматические редиректы на канонические URL со всех возможных не канонических только в одном случае — это когда у ресурсов-контейнеров нету слеша на конце, а у ресурсов — не контейнеров не установлено расширение, типа «.html»

Так что если вы делаете сайт не по моим урокам, то для вывода нормальных ЧПУ вам желательно проделать следующее (это все делалось в предыдущих уроках, кто их читал и выполнял):

Идем в «Системные настройки»:

в разделе «Дружественные URL» выставляем следующие значения:

  • container_suffix — Суффикс контейнера — пусто;
  • friendly_urls «Использовать дружественные URL» — Да;
  • friendly_urls_strict «Строгий режим дружественных URL» — Да;
  • Автоматическая генерация, транслитерация, вложенные URL, дублирование во всех контекстах — устанавливаем по вкусу

Далее идем в раздел «Сайт» и выставляем следующие значения:

  • link_tag_scheme — Схема URL — abs;

Раздел «Шлюз»:

  • request_method_strict — Строгий метод запроса — Да;

Далее идем в «Сайт» => «Типы содержимого»:

  • HTML text/html — пусто.

(смотрите статью: Как в MODX убрать в URL адресах расширение .html )

В конечном итоге мы получим URL вида: site.ru/container/statya

Данный вариант может создать вам другие проблемы, например некорректные пути до тех же изображений на страницах, в общем вам 90% придется еще что-то до настраивать.

Поделиться с друзьями
Алексей

Веб-дизайнер и SEO оптимизатор. Занимаюсь созданием сайтов с 2010 года и их продвижение с 2012 года!

Оцените автора
( 2 оценки, среднее 5 из 5 )
Web-Revenue.ru
Добавить комментарий

  1. Yurii

    Здравствуйте, после создания плагина, возникла проблема с плавным скролом, он не работает

    Ответить
    1. Голягин Алексей

      Здравствуйте. Значит смените библиотеку отвечающую за скрол. Либо пользуйтесь другими методами без плагина.

      Ответить
  2. Ikromjon

    Здравствуйте! Не знаю ответите ли или нет, нужна помощь. Я создал якорь, она появился на странице, но есть один момент, нужно чтобы при создании якорей, в каком-то блоке автоматически создавались текст с ссылками на эти якоря. Возможно ли это

    Ответить
    1. Алексей автор

      Здравствуйте. Возможно, если написать плагин. Вот например авто генерация содержания https://modx.pro/solutions/4384

      Ответить
  3. Андрей

    спасибо! тоже долго искал, пока тебя не нашел!!! Все работает. Сделал «руками».
    я доволен! часто у тебя тут читаю, спасибо за полезный материал!

    Ответить
    1. Алексей автор

      Пожалуйста)

      Ответить
  4. Прудкий

    Огромное спасибо ) Только у тебя нашел работающее решение

    Ответить
    1. Алексей автор

      Пожалуйста)

      Ответить