Внутренняя перелинковка страниц сайта Joomla - кольца категорий

Внутренняя перелинковка страниц сайта Joomla - кольца категорий

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

Безусловно, ручная простановка ссылок дает более лучший эффект, так как перед тем, как поставить ту или иную ссылку в текст (или же в модуль), вы учитываете ее актуальность и просматриваете результат каждой страницы. Однако, всегда будет желание иметь под рукой автоматизированный способ перелинковки страниц. Кроме того, в некоторых случаях без автоматизации просто не обойтись. Особенно, когда у вас уже не первая сотня материалов на сайте и перспектива провести несколько ночей за рутинным проставлением ссылок немного удручает.

В данной же статье будет рассмотрено идея построения множественных колец между категориями, а так же ее реализация для Joomla 2.5+ (для Joomla 3.0 и выше данный модуль должен так же подходить, но специального тестирования не проводилось).

 

Суть проблемы перелинковки материалов разных категорий

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

Примечание: Как факт, но на данном сайте, после внедрения кольцевой перелинковки материалов категории, многие статьи, которые никак не индексировались, попали в основной индекс.

Если переносить вышесказанные слова на точку зрения обычного пользователя, то любой читатель, который открыл статью определенного раздела, практически не видит связи с другими категориями. Чаще всего, перед его глазами либо случайно проставленная перелинковка внутри статей, либо модули вида "последние материалы", "рубрики", "архив", "похожие материалы" и так далее. Утрируя, на странице видны либо хаотично проставленные ссылки (постоянно меняющиеся последние материалы, ссылки в статье и так далее), либо связи внутри одной категорий, включая организацию за счет тэгов и ключей. Если еще больше утрировать и говорить простым языком, то вероятность, что пользователь заглянет хотя бы в соседнюю категорию, на полных порах стремится к нулю. Ведь, энтузиастов и альтруистов не так уж много. Нет, ну честно. Вспомните хотя бы себя. Часто ли вы, заходя на незнакомые сайты, неудержимо рвались обследовать его вдоль и поперек? Безусловно, существуют и такие проекты, но тут ключевое слово "существуют". А теперь, попробуйте с учетом вышесказанных слов, посмотреть на картинку со стандартной древовидной структурой:

Примечание: Тем не менее, важно понимать, что речь идет только о том, что видит читатель и не более.

Суть проблемы перелинковки материалов разных категорий

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

 

Идея автоматической перелинковки материалов категорий кольцами

Тут и возникает идея автоматической перелинковки материалов разных категорий таким образом, чтобы образовать из них кольца, что в теории и при удачном сложении обстоятельств позволит пользователям пройтись по всем категориям сайта и полноценно оценить его. В самом простом виде, речь идет о ситуации, когда каждый материал из одной категории ссылается на материал из соседней категории. Таким образом, из всех категорий, в которых есть хотя бы один материал, можно образовать кольцо. Однако, одного кольца очень мало. Поэтому имеет смысл связывать в кольца несколько материалов из каждой категории. Так же необходимо учитывать, что количество материалов в категориях обычно разное. Редко можно найти сайты, где все категории сходятся тютелька в тютельку по количеству статей. Чаще же, все наоборот (где-то 20 статей, где-то 100 и так далее). Но, это еще не все условия и ограничения. Кроме того, такая перелинковка не должна быть мигающей, так как ссылки начинают набирать вес только со временем, и должна быть управляемой, то есть учитывать все добавленные статьи на сайт в автоматическом режиме таким образом, что вы всегда будете знать, к чему приведет добавление материала и как оно отразится на структуре.

Идея автоматической перелинковки материалов категорий кольцами

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

  1. Все материалы каждого раздела сортируются в определенном порядке. Например, по дате создания.
  2. Каждый материал ссылается на несколько материалов из соседней категории. Например, ссылаемся на 5-6 материалов из соседнего раздела.
  3. Номер материала по порядку определяет стартовую позицию для выбора материалов из соседней категории. Допустим в двух категориях есть по 10 статей. Если мы открываем 4-ю по порядку статью, то первым материалом из соседнего раздела так же должен быть четвертый.
  4. Чтобы минимизировать большую разницу в количестве статей, каждый следующий материал может выбираться через выбранный промежуток. Например, через два (1-3-5-7-...)
  5. И последнее. Если при подборе статей мы достигли последней статьи, то продолжаем поиск с самого начала списка. Таким образом, последние статьи будут ссылаться на первые статьи соседней категории.

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

 

Схема внутренней перелинковки страниц кольцами категорий

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

Теперь, рассмотрим 4 варианта упорядочивания для выбора наиболее стабильного, чтобы обеспечивать долговечность ссылок. 

Схема внутренней перелинковки страниц кольцами категорий

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

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

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

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

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

 

Создаем скрипт множественной перелинковки категорий кольцами из материалов для Joomla

Прежде, чем приступать к созданию скрипта множественной перелинковки материалов категорий кольцами в Joomla, необходимо определиться со списком требований и ограничений для скрипта

  • Автоматическое добавление материалов. Каждый добавленный материал должен в автоматическом режиме добавляться, чтобы не приходилось об этом заботиться.
  • Долговечность ссылок. Ссылки по максимуму должны быть немигающими (кокетливое моргание в жизни может и выглядит приятно, но поисковым системам не нравится). Если ссылки будут постоянно меняться, то особого толку от таких ссылок не будет.
  • Простота настройки. Модуль должен настраиваться очень просто и в одном месте.
  • Возможность обхватить как можно больше материалов. Ссылки должны быть разнообразными. Это позволит создать достаточно много колец. 
  • Должны быть возможности исключать и указывать порядок категорий. Практически на каждом сайте есть категории, которые предназначены только лишь для технических целей, поэтому их необходимо исключать. Кроме того, должна быть возможность задавать порядок категорий, чтобы предлагать читателям наиболее релевантную информацию. 

Итак, с условиями и требованиями понятно, можно приступать к реализации. В качестве базового проекта был взят модуль перелинковки из предыдущей статьи, а так же подключена возможность создания миниатюр (в статье указывается, как подключить к сайту и настроить необходимый файл php; если вам не нужны миниатюры, то вы всегда можете подправить отображение модуля).

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

 

Настройки xml-файла определения модуля Joomla

Первое, что необходимо подправить, - это xml-файл модуля. Учтите, что в модуль добавились не только обычные параметры, но и настройки для кэширования, так как в отличии от joomla модуля перелинковки статей одной категории, sql-запросы к базе данных стали более требовательными. Вот набор параметров:

<fields name="params">
    <fieldset name="basic">
        <field 
                name="isMain" 
                type="radio" 
                default="1" 
                label="MOD_CIRCLE_CAT_BY_MAT_ISMAIN" 
                description="MOD_CIRCLE_CAT_BY_MAT_ISMAIN_DESC">
            <option value="1">Да</option>
            <option value="0">Нет</option>
        </field>
 
        <field 
            name="exceptCat" 
            type="text" 
            default="" 
            label="MOD_CIRCLE_CAT_BY_MAT_EXCEPTCAT" 
            description="MOD_CIRCLE_CAT_BY_MAT_EXCEPTCAT_DESC">
        </field>
        <field 
            name="orderCat" 
            type="text" 
            default="" 
            label="MOD_CIRCLE_CAT_BY_MAT_ORDERCAT" 
            description="MOD_CIRCLE_CAT_BY_MAT_ORDERCAT_DESC">
        </field>
        <field 
                name="mat_number" 
                type="integer" 
                default="5" 
                first="1" last="50" step="1"
                label="MOD_CIRCLE_CAT_BY_MAT_LINKS_MAT_LBL" 
                description="MOD_CIRCLE_CAT_BY_MAT_LINKS_MAT_LBL_DESC"
        />
        <field 
                name="shift_number" 
                type="integer" 
                default="1" 
                first="1" last="50" step="1"
                label="MOD_CIRCLE_CAT_BY_MAT_SHIFT_MAT_LBL" 
                description="MOD_CIRCLE_CAT_BY_MAT_SHIFT_MAT_LBL_DESC"
        />
 
    </fieldset>
    <fieldset
        name="advanced">
        <field 
            name="cache"
            type="list"
            default="1"
            label="COM_MODULES_FIELD_CACHING_LABEL"
            description="COM_MODULES_FIELD_CACHING_DESC" >
            <option value="0">COM_MODULES_FIELD_VALUE_NOCACHING</option>
            <option value="1">JGLOBAL_USE_GLOBAL</option>
        </field>
        <field
            name="cache_time"
            type="text"
            default="900"
            label="COM_MODULES_FIELD_CACHE_TIME_LABEL"
            description="COM_MODULES_FIELD_CACHE_TIME_DESC" 
        />
        <field name="cachemode" type="hidden" default="itemid"> <option value="itemid"></option> </field>
    </fieldset>
</fields>

Основные изменения. Переименованы и добавлены следующие основные параметры: "mat_number" (количество ссылок на соседнюю категорию), "shift_number" (промежуток или сдвиг для выбора следующего материала в соседней категории), "orderCat" (текстовое поле, где в ручную через запятую указывается порядок следования категорий). Добавлены дополнительные параметры для кэширования: "cachemode" (тип кэширования), "cache_time" (время кэширования), "cache" (включение кэширования, если оно включено глобально). На этом основные изменения в xml-файле закончены.

 

Правка helper.php - функция выбора номеров статей из соседней категории

Теперь, необходимо написать функцию, которая будет формировать номера статей для выбора из соседней категории. Для этого добавим в код helper.php функцию getMaterialWhereForModule:

// Формируем условие для выборки id статей
function getMaterialWhereForModule($startPart, $materialNumber, $linksCount, $shiftCount, $maxCount) {
    if ($maxCount == 0) return '';
    $result = ' (';
    $findElements = array();
    $matRownum = 0;
    $shift = 0;
    
    // Если сдвиг больше количества материалов, то ограничиваем его
    if ($shiftCount >= $maxCount) $shift = $maxCount == 1 ? 1 : $maxCount - 1;
    // иначе просто запоминаем сдвиг
    else $shift = $shiftCount;
 
    // Определяем стартовую позицию
    $matRownum = ($shift + $materialNumber) % $maxCount;
    if ($matRownum == 0) $matRownum = $maxCount;
    
    // Проходимся по кольцу ровно столько раз, сколько нужно ссылок
    for($i = 0; $i < $linksCount; $i++) {
        if (!in_array($matRownum, $findElements)) {
            $findElements[] = $matRownum;
        }
        // Сдвигаем элемент
        $matRownum = ($matRownum + $shift) % $maxCount;
        if ($matRownum == 0) $matRownum = $maxCount;
    }
    
    // Если нашлось меньше ссылок, чем нужно, но элементы все еще есть,
    // то просто добавляем ближайшие элементы к материалу
    if (count($findElements) < $linksCount && count($findElements) < $maxCount) {
        $addingCounter = ($materialNumber + 1) % $maxCount;
        if ($addingCounter == 0) $addingCounter = $maxCount;
        // Заполняем набор пока либо не найдем нужное количество ссылок, либо не закончится набор доступных ссылок
        while(count($findElements) < $linksCount && count($findElements) < $maxCount) {
            // Если элемента нет в массиве, то добавляем его
            if (!in_array($addingCounter, $findElements)) {
                $findElements[] = $addingCounter;
            }
            // Сдвигаем элемент
            $addingCounter = ($addingCounter + 1) % $maxCount;
            if ($addingCounter == 0) $addingCounter = $maxCount;
        }
    }
    
    // Формируем набор
    for($i = 0; $i < count($findElements); $i++) {
        $result .= $findElements[$i];
        if ($i + 1 != count($findElements))
            $result .= ', ';
    }
    
    return $startPart.$result.') ';
}

Функция достаточно просто и снабжена подробными комментариями, так что вы в ней легко разберетесь. Единственное уточнение, в задачи этой функции входит формирования части условия для sql-запроса, а именно конструкции "IN (...)".

 

Правка helper.php - получение идентификатора соседней категории

Теперь необходимо добавить в функцию getList получение идентификатора соседней категории (если она не была определена в параметрах), в которой есть хотя бы один материал, доступный читателям. 

// Получаем элементы номер следующей категории, если таковое возможно
if (($this->isArticle() || $this->isCategory()) 
    && ($menu->getActive()!= $menu->getDefault())) {
    // Получаем следующую категорию
    // Если указан порядок для элемента
    if (!empty($orderCat) && is_array($orderCat) && in_array($idCat, $orderCat) && array_search($idCat, $orderCat) < count($orderCat) - 1) {
        $nextCatID = $orderCat[array_search($idCat, $orderCat) + 1];
    }
    // Иначе ищем следующую категорию с учетом кольца
    else {
        $queryGetNextCat = '
            select a.id
            from (
                select distinct cat.id, 0 as afterCircle
                from #__categories cat
                    join #__content mat
                        on cat.id = mat.catid
                            and mat.state > 0
                            and ( 
                                mat.publish_down is null 
                                or mat.publish_down >= NOW()
                            )
                            and ( 
                                mat.publish_up is null 
                                or mat.publish_up < NOW()
                            )
                            and cat.published > 0
                where cat.id > '.$idCat.'
                    '.$this->getExceptWhereForCatSearch(' and cat.id not in ', $exceptCat).'
                    '.$this->getAccessWhereForUser(' and mat.access ', $user).'
                    '.$this->getAccessWhereForUser(' and cat.access ', $user).'
                union
                select distinct cat.id, 1 as afterCircle
                from #__categories cat
                    join #__content mat
                        on cat.id = mat.catid
                            and mat.state > 0
                            and ( 
                                mat.publish_down is null 
                                or mat.publish_down >= NOW()
                            )
                            and ( 
                                mat.publish_up is null 
                                or mat.publish_up < NOW()
                            )
                            and cat.published > 0
                where cat.id < '.$idCat.'
                    '.$this->getExceptWhereForCatSearch(' and cat.id not in ', $exceptCat).'
                    '.$this->getAccessWhereForUser(' and mat.access ', $user).'
                    '.$this->getAccessWhereForUser(' and cat.access ', $user).'
            ) a
            order by a.afterCircle asc, id asc
            limit 1
        ';
        $db->setQuery($queryGetNextCat);
        $nextCatID = $db->loadResult();
    }
}

Как видите в основе данной части лежит один большой по тексту, но простой по смыслу, sql-запрос к БД. Суть его заключается в том, что мы получаем список всех категорий (исключая текущую категорию и указанные категории в модули), затем сортируем его и берем первый подходящий идентификатор. Единственным, что может показаться сложным, это параметры для фильтрации, но если вы присмотритесь внимательно, то они просто фильтруют все доступные пользователю материалы на сайте в данный момент времени (а так как фильтров несколько, то создается объем).

 

Правка helper.php - получаем все элементы из соседней категории

Теперь, нужно сформировать запросы для получения элементов. И тут есть три варианта. 

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

// Иначе формируем случайный вывод статей из всех доступных категорий
else {
    $queryGetMaterials = '
        select id, catid, \'\' as link, title, access, alias, introtext
        from #__content mat
        where mat.state > 0
            and ( 
                mat.publish_down is null 
                or mat.publish_down >= NOW()
            )
            and ( 
                mat.publish_up is null 
                or mat.publish_up < NOW()
            )
            '.$this->getExceptWhereForCatSearch(' and mat.catid not in ', $exceptCat).'
            '.$this->getAccessWhereForUser(' and mat.access ', $user).'
        order by rand()
        limit '.$linksCount.'
    ';
}

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

 
// Если на странице отображена категория и есть соседняя категория,
// то берем случайные статьи из следующей категории
else if ($this->isCategory() && !empty($nextCatID)) {
    $queryGetMaterials = '
        select id, catid, \'\' as link, title, access, alias, introtext
        from #__content mat
        where mat.state > 0
            and ( 
                mat.publish_down is null 
                or mat.publish_down >= NOW()
            )
            and ( 
                mat.publish_up is null 
                or mat.publish_up < NOW()
            )
            '.$this->getExceptWhereForCatSearch(' and mat.catid not in ', $exceptCat).'
            and mat.catid = '.$nextCatID.'
            '.$this->getAccessWhereForUser(' and mat.access ', $user).'
        order by rand()
        limit '.$linksCount.'
    ';
}

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

$queryGetMaterials = '';
// Если на странице отображена статья и есть соседняя категория,
if ($this->isArticle() && !empty($nextCatID)) {
    // Получаем номер элемента в списке
    $db->setQuery('
        select rownum
        from (
            select *,
                @rownum:= @rownum + 1 as rownum
            from #__content mat, (select @rownum:=0) a
            where mat.state > 0
            and ( 
                mat.publish_down is null 
                or mat.publish_down >= NOW()
            )
            and ( 
                mat.publish_up is null 
                or mat.publish_up < NOW()
            )
            '.$this->getAccessWhereForUser(' and mat.access ', $user).'
            and mat.catid = '.$idCat.'
            order by mat.created
        ) a
        where id = '.$idMat.'
    ');
    
    
    $materialNumber = $db->loadResult();
    
    // Получаем количество статей в нужной категории
    // Получаем номер элемента в списке
    $db->setQuery('
        select count(*)
        from #__content mat
        where mat.state > 0
        and ( 
            mat.publish_down is null 
            or mat.publish_down >= NOW()
        )
        and ( 
            mat.publish_up is null 
            or mat.publish_up < NOW()
        )
        '.$this->getAccessWhereForUser(' and mat.access ', $user).'
        and mat.catid = '.$nextCatID.'
    ');
    
    $maxCount = $db->loadResult();
    
    // Формируем итоговый запрос
    $queryGetMaterials = '
        select id, catid, \'\' as link, title, access, alias, introtext
        from (
            select *,
                @rownum:= @rownum + 1 as rownum
            from #__content mat, (select @rownum := 0) a
            where mat.state > 0
            and ( 
                mat.publish_down is null 
                or mat.publish_down >= NOW()
            )
            and ( 
                mat.publish_up is null 
                or mat.publish_up < NOW()
            )
            '.$this->getAccessWhereForUser(' and mat.access ', $user).'
            and mat.catid = '.$nextCatID.'
            order by mat.created
        ) a
        where '.$this->getMaterialWhereForModule(' a.rownum in ', $materialNumber, $linksCount, $shiftCount, $maxCount).'
    ';
    
}

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

 

Установка и настройка готового модуля перелинковки

Теперь, можно приступить к самому приятному, к установке и настройке готового модуля перелинковки категорий.

Откройте "менеджер расширений" в меню панели администратора Joomla, а затем загрузите и установите архив с модулем.

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

устанавливаем модуль в Joomla

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

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

Находим выключенный модуль и приступаем к его настройке

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

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

Включаем модуль, называем его и указываем позицию 

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

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

Настраиваем доступ модуля перелинковки Joomla

После того, как вы закончили с указанием стандартных параметров, необходимо приступить к настройке основных и дополнительных параметров модуля. Укажите включать или исключать главную страницу. Перечислите через запятую категории, которые необходимо исключить из перелинковки. Желательно указать порядок категорий через запятую. Это позволит вам создать логичную цепь переходов между категориями и сэкономит на запросах в БД. Выберите количество ссылок, которые будут рассчитываться для каждой страницы, а так же сдвиг при пересчете. В дополнительных параметрах, укажите желаемые настройки кэширования.

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

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

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

Смотрим результат перелинковки Joomla

А теперь еще раз смотрим на требования и проверяем выполнились ли они:

  • Автоматическое добавление материалов. Выполнено. Все происходит в автоматическом режиме. Установили и занялись другими делами.
  • Долговечность ссылок. Выполнено. Старые материалы будут содержать долговечные ссылки. Постепенно основа сайта наберет вес в глазах поисковиков.
  • Простота настройки. Выполнено. Модуль имеет достаточно простые настройки, которые настраиваются в одном месте и отдельно для каждого модуля.
  • Возможность обхватить как можно больше материалов. Выполнено. За счет сдвига и особенностей изначального алгоритма, покрываться будет достаточно много материалов. Безусловно, в рамках разумного и возможного.
  • Должны быть возможности исключать и указывать порядок категорий. Выполнено. Можно исключать технические категории и указывать порядок следования разделов, а заодно и экономить на вычислениях в БД.

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

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

mod_circle_link_cat_by_mat.zip 

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

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

+1 # maximus 30.09.2015 20:07
Спасибо! Годная статья.
Особенно порадовал разбор кода плагина. Никогда ранее не писал плагины, а тут в общем-то всё понятно.
Ответить | Ответить с цитатой | Цитировать | Сообщить модератору
0 # Игорь (Администратор) 30.09.2015 21:46
Пожалуйста.

Единственный момент. В терминологии Joomla это не плагин, а модуль.
Ответить | Ответить с цитатой | Цитировать | Сообщить модератору
0 # Назар 22.11.2015 10:05
Здравствуйте, у меня возникает такая ошибка
Parse error: syntax error, unexpected T_PAAMAYIM_NEKUDOTAYIM in /home/nazar2292/domains/my-sait.ru/public_html/mod ules/mod_circle_link_cat_by_mat/helper.php on line 68

Подскажите что исправить
Ответить | Ответить с цитатой | Цитировать | Сообщить модератору
0 # Игорь (Администратор) 22.11.2015 22:31
Здравствуйте.

Какая у вас версия Joomla? Производились ли модификации ядра? Стоят ли какие-нибудь изменяющие компоненты (CCK по типу K2 и так далее)?
Ответить | Ответить с цитатой | Цитировать | Сообщить модератору
0 # Syntetico 21.06.2016 21:50
На Joomla 3.5 будет запускаться?
Ответить | Ответить с цитатой | Цитировать | Сообщить модератору
0 # Игорь (Администратор) 21.06.2016 22:34
Честно говоря, не проверял. Но, там ничего такого критичного нет. По большому счету, если и не запустится, то нужно будет несколько строчек поменять.
Вот здесь есть комментарий по этому поводу ida-freewares.ru/.../
На основе этого модуля и сделан этот.
Еще может быть придется определить переменную DS через define (в переменной хранится разделитель).
Ответить | Ответить с цитатой | Цитировать | Сообщить модератору
0 # easylive 27.07.2018 10:37
Под последнюю версию joomla оптимизирован модуль? php 7 поддерживает?
Ответить | Ответить с цитатой | Цитировать | Сообщить модератору
0 # Игорь (Администратор) 29.07.2018 23:38
Честно говоря, не тестировал. Про правки писал выше. Про php 7 в принципе в коде используются самые базовые примитивы, так что проблем не должно возникнуть.
Ответить | Ответить с цитатой | Цитировать | Сообщить модератору

Добавить комментарий / отзыв

Комментарий - это вежливое и наполненное смыслом сообщение (правила).



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

 

Программы (Freeware, OpenSource...)