Множественная кольцевая перелинковка материалов категории в Joomla 2.5
- Категория: Код
- – Автор: Игорь (Администратор)
Теория - Множественная кольцевая перелинковка материалов категории
Множественная кольцевая перелинковка материалов категории - это организация взаимосвязей материалов категории таким образом, что выпадение статей из индекса поисковых систем будет происходить с минимизацией потери веса страниц, и что организация взаимосвязей будет управляемой, и так же что включение новых статей в категорию будет происходить в автоматическом режиме, без участия ее автора.
Примечание: В рамках данной статьи ограничением является категория. И это связано с тем, что для кольцевой перелинковки материалов всего сайта нужен более сложный механизм, учитывающий взаимосвязи самих категорий. Возможно, в рамках следующих статей будет написан модуль и для общего случая. Но, на текущий момент, все последующее рассуждение пойдет именно для материалов категории в CMS Joomla 2.5.
Примечание: Так же в рамках данной статьи будет рассмотрен обычный сайт, без учета влияния перелинковки материалов контекстными ссылками и прочими механизмами. Это обеспечит более простое понимание самой сути множественных колец.
Примечание: Данная идея была встречена на форуме MaulTalk. Но, отсутствие каких-либо реализаций в интернете (по крайней мере в поисковиках ничего подобного не встретилось) привело как к реализации модуля, так и к написанию этой статьи.
А теперь, чуть более простым и понятным языком.
Немного о самой кольцевой перелинковке
Перелинковку можно организовать разными методами: большим количеством ссылок на продвигаемую страницу, связью "снизу-вверх"/"сверху-вниз", хаотично проставленными ссылками, кольцом, кубом и многими другими методами. Каждый из этих методов преследует свои цели, и нельзя сказать, что какой-то из них лучше или хуже. Все зависит от задачи.
В данном случае, основной интерес сосредоточен на кольцевой перелинковке, так как она дает достаточно много плюсов:
- Равномерное перераспределение веса. Т.е. весь внутренний вес и вес, который приходит с других сайтов, планомерно распределяются между всеми материалами. При перерасчете веса, каждый добавленный материал будет намного быстрее набирать собственный вес
- Все добавленные материалы как минимум имеют ссылки с нескольких других страниц сайта. Т.е. даже если поисковая система не добралась до этих материалов, или просто не захотела их включать в индекс, остается вероятность, что заголовок может привлечь посетителя, и материал не останется без внимания
- Простота понимания, даже при большом количестве материалов вы будете знать ответы на вопросы "что? куда? зачем?"
- Упорядоченность. Не секрет, что любые блоки со ссылками видят не только поисковые системы, но и посетители (И иногда даже щелкают по этим ссылкам). А это значит, что потенциально вы можете провести их по всем материалам сайта, с какой бы станицы не стартовал посетитель
- Связанность релевантных материалов. Отсутствия жесткого требования к порядку организации ссылок. Располагайте рядом наиболее ожидаемые материалы, а не те, которые требует схема
Конечно, у данного метода есть свои проблемы. Но, есть и свои решения.
Суть проблемы: выпадение из индекса, управляемость, включение в кольца
Достаточно часто в статьях "Как правильно оптимизировать ваш сайт" / "Используем перелинковку" / и т.д., употребляется такое слово как "кольцо". Суть метода достаточно проста. Страницы ссылаются таким образом, что образуют кольцо (см. рисунок ниже).
Обычно, это осуществляется простыми ссылка в стиле "Следующая статья" / "Предыдущая статья". С одной стороны, такой метод дает много плюсов, включая распределение веса, простоту понимания и так далее по списку.
С другой стороны, у такого механизма есть несколько проблем. Две достаточно небольшие и одна большая. Небольшие - это управляемость в общем виде и включение новых материалов в кольца. Большая - выпадение из индекса одного из материалов. В случае управляемости, речь больше идет о технической стороне, т.е. по какому принципу организуется кольцо, и какие необходимы условия, чтобы материал был добавлен. В случае включения новых материалов, речь идет о действиях автора, т.е. что необходимо сделать, чтобы материал был добавлен в кольцо.
Если проблемы управляемости и включения материалов решаемы собственными силами, то для случае выпадения из индекса не все так просто. Как только одна их страниц выпадает, кольцо разрывается (См. рисунок).
Как видно, после выпадения страницы "M2" соседние материалы больше не передают вес по кольцу. В случае выпадения одной страницы на сайте с небольшим количеством материалов, это не будет так критично. Так как вы быстро сможете найти выпавшую страницу, и предпринять все необходимые действия, чтобы вернуть ее обратно в индекс. В крайнем случае, вы всегда можете подкорректировать кольцо.
Но, попробуйте представить, что выпала не одна страница, а несколько. Да, еще и материалов на сайте стало достаточно много. Найти все выпавшие страницы будет уже не так просто. Да, и не факт, что вы сможете оперативно обнаружить выпадение страниц.
Что же делать?
И именно тут возникает мысль. А что если сделать не одно, а несколько колец из материалов? Да, и сделать это так, чтобы не заставлять автора статьи бегать по всему списку материалов в поисках "Куда же эти ссылки вставить?", а возложить эти обязанности на сам сайт.
И самый простой и понятный вариант, который приходит в голову, - это сделать так, чтобы каждый материал ссылался на несколько предыдущих и следующих страниц (См. на рисунке выше). Тогда в случае выпадения какого-либо материала будет следующая картина:
Не смотря на то, что материал "Мат. 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
- ru-Ru
- 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" - это константы, которые будут взяты из файлов локализации.
Сам код:
Точка входа модуля - mod_circle_link_mat_by_cat.php
Данный файл начинает исполняться самым первым. И, по сути, его основная задача - это подключить все необходимые ресурсы Joomla, получить данные и передать их в шаблон отображения.
В данном случае из ресурсов нужен только роутинг для корректного составления ссылок. Все остальное уже подключено.
Получение данных - это достаточно объемная задача. Именно поэтому она была вынесена в отдельный файл helper.php. В текущем файле только вызов функции "получить список". Ну, и в самом конце, вызов шаблона для составления html-кода. Каких-то особых сложностей здесь нет.
Сам код:
Файлы локализации - mod_circle_link_mat_by_cat.ini
Файлы локализации строятся простым способом. Перечислением пар "ключ" = "значение". Каких-то сложных мест тут нет.
Примечание: Настоятельно рекомендуем, при составлении имен использовать уникальные имена ключей, чтобы случайно не пересечься с другими локализациями. Например, при составлении вы можете использовать конструкцию "{ИМЯ_МОДУЛЯ} + _ + {КЛЮЧ}".
Файл mod_circle_link_mat_by_cat.ini
Файл mod_circle_link_mat_by_cat.sys.ini
Шаблон отображения - default.php
Вся задача шаблона сводится к простому выводу списка материалов в теге ul. Если у вас используется специфическая верстка, например, через div-вы, то вы всегда можете подправить данный код.
Код:
Составляем хэлпер - helper.php
Данный файл достаточно большой, в нем порядка 250 строк. Поэтому основное внимание будет сосредоточено на двух SQL-запросах и одном куске кода, формирующего реальные ссылки на материалы. Полный же исходный файл вы можете посмотреть в архиве модуля.
Основная проблема при построении запросов - это замыкание кольца. Так как необходимо, по достижению первого и последнего материалов, получать последние и первые статьи соответственно.
Код для получения предыдущих статей:
Запрос может показаться несколько сложным и большим, но на самом деле все очень просто. Первая часть, до union, выбирает из всех материалов только предыдущие для данной статьи. Вторая часть, после union, нужна для получения последних материалов. Т.е. как бы продолжается поиск материалов по кольцу.
Пример. Допустим, в категории есть 5 материалов:
- А - Б - В - Г - Д.
Для простоты, они следуют друг за другом в алфавитном порядке. И вы хотите вывести два предыдущих материала для статьи "Б". В таком случае, предыдущими статьями являются как "А", так и "Д" (так как "Д" является последним материалом). Материал "А" найдется первой частью запроса, а "Д" найдется второй частью запроса.
Для получения следующих материалов, SQL-запрос отличается только проверками и порядком сортировок. Сам код:
Как видите, основное отличие только в обратном порядке поиска и сортировки данных.
Если рассматривать, пример, то для статьи "Г" двумя последующими материалами являются: "Д" и "А" (так как "А" является первым в списке).
После того, как были получены все списки и соединены в один общий список, необходимо сформировать для них ссылки. За эту часть отвечает следующий код:
Вся загвоздка заключается в том, что при обращении к материалу через пункт меню, для него формируется совершенно другая ссылка (это часто применяемый способ, чтобы избавиться от ID материала в Url). При этом важно, чтобы в конструкции "JRoute::_('index.php?Itemid='.$itemid->id)" параметр "Itemid" писался с учетом регистра. Если вы напишите не "Itemid", а "itemid", то на выходе вы получите страшного вида ссылку. С чем это связано? Сложно сказать, но факт остается фактом, параметр регистрозависимый.
Теперь все, что нам осталось, это заархивировать файлы в Zip-архив. Для этого можете использовать бесплатные архиваторы. И все, модуль готов!
Устанавливаем и настраиваем полученный модуль
После всех проделанных трудов, осталось установить и настроить модуль.
Установка достаточна проста. Все что вам нужно - это открыть "Менеджер расширений" и загрузить архив с модулем.
Сразу после установки, данный модуль добавиться в общий список модулей. По умолчанию, он будет выключен.
Примечание: Вы так же можете создать еще несколько модулей для перелинковки, так как его тип будет доступен в общем списке для добавления модулей.
Теперь необходимо настроить модуль. Щелкаем левой кнопкой мыши на модуле. И переходим к настройке.
Первым делом необходимо настроить основные параметры, а именно: указать позицию модуля, изменить состояние на "опубликовано" и определиться с вопросом "Будете ли вы выводить название модуля?".
Теперь необходимо перейти к настройке стандартного блока "Привязка к пунктам меню". Сама настройка ничем не отличается от настройки любого другого модуля. В данном случае был выбран пункт "На всех страницах".
Со стандартными параметрами закончено. Производим настройку параметров самого модуля. Указываем будет ли модуль отображаться на главной. Перечисляем исключаемые категории. Например, указываем ID категории "Uncategorised" (для каждого сайта данная категория может иметь разный ID, поэтому вначале зайдите в "менеджер категорий" и найдите нужную). Выбираем количество предыдущих и следующих материалов.
Сохраняем настройки и смело наблюдаем за результатом. Например, на этом сайте это выглядит следующим образом:
Сам модуль вы можете скачать тут:
mod_circle_link_mat_by_cat.zip
☕ Понравился обзор? Поделитесь с друзьями!
-
-
-
-
-
-
-
-
✎Простые решения JavaScript - ссылки Код
-
✎Простые решения JavaScript - дата и время (русский и iso формат) Код
-
✎Учим DataContext правильно воспринимать Null и DBNull.Value в параметрах Код
Комментарии / отзывы
Тем не менее, многие вещи в модуле сделаны достаточно универсально и, в принципе, вы можете его адаптировать под 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
На PHP 5.6 та же история...
В общем доступ на тестовый сайт отправил на почту, посмотрите, получится ли что сделать...
Вы же просите меня попросту переделать модуль под 3.8, но в измененной формулировке. А это несколько иная задача и иное время.
Помните, что это бесплатный модуль. Как вариант, помогите проекту, например, уникальными обзорами по определенным тематикам, тогда смогу выделить время (вместо написания обзоров) для проверки модуля под 3.8 и выложить его. Это честно. А так это - "не найдется воды, а то так есть хочется, что аж переночевать негде".
Второе. Может пару строчек, может даже одну, а может и сотню. Когда речь идет о версиях и тестировании, это может занять как час-два, так и пяток-иной. Не надо смешивать теплое с мягким.
Третье. По поводу ошибок. Открыть и посмотреть конкретную багу в конкретном сайте, а так же возможно починить ее - это минут 15-20. Плюс, если у вас уже разные баги, то после поддержки 3.8 вы так же начнете говорить "а вот что-то расширения конфликтуют".
Четвертое. "за бескорыстную помощь внакладе вас я бы не оставил". Подобные обещания в интернете ничего не стоят (тем более в пылу обсуждения и тем более от анонимуса). А если рассматривать конкретику, то вот конкретное предложение - помочь проекту обзорами, а я бы модуль нормально протестировал, так как это все время и силы. А как вы еще поможете? Только своими действиями, а не финансами.
Пятое. Помочь в районе 15-20 минут это одно. Уделить от 1-2 до 5+ часов это совершенно иное. Тем более, что ситуация специфическая. Сайт же рассматривает много тем и все они требуют времени и сил (за меня же это никто делать не будет). Поэтому все делается по мере возможности. Выделить 1-5+ часов под сторонний коммерческий проект в стиле "эх, главное чтобы клево было пацану" несколько нерационально.
Суммируя вышесказанное. Если найдутся желающие написать обзоры (и тем самым снять часть нагрузки), то у меня появится время и можно будет сделать модули под 3.8. А так, у меня сейчас нет времени для этого, разве что модуль будет запускаться с небольшими исправлениями багов, как с версией 3.4.3 (чуть ниже).
П.С. И кстати, уже потратил столько времени, что мог бы написать 1-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;
и все запашет.
$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.
Воспользуйтесь материалом по ссылке ниже, там достаточно подробно расписано, как поменять отображение. Хоть описание и для стандартных модулей. Таким же образом можно модифицировать отображение этого модуля. ida-freewares.ru/.../
Единственный момент, если вы будете использовать картинки из предварительного текста, то в sql-запросы необходимо добавить получение поля "introtext", а так же добавить соответствующее поле в class modCirleLinkByCatItemList (helper.php) и добавить копирование поля в функцию cloneRecord.
Примечание: А теперь, однонаправленное кольцо.
ищу похожий плагин для вордпресс. Встретил Ваш IM WP Linker Lite for WooCommerce, но он для магазинов, а для постов не нашел. Не делали для постов WP? Нет планов на разработку? спасибо
Честно говоря, в WP вроде много разных модулей для автоматической перелинковки постов (не сильно изучал, но если в поисковике ввести "wordpress перелинковка", то немало разных подборок). Поэтому как-то не задумывался.