Множественная кольцевая перелинковка материалов категории в Joomla 2.5

Множественная кольцевая перелинковка материалов категории в Joomla 2.5

Теория - Множественная кольцевая перелинковка материалов категории

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

Примечание: В рамках данной статьи ограничением является категория. И это связано с тем, что для кольцевой перелинковки материалов всего сайта нужен более сложный механизм, учитывающий взаимосвязи самих категорий. Возможно, в рамках следующих статей будет написан модуль и для общего случая. Но, на текущий момент, все последующее рассуждение пойдет именно для материалов категории в CMS Joomla 2.5.

Примечание: Так же в рамках данной статьи будет рассмотрен обычный сайт, без учета влияния перелинковки материалов контекстными ссылками и прочими механизмами. Это обеспечит более простое понимание самой сути множественных колец.

Примечание: Данная идея была встречена на форуме MaulTalk. Но, отсутствие каких-либо реализаций в интернете (по крайней мере в поисковиках ничего подобного не встретилось) привело как к реализации модуля, так и к написанию этой статьи.

А теперь, чуть более простым и понятным языком.

 

Немного о самой кольцевой перелинковке

Перелинковку можно организовать разными методами: большим количеством ссылок на продвигаемую страницу, связью "снизу-вверх"/"сверху-вниз", хаотично проставленными ссылками, кольцом, кубом и многими другими методами. Каждый из этих методов преследует свои цели, и нельзя сказать, что какой-то из них лучше или хуже. Все зависит от задачи.

В данном случае, основной интерес сосредоточен на кольцевой перелинковке, так как она дает достаточно много плюсов: 

  1. Равномерное перераспределение веса. Т.е. весь внутренний вес и вес, который приходит с других сайтов, планомерно распределяются между всеми материалами. При перерасчете веса, каждый добавленный материал будет намного быстрее набирать собственный вес
  2. Все добавленные материалы как минимум имеют ссылки с нескольких других страниц сайта. Т.е. даже если поисковая система не добралась до этих материалов, или просто не захотела их включать в индекс, остается вероятность, что заголовок может привлечь посетителя, и материал не останется без внимания
  3. Простота понимания, даже при большом количестве материалов вы будете знать ответы на вопросы "что? куда? зачем?"
  4. Упорядоченность. Не секрет, что любые блоки со ссылками видят не только поисковые системы, но и посетители (И иногда даже щелкают по этим ссылкам). А это значит, что потенциально вы можете провести их по всем материалам сайта, с какой бы станицы не стартовал посетитель
  5. Связанность релевантных материалов. Отсутствия жесткого требования к порядку организации ссылок. Располагайте рядом наиболее ожидаемые материалы, а не те, которые требует схема

Конечно, у данного метода есть свои проблемы. Но, есть и свои решения. 

 

Суть проблемы: выпадение из индекса, управляемость, включение в кольца

Достаточно часто в статьях "Как правильно оптимизировать ваш сайт" / "Используем перелинковку" / и т.д., употребляется такое слово как "кольцо". Суть метода достаточно проста. Страницы ссылаются таким образом, что образуют кольцо (см. рисунок ниже). 

Множественная кольцевая перелинковка материалов категории в Joomla 2.5

Обычно, это осуществляется простыми ссылка в стиле "Следующая статья" / "Предыдущая статья". С одной стороны, такой метод дает много плюсов, включая распределение веса, простоту понимания и так далее по списку.

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

Если проблемы управляемости и включения материалов решаемы собственными силами, то для случае выпадения из индекса не все так просто. Как только одна их страниц выпадает, кольцо разрывается (См. рисунок).

Множественная кольцевая перелинковка материалов категории в Joomla 2.5

Как видно, после выпадения страницы "M2" соседние материалы больше не передают вес по кольцу. В случае выпадения одной страницы на сайте с небольшим количеством материалов, это не будет так критично. Так как вы быстро сможете найти выпавшую страницу, и предпринять все необходимые действия, чтобы вернуть ее обратно в индекс. В крайнем случае, вы всегда можете подкорректировать кольцо.

Но, попробуйте представить, что выпала не одна страница, а несколько. Да, еще и материалов на сайте стало достаточно много. Найти все выпавшие страницы будет уже не так просто. Да, и не факт, что вы сможете оперативно обнаружить выпадение страниц. 

 

Что же делать?

И именно тут возникает мысль. А что если сделать не одно, а несколько колец из материалов? Да, и сделать это так, чтобы не заставлять автора статьи бегать по всему списку материалов в поисках "Куда же эти ссылки вставить?", а возложить эти обязанности на сам сайт. 

Множественная кольцевая перелинковка материалов категории в Joomla 2.5

 И самый простой и понятный вариант, который приходит в голову, - это сделать так, чтобы каждый материал ссылался на несколько предыдущих и следующих страниц (См. на рисунке выше). Тогда в случае выпадения какого-либо материала будет следующая картина:

Множественная кольцевая перелинковка материалов категории в Joomla 2.5

Не смотря на то, что материал "Мат. 35" выпал, остальные кольца все же сохранились (синие стрелки показывают на как минимум одно сохранившееся кольцо).

Такая перелинковка будет не только минимизировать риск потери веса при выпадении страниц, но и оставаться управляемой. Вы всегда сможете сказать "куда и как" будет ссылаться материал. При этом добавление и удаление материалов с сайта, будет оставаться предсказуемым и происходить без участия автора. 

 

Практика - Множественная кольцевая перелинковка материалов категории

На практике оказалось, что не все так просто. Давайте рассмотрим наиболее известные модули и плагины (без названий, только механизмы).

Примечанием: Напоминаем, что основной фокус при рассмотрении модулей и плагинов - это организация кольца из материалов. Поэтому другие достоинства и недостатки модулей не будут рассмотрены. 

Существуют модули в стиле "Похожие статьи", которые, в основном, полагаются на метатеги. И чаще всего это keywords. Этот механизм очень сильно смахивает на обычное облако тегов. И даже, если не думать об этом, и быть готовым наполнить keywords, то стоит взглянуть в настройки, и вам станет все ясно. В основном, речь идет либо о красивом выводе превьюшек, либо о множественной фильтрации и сортировке. Организовать таким способом кольцо - нереально. 

Существуют плагины "Следующие/Предыдущие". Их основная задача "провести пользователя от и до". Такие плагины организуют лишь цепочку от начала до конца. Первый и последний материалы не будут ссылаться друг на друга. Поэтому кольцо построить нет возможности.

Примечание: Факт, но, к сожалению, в стандартной комплектации Joomla 2.5 выводить заголовки статей в плагине "Контент - Навигация по страницам" нельзя.

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

Модули, содержащие слово "Последние",  уж точно не позволят создать кольца.

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

Таким образом, оказывается, что создать даже одно кольцо существующими средствами либо не просто, либо вообще невозможно. Именно все это привело к одной простой мысли - необходимо собственное расширение. 

Примечание: Возможно, под эти цели существуют специальные инструменты, но, к сожалению, они так и не нашлись.

Примечание: Конечно, ручным способом все же кольца можно создать, но представьте сколько сил от вас будет требовать не только добавление, но и отслеживание, что кольцо нигде не разорвалось.

 

Пишем свой модуль множественной перелинковки кольцами

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

Первое с чего необходимо начать - это придумать название. Не очень сильно мудрствуя, назовем модуль "Кольцевая перелинковка материалов категории". Техническое же имя будет "mod_circle_link_mat_by_cat".

Следующее, что необходимо сделать, это составить стандартную структуру файлов. 

  • css
    • mod_circle_link_mat_by_cat.css
    • index.html
  • language
    • ru-Ru
      • mod_circle_link_mat_by_cat.ini
      • mod_circle_link_mat_by_cat.sys.ini
      • index.html
    • index.html
  • tmpl
    • default.php
    • index.html
  • helper.php
  • mod_circle_link_mat_by_cat.xml
  • mod_circle_link_mat_by_cat.php
  • index.html

А теперь, по порядку разберемся с назначением каждого из файлов.

  • index.html - пустой файл, который находится во всех каталогах, включая основной каталог модуля
  • mod_circle_link_mat_by_cat.php - точка входа модуля. Этот файл будет запускаться первым при запуске модуля, и он же будет запускать остальные файлы (кроме языков и файла настройки)
  • mod_circle_link_mat_by_cat.xml - файл конфигурации, который включает все мета-настройки модуля. В данном случае используются:
    • название модуля и его описание
    • файлы, которые нужно скопировать 
    • различные параметры, которые будут выведены в административной панели
    • подключение локализации
  • mod_circle_link_mat_by_cat.css - файл со стилями. Он пустой, и создан только с одной целью, чтобы в последствие, при подгонке стилей под ваш сайт (если таковое потребуется), вам не надо было смешивать общие стили сайта со стилями модуля
  • mod_circle_link_mat_by_cat.ini - файл локализации
  • mod_circle_link_mat_by_cat.sys.ini - файл локализации
  • default.php - шаблон отображения. Используется для генерации html-кода, который будет отображаться внутри блока с модулем
  • helper.php - в этот файл будут выноситься все необходимые функции для получения данных

Файл конфигурации - mod_circle_link_mat_by_cat.xml

Файл конфигурации имеет достаточно простую и понятную структуру. Вначале идет описание самого модуля, включая такие поля как автор и описание. Затем в теге "files" перечисляется структура файлов и папок, которую необходимо скопировать при установке. После чего следует тег "languages" с информацией о месторасположении файлов локализации в модуле. Ну и под конец, идет секция "config", в которой определяются необходимые параметры. 

Если все секции, кроме "config", содержат чисто технический характер, и их можно просто скопировать, то для секции с параметрами необходимо добавить небольшое пояснение.

  • isMain - это чекбокс, который запрещает вывод данных на главной странице. По умолчанию включен
  • exceptCat - строка, в которой через запятую перечисляются все ID категорий, для которых модуль не должен выводить ссылки. Например, категория "Uncategorised". По умолчанию, поле пустое
  • prev_mat_number - количество предыдущих материалов (с учетом кольца), которые необходимо вывести. По умолчанию, значение 3
  • next_mat_number - количество следующих материалов(с учетом кольца), которые необходимо вывести. По умолчанию, значение 3

Примечание: Различные имена в виде "MOD_CIRCLE_MAT_BY_CAT_ISMAIN" - это константы, которые будут взяты из файлов локализации.

Сам код:

<?xml version="1.0" encoding="utf-8"?>
 <extension type="module" version="2.5.0" client="site" method="upgrade">
     <name>Кольцевая перелинковка материалов категории</name>
     <author>FBT</author>
     <version>1.0.0</version>
     <creationDate>27 Июня 2014</creationDate>
     <description><![CDATA[
     CircleLinkByCat v.1.0.0<br/><br/>
     [RU]: CircleLinkByCat позволяет выводить соседние материалы в категории для обеспечения множественных колец
     ]]>    
     </description>
     <files>
         <filename>mod_circle_link_mat_by_cat.xml</filename>
         <filename module="mod_circle_link_mat_by_cat">mod_circle_link_mat_by_cat.php</filename>
         <filename>index.html</filename>
         <filename>helper.php</filename>
         <folder>tmpl</folder>
         <folder>css</folder>
         <folder>language</folder>
     </files>
     <languages folder="language">
         <language tag="ru-RU">ru-RU/ru-RU.mod_circle_link_mat_by_cat.ini</language>
         <language tag="ru-RU">ru-RU/ru-RU.mod_circle_link_mat_by_cat.sys.ini</language>
     </languages>
     <config>
         <fields name="params">
             <fieldset name="basic">
                 <field 
                         name="isMain" 
                         type="radio" 
                         default="1" 
                         label="MOD_CIRCLE_MAT_BY_CAT_ISMAIN" 
                         description="MOD_CIRCLE_MAT_BY_CAT_ISMAIN_DESC">
                     <option value="1">Да</option>
                     <option value="0">Нет</option>
                 </field>
  
                 <field 
                     name="exceptCat" 
                     type="text" 
                     default="" 
                     label="MOD_CIRCLE_MAT_BY_CAT_EXCEPTCAT" 
                     description="MOD_CIRCLE_MAT_BY_CAT_EXCEPTCAT_DESC">
                 </field>
                 <field 
                         name="prev_mat_number" 
                         type="integer" 
                         default="3" 
                         first="0" last="20" step="1"
                         label="MOD_CIRCLE_MAT_BY_CAT_PREV_MAT_LBL" 
                         description="MOD_CIRCLE_MAT_BY_CAT_PREV_MAT_LBL_DESC"
                 />
                 <field 
                         name="next_mat_number" 
                         type="integer" 
                         default="3" 
                         first="0" last="20" step="1"
                         label="MOD_CIRCLE_MAT_BY_CAT_NEXT_MAT_LBL" 
                         description="MOD_CIRCLE_MAT_BY_CAT_NEXT_MAT_LBL_DESC"
                 />
  
             </fieldset>
         </fields>
     </config>
 </extension>
  

Точка входа модуля - mod_circle_link_mat_by_cat.php

Данный файл начинает исполняться самым первым. И, по сути, его основная задача - это подключить все необходимые ресурсы Joomla, получить данные и передать их в шаблон отображения. 

В данном случае из ресурсов нужен только роутинг для корректного составления ссылок. Все остальное уже подключено.

Получение данных - это достаточно объемная задача. Именно поэтому она была вынесена в отдельный файл helper.php. В текущем файле только вызов функции "получить список". Ну, и в самом конце, вызов шаблона для составления html-кода. Каких-то особых сложностей здесь нет.

Сам код:

<?php
 // no direct access
 defined( '_JEXEC' ) or die( 'Restricted access' );
  
 // Доступ к роуту
 require_once ( JPATH_ROOT . DS . "components" . DS . "com_content" . DS . "helpers" . DS . "route.php" );
 // Подключаем хэлпер
 require_once(dirname(__FILE__).DS.'helper.php');
  
 // Определяем хэлпер
 $helper = new modCirleLinkByCat();
  
 $module_name = 'mod_circle_link_mat_by_cat';
  
 // Подключаем CSS
 $doc =& JFactory::getDocument();
 $doc->addStylesheet( JURI::root(true) . "/modules/".$module_name."/css/".$module_name.".css" );
  
 // Параметры
 $prevCount = $params->get('prev_mat_number');
 $nextCount = $params->get('next_mat_number');
 $idMat = JRequest::getVar( 'id','' );
 $idCat = $helper->getSection($idMat);
  
 // Проверка для главной страницы
 $menu = &JSite::getMenu();
  
 // Исключаемые категории
 $exceptCat = explode (',', $params->get('exceptCat'));
 $isInExceptCat = false;
  
 // Проверяем категорию на исключенность
 $countExceptCat = count ($exceptCat);
 for($i = 0; $i < $countExceptCat; $i++) {
     if ((int) $exceptCat[$i] == $idCat) {
         $isInExceptCat = true;
         break;
     }
 }
  
 // Проверяем параметры
 if(!$isInExceptCat && ($params->get('isMain') != '1' or $menu->getActive()!= $menu->getDefault())) {
     // Получаем список
     $showList = $helper->getList($idMat, $idCat, $prevCount, $nextCount);
  
     // Выводим через шаблон
     require (JModuleHelper::getLayoutPath($module_name, $params->get('layout', 'default')));
 }
 ?>

Файлы локализации - mod_circle_link_mat_by_cat.ini

Файлы локализации строятся простым способом. Перечислением пар "ключ" = "значение". Каких-то сложных мест тут нет.

Примечание: Настоятельно рекомендуем, при составлении имен использовать уникальные имена ключей, чтобы случайно не пересечься с другими локализациями. Например, при составлении вы можете использовать конструкцию "{ИМЯ_МОДУЛЯ} + _ + {КЛЮЧ}".

Файл mod_circle_link_mat_by_cat.ini

MOD_CIRCLE_MAT_BY_CAT="CircleLinkByCat"
MOD_CIRCLE_MAT_BY_CAT_PREV_MAT_LBL="Кол-во пред. материалов"
MOD_CIRCLE_MAT_BY_CAT_PREV_MAT_LBL_DESC="Укажите желаемое количество предыдущих материалов"
MOD_CIRCLE_MAT_BY_CAT_NEXT_MAT_LBL="Кол-во след. материалов"
MOD_CIRCLE_MAT_BY_CAT_NEXT_MAT_LBL_DESC="Укажите желаемое количество следующих материалов"
MOD_CIRCLE_MAT_BY_CAT_ISMAIN="Исключить главную"
MOD_CIRCLE_MAT_BY_CAT_ISMAIN_DESC="Если вы не хотите, чтобы модуль подключался на главной странице, то выставьте пункт в значение ДА"
MOD_CIRCLE_MAT_BY_CAT_EXCEPTCAT="Исключить категории"
MOD_CIRCLE_MAT_BY_CAT_EXCEPTCAT_DESC="Если на вашем сайте существуют категории, которые необходимо исключить, то введите их ID через запятую"

Файл mod_circle_link_mat_by_cat.sys.ini

MOD_CIRCLE_MAT_BY_CAT="Кольцевая перелинковка материалов категории"

Шаблон отображения - default.php

Вся задача шаблона сводится к простому выводу списка материалов в теге ul. Если у вас используется специфическая верстка, например, через div-вы, то вы всегда можете подправить данный код. 

Код:

<?php 
     // no direct access
     defined( '_JEXEC' ) or die( 'Restricted access' );
 ?>
 <?php
     if (!empty($showList) && count($showList) > 0) {
 ?>
 <div class="circle-link">
     <ul class="circle-link-list">
     <?php
         foreach ($showList as $item) {
     ?>
         <li class="circle-link-list-item">
             <a class="circle-link-list-item-a" href="/<?php echo $item->link ?>" title="<?php echo $item->title ?>">
                 <?php echo $item->title ?>
             </a>
         </li>
     <?php
         }
     ?>
     </ul>
 </div>
 <?php
     }
 ?> 
 

Составляем хэлпер - helper.php

Данный файл достаточно большой, в нем порядка 250 строк. Поэтому основное внимание будет сосредоточено на двух SQL-запросах и одном куске кода, формирующего реальные ссылки на материалы. Полный же исходный файл вы можете посмотреть в архиве модуля.

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

Код для получения предыдущих статей:

/* получаем предыдущие статьи */
select id, link, title, access, alias, 0 as afterCircle
from (
    select * from (
        select id, '' as link, title, access, alias 
        from #__content 
        where 
            /* все предыдущие статьи в категории в опубликованном состоянии */
            catid = '.$idCat.' and id < '.$idMat.' and state > 0 
            /* дата публикации не закончилась */
            and (publish_down is null or publish_down >= NOW())
            /* материал опубликован */
            and (publish_up is null or publish_up < NOW())
        /* нужно получать с конца списка */
        order by id desc limit 0,'.$prevCount.'
    ) sort 
    order by id asc
) a
union
/* получаем данные для случая, если предыдущих статей меньше, чем надо */
select id, link, title, access, alias, 1 as afterCircle
from (
    select * from (
        select id, '' as link, title, access, alias 
        from #__content 
        where 
            /* все последующие статьи в категории в опубликованном состоянии */
            catid = '.$idCat.' and id > '.$idMat.' and state > 0
            /* дата публикации не закончилась */
            and (publish_down is null or publish_down >= NOW())
            /* материал опубликован */
            and (publish_up is null or publish_up < NOW())
        /* нужно получать с конца списка */
        order by id desc limit 0,'.$prevCount.'
    ) sort 
    order by id desc
) b

Запрос может показаться несколько сложным и большим, но на самом деле все очень просто. Первая часть, до union, выбирает из всех материалов только предыдущие для данной статьи. Вторая часть, после union, нужна для получения последних материалов. Т.е. как бы продолжается поиск материалов по кольцу. 

Пример. Допустим, в категории есть 5 материалов:

  • А - Б - В - Г - Д.

Для простоты, они следуют друг за другом в алфавитном порядке. И вы хотите вывести два предыдущих материала для статьи "Б". В таком случае, предыдущими статьями являются как "А", так и "Д" (так как "Д" является последним материалом). Материал "А" найдется первой частью запроса, а "Д" найдется второй частью запроса.

Для получения следующих материалов, SQL-запрос отличается только проверками и порядком сортировок. Сам код:

/* получаем следующие статьи */
select id, link, title, access, alias
from (
    select * from (
        select id, '' as link, title, access, alias 
        from #__content 
        where 
            /* все следующие статьи в категории в опубликованном состоянии */
            catid = '.$idCat.' and id > '.$idMat.' and state > 0
            /* дата публикации не закончилась */
            and (publish_down is null or publish_down >= NOW())
            /* материал опубликован */
            and (publish_up is null or publish_up < NOW())
        /* нужно получать с начала списка */
        order by id asc limit 0,'.$nextCount.'
    ) sort 
    order by id asc
) a
union
/* получаем данные для случая, если следующих статей меньше, чем надо */
select id, link, title, access, alias
from (
    select * from (
        select id, '' as link, title, access, alias 
        from #__content 
        where 
            /* все предыдущие статьи в категории в опубликованном состоянии */
            catid = '.$idCat.' and id < '.$idMat.' and state > 0
            /* дата публикации не закончилась */
            and (publish_down is null or publish_down >= NOW())
            /* материал опубликован */
            and (publish_up is null or publish_up < NOW())
        /* нужно получать с начала списка */
        order by id asc limit 0,'.$nextCount.'
    ) sort 
    order by id asc
) b

Как видите, основное отличие только в обратном порядке поиска и сортировки данных. 

Если рассматривать, пример, то для статьи "Г" двумя последующими материалами являются: "Д" и "А" (так как "А" является первым в списке).

После того, как были получены все списки и соединены в один общий список, необходимо сформировать для них ссылки. За эту часть отвечает следующий код:


// Для всех полученных элементов добавляем link
if(count($showList) > 0) {
    $countShowList = count ($showList);
    for ($i = 0; $i < $countShowList; $i++) {
         /* Получаем пункт меню */
        $itemid = &JSite::getMenu()->getItems('link', 'index.php?option=com_content&view=article&id='.($showList[$i]->id), true);
        /* Если пункт меню существует, то формируем ссылку для него */
        if(!empty($itemid)) {
            $showList[$i]->link = JRoute::_('index.php?Itemid='.$itemid->id);
        }
        /* Если пункта меню не существует, то формируем ссылку с учетом SEF */
        else {
            /* Получаем пункт меню для категории */
            $catitemid = JSite::getMenu()->getItems('link', 'index.php?option=com_content&view=category&id='.$idCat, true);
            /* Если пункт меню существует, то формируем ссылку для него */
            if(!empty($catitemid)) 
                $showList[$i]->link = JRoute::_('index.php?option=com_content&view=article&id='.($showList[$i]->id).':'.($showList[$i]->alias).'&catid='.$idCat.'&Itemid='.$catitemid->id);
            /* Если пункта меню не существует, то формируем ссылку с учетом SEF */
            else
                $showList[$i]->link = JRoute::_('index.php?option=com_content&view=article&id='.($showList[$i]->id).':'.($showList[$i]->alias).'&catid='.$idCat);
        }
    }
}

Вся загвоздка заключается в том, что при обращении к материалу через пункт меню, для него формируется совершенно другая ссылка (это часто применяемый способ, чтобы избавиться от ID материала в Url). При этом важно, чтобы в конструкции "JRoute::_('index.php?Itemid='.$itemid->id)" параметр "Itemid" писался с учетом регистра. Если вы напишите не "Itemid", а "itemid", то на выходе вы получите страшного вида ссылку. С чем это связано? Сложно сказать, но факт остается фактом, параметр регистрозависимый. 

Теперь все, что нам осталось, это заархивировать файлы в Zip-архив. Для этого можете использовать бесплатные архиваторы. И все, модуль готов!

 

Устанавливаем и настраиваем полученный модуль

После всех проделанных трудов, осталось установить и настроить модуль.

Установка достаточна проста. Все что вам нужно - это открыть "Менеджер расширений" и загрузить архив с модулем.

Множественная кольцевая перелинковка материалов категории в Joomla 2.5 

Сразу после установки, данный модуль добавиться в общий список модулей. По умолчанию, он будет выключен.

Множественная кольцевая перелинковка материалов категории в Joomla 2.5 

Примечание: Вы так же можете создать еще несколько модулей для перелинковки, так как его тип будет доступен в общем списке для добавления модулей.

Теперь необходимо настроить модуль. Щелкаем левой кнопкой мыши на модуле. И переходим к настройке.

Первым делом необходимо настроить основные параметры, а именно: указать позицию модуля, изменить состояние на "опубликовано" и определиться с вопросом "Будете ли вы выводить название модуля?".

Множественная кольцевая перелинковка материалов категории в Joomla 2.5 

Теперь необходимо перейти к настройке стандартного блока "Привязка к пунктам меню". Сама настройка ничем не отличается от настройки любого другого модуля. В данном случае был выбран пункт "На всех страницах".

Множественная кольцевая перелинковка материалов категории в Joomla 2.5 

Со стандартными параметрами закончено. Производим настройку параметров самого модуля. Указываем будет ли модуль отображаться на главной. Перечисляем исключаемые категории. Например, указываем ID категории "Uncategorised" (для каждого сайта данная категория может иметь разный ID, поэтому вначале зайдите в "менеджер категорий" и найдите нужную). Выбираем количество предыдущих и следующих материалов.

Множественная кольцевая перелинковка материалов категории в Joomla 2.5 

Сохраняем настройки и смело наблюдаем за результатом. Например, на этом сайте это выглядит следующим образом:

Множественная кольцевая перелинковка материалов категории в Joomla 2.5 

Сам модуль вы можете скачать тут:

mod_circle_link_mat_by_cat.zip

Социальные сети

☕ Понравился обзор? Поделитесь с друзьями!

Комментарии / отзывы  

0 # Yasya 08.07.2015 15:43
Для категорий К2 модуль не подойдет? Как можно код поправить чтобы К2 выводились? Спасибо
Ответить | Ответить с цитатой | Цитировать | Сообщить модератору
0 # Игорь (Администратор) 09.07.2015 03:20
Нет, не подойдет. Я его делал именно для этого сайта, а тут стоит стандартный механизм.

Тем не менее, многие вещи в модуле сделаны достаточно универсально и, в принципе, вы можете его адаптировать под K2. Но, для этого нужно изменить несколько мест:
1. Поменять запросы sql, изменить таблицы и поля (если потребуется). Сам вид запросов необходимо оставить теми же.
2. Изменить получение параметров в mod_circle_link_mat_by_cat.php
- $idMat = JRequest::getVar( 'id','' );
- $idCat = $helper->getSection($idMat);
- Уточнить проверку ($params->get('isMain') != '1' or $menu->getActive()!= $menu->getDefault())
3. Изменить функции формирования URL и проверки доступности в helper.php
- getSection
- isAccessible
- Формирование URL в конце getList
Ответить | Ответить с цитатой | Цитировать | Сообщить модератору
0 # Саня 09.09.2018 21:11
А как его адаптировать под joomla 3.8? После вывода модуля выдает ошибку Error. Причем шаблон выводит, а сам контент страницы нет.
Ответить | Ответить с цитатой | Цитировать | Сообщить модератору
0 # Игорь (Администратор) 11.09.2018 00:01
Модуль исходно написан под Joomla 2.5. Что там в 3.8 не знаю, не тестировал. Ошибку-то пришлите, может там все тривиально.
Ответить | Ответить с цитатой | Цитировать | Сообщить модератору
0 # Саня 12.09.2018 05:55
На основном шаблоне выдает: Error: Call to undefined method Error::get(): Using $this when not in object context
Ответить | Ответить с цитатой | Цитировать | Сообщить модератору
0 # Игорь (Администратор) 12.09.2018 20:52
А какой номер строки и какой файл?
Ответить | Ответить с цитатой | Цитировать | Сообщить модератору
0 # Саня 12.09.2018 23:17
В том то и дело что больше ничего, проверял на PHP 7.2. Переключился на 7.0, выдало следующее: "Error: Call to undefined method JDatabaseExceptionExecuting::get(): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ') and mat.access = 1 order by rand() limit 5' at line 12"
На PHP 5.6 та же история...
Ответить | Ответить с цитатой | Цитировать | Сообщить модератору
0 # Игорь (Администратор) 16.09.2018 21:54
А вы уверены, что это тот же модуль? Просто "mat.access = 1" в sql-запросе просто нету, а уже тем более случайная сортировка
Ответить | Ответить с цитатой | Цитировать | Сообщить модератору
0 # Саня 17.09.2018 04:17
Цитата:
А вы уверены, что это тот же модуль? Просто "mat.access = 1" в sql-запросе просто нету, а уже тем более случайная сортировка
Да действительно, был установлен другой модуль: "mod_circle_link_cat_by_mat.zip" из другой вашей статьи: "Внутренняя перелинковка страниц сайта Joomla - кольца категорий". Изначально устанавливал этот модуль, а после уже установил тот, но ни один из них не запустился. В общем данную ошибку выдает именно тот модуль. Перепроверил еще раз с этим модулем: на PHP 5.6, 7.0 модуль все таки запустился, но на 7.2 также выдает ошибку: "0 - Using $this when not in object context", без всяких пояснений номера строки и файла... На данный момент интересен модуль для перелинковки материалов разных категорий, извиняюсь что пишу не в том разделе, но можно ли исправить ошибку с тем модулем?
Ответить | Ответить с цитатой | Цитировать | Сообщить модератору
0 # Игорь (Администратор) 17.09.2018 18:27
Присылайте доступы в почту, если есть тестовый сайт. Тогда можно будет посмотреть. Но, еще раз напоминаю, что не тестировал, поэтому может и не запустится.
Ответить | Ответить с цитатой | Цитировать | Сообщить модератору
0 # Саня 18.09.2018 07:20
Создал чистую Joomla 3.8.12, установил только модуль, и вот что выдало: Warning: Use of undefined constant DS - assumed 'DS' (this will throw an Error in a future version of PHP) in public_html/modules/mod_circle_link_cat_by_mat/mod _circle_link_cat_by_mat.php on line 6 Warning: require_once(public_htmlDScomponentsDScom_contentD ShelpersDSroute.php): failed to open stream: No such file or directory in public_html/modules/mod_circle_link_cat_by_mat/mod _circle_link_cat_by_mat.php on line 6 Fatal error: require_once(): Failed opening required 'public_htmlDScomponentsDScom_contentDShelpersDSro ute.php' (include_path='.:/usr/share/php') in public_html/modules/mod_circle_link_cat_by_mat/mod _circle_link_cat_by_mat.php on line 6
В общем доступ на тестовый сайт отправил на почту, посмотрите, получится ли что сделать...
Ответить | Ответить с цитатой | Цитировать | Сообщить модератору
0 # Игорь (Администратор) 19.09.2018 00:52
Эммммм..... Какой смысл от пустой демки, тем более, что ошибки разные и установить пустую джумлу дело не сложное. Суть была в том, что у вас вроде как запустилось и может быть это легко исправить.

Вы же просите меня попросту переделать модуль под 3.8, но в измененной формулировке. А это несколько иная задача и иное время.

Помните, что это бесплатный модуль. Как вариант, помогите проекту, например, уникальными обзорами по определенным тематикам, тогда смогу выделить время (вместо написания обзоров) для проверки модуля под 3.8 и выложить его. Это честно. А так это - "не найдется воды, а то так есть хочется, что аж переночевать негде".
Ответить | Ответить с цитатой | Цитировать | Сообщить модератору
0 # Саня 19.09.2018 10:26
Вообще-то именно на счет адаптации я и говорил с первого же предложения, без всяких: "не найдется воды, а то так есть хочется, что аж переночевать негде". Вы же сказали, что по данной ошибке ничего сказать не сможете, нужно смотреть сам сайт... Но чтобы исключить возможные конфликты расширений, я установил чистую версию, хотя и ошибку выбило другую, видимо из-за конфликта с другим расширением и поэтому получились разные ошибки. Ведь если плагин на чистой не пойдет, как же он запустится в моем-то случае? Хотя данный плагин я также проверял на еще одном сайте сайте, который все еще находится на стадии создания на joomla 3.8.12, но с кучей других установленных расширений. Теперь же вы говорите что это "СОВСЕМ" другая задача и что просто так помогать вы не будите, хотя ничего "другого" в этом нету... Если не хотели просто так помогать, то нужно было сразу так и сказать, договорились бы об оплате, хотя и за бескорыстную помощь внакладе вас я бы не оставил. Но то что вы предлагаете: "писать обзоры" за проверку модуля, когда для решения проблемы может потребоваться изменить в коде всего пару строк, нет уж, спасибо! Попахивает [цензура] да и только! Лучше поищу альтернативу, просто жаль потраченного времени...
Ответить | Ответить с цитатой | Цитировать | Сообщить модератору
0 # Игорь (Администратор) 19.09.2018 19:44
Первое. Предупреждение за мат. Выражайте свое негодование культурно.

Второе. Может пару строчек, может даже одну, а может и сотню. Когда речь идет о версиях и тестировании, это может занять как час-два, так и пяток-иной. Не надо смешивать теплое с мягким.

Третье. По поводу ошибок. Открыть и посмотреть конкретную багу в конкретном сайте, а так же возможно починить ее - это минут 15-20. Плюс, если у вас уже разные баги, то после поддержки 3.8 вы так же начнете говорить "а вот что-то расширения конфликтуют".

Четвертое. "за бескорыстную помощь внакладе вас я бы не оставил". Подобные обещания в интернете ничего не стоят (тем более в пылу обсуждения и тем более от анонимуса). А если рассматривать конкретику, то вот конкретное предложение - помочь проекту обзорами, а я бы модуль нормально протестировал, так как это все время и силы. А как вы еще поможете? Только своими действиями, а не финансами.

Пятое. Помочь в районе 15-20 минут это одно. Уделить от 1-2 до 5+ часов это совершенно иное. Тем более, что ситуация специфическая. Сайт же рассматривает много тем и все они требуют времени и сил (за меня же это никто делать не будет). Поэтому все делается по мере возможности. Выделить 1-5+ часов под сторонний коммерческий проект в стиле "эх, главное чтобы клево было пацану" несколько нерационально.

Суммируя вышесказанное. Если найдутся желающие написать обзоры (и тем самым снять часть нагрузки), то у меня появится время и можно будет сделать модули под 3.8. А так, у меня сейчас нет времени для этого, разве что модуль будет запускаться с небольшими исправлениями багов, как с версией 3.4.3 (чуть ниже).

П.С. И кстати, уже потратил столько времени, что мог бы написать 1-2 небольших заметок.
Ответить | Ответить с цитатой | Цитировать | Сообщить модератору
0 # Кирилл 14.08.2015 14:25
Спасибо автору за его труд, данный модуль у меня отлично работает в последней версии Joomla 3.4.3 После установки проверил вес страниц через сайт Мегаиндекса, общий вес всех страниц вырос практически в 2 раза, осталось подождать несколько АПов и посмотреть на результаты.
Если при переходе на пункты меню выдает 404 ошибку, то сделайте следующее:
В файле helper.php модуля необходимо заменить 29-ю строчку:

$sql = "SELECT section as catid FROM #__categories WHERE id = ".$iId;

на строчку

$sql = "SELECT parent_id as catid FROM #__categories WHERE id = ".$iId;

и все запашет.
Ответить | Ответить с цитатой | Цитировать | Сообщить модератору
0 # Игорь (Администратор) 16.08.2015 17:45
Спасибо за отзыв. С моей стороны могу сказать, что на этом сайте результаты действительно неплохие. Многие страницы, которые месяцами были вне индекса, попали в него. Хоть, модуль и был в последствии доработан (например, добавлены картинки), он и до сих пор успешно используется.
Ответить | Ответить с цитатой | Цитировать | Сообщить модератору
0 # Testu 21.09.2020 01:35
Так же для Joomla 3, если у вас ссылки не через менюшки делаются, а через автоматический номер с id обзоров, то нужно еще найти в хелпере строку (251):

$showList[$i]->link = JRoute::_('index.php?option=com_content&view=article&id='.($showList[$i]->id).':'.($showList[$i]->alias).'&catid='.$idCat);

И заменить ее следующим кодом:
//------------------
{
$testu = ContentHelperRoute::getArticleRoute(($showList[$i] ->id).':'.($showList[$i]->alias), $idCat);
$routerForSEF = new JRouterSite(array('mode'=>JROUTER_MODE_SEF));
// better will be check if SEF option is enable!
$testu = $routerForSEF->build($testu)->toString(array('path ', 'query', 'fragment'));
// SEF URL !
$testu = str_replace('/administrator/', '', $testu);
//and now the tidying, as Joomlas JRoute makes a cockup of the urls.
$testu = str_replace('component/content/article/', '', $testu);

$showList[$i]->link = $testu;

}
//------------------


Тогда не будет проблем с длинными ЧПУ. Старая проблема Joomla.
Ответить | Ответить с цитатой | Цитировать | Сообщить модератору
0 # Сергей 12.12.2015 18:12
две недели искал что то подобное, делаю новый сайт и под основным материалом хочу чтоб выводилось шесть предыдущих материалов категории (картинка под ней ссылка), этот пример идеально подходит, вот только не как у меня не получается сделать чтоб картинки выводились, не подскажете как у вас реализовано?
Ответить | Ответить с цитатой | Цитировать | Сообщить модератору
0 # Игорь (Администратор) 14.12.2015 00:43
Цитирую Сергей:
две недели искал что то подобное, делаю новый сайт и под основным материалом хочу чтоб выводилось шесть предыдущих материалов категории (картинка под ней ссылка), этот пример идеально подходит, вот только не как у меня не получается сделать чтоб картинки выводились, не подскажете как у вас реализовано?


Воспользуйтесь материалом по ссылке ниже, там достаточно подробно расписано, как поменять отображение. Хоть описание и для стандартных модулей. Таким же образом можно модифицировать отображение этого модуля. ida-freewares.ru/.../

Единственный момент, если вы будете использовать картинки из предварительного текста, то в sql-запросы необходимо добавить получение поля "introtext", а так же добавить соответствующее поле в class modCirleLinkByCatItemList (helper.php) и добавить копирование поля в функцию cloneRecord.
Ответить | Ответить с цитатой | Цитировать | Сообщить модератору
0 # Voldar 28.06.2016 16:09
Да, обзор хороший. спасибо.(кольцо ;-) )

Примечание: А теперь, однонаправленное кольцо.
Ответить | Ответить с цитатой | Цитировать | Сообщить модератору
0 # Игорь 29.05.2023 22:44
Доброго дня,
ищу похожий плагин для вордпресс. Встретил Ваш IM WP Linker Lite for WooCommerce, но он для магазинов, а для постов не нашел. Не делали для постов WP? Нет планов на разработку? спасибо
Ответить | Ответить с цитатой | Цитировать | Сообщить модератору
0 # Игорь IF 04.06.2023 12:43
Здравствуйте

Честно говоря, в WP вроде много разных модулей для автоматической перелинковки постов (не сильно изучал, но если в поисковике ввести "wordpress перелинковка", то немало разных подборок). Поэтому как-то не задумывался.
Ответить | Ответить с цитатой | Цитировать | Сообщить модератору
Добавить комментарий / отзыв
Комментарий - это вежливое и наполненное смыслом сообщение (правила).



* Нажимая на кнопку "Отправить", Вы соглашаетесь с политикой конфиденциальности.
Социальные сети
Программы (Freeware, OpenSource...)