Делаем блок похожих статей в Joomla за 3 простых шага
Если ваш сайт на Joomla имеет большое количество материалов, то отличной идеей может стать их дополнительная перелинковка путем добавления блока похожих статей после основного текста. С одной стороны, такой подход позволит увеличить количество просмотров страниц пользователями сайта (это хорошо, в том числе, и для продвижения), с другой стороны, поисковые системы будут лучше индексировать сайт.
В данном уроке я расскажу о том, как вы можете быстро, самостоятельно, и абсолютно бесплатно сделать блок с похожими статьями под основным материалом, выведя в нем практически любую информацию. Для создания блока не используются сторонние расширения, только функционал Joomla «из коробки».
Как угодить всем?
Я долго думал, как подобрать материалы Joomla в блоке похожих статей таким образом, чтобы угодить и поисковым системам и пользователям. Мой опыт показывает, что если подбор материалов автоматизировать, то, как ни старайся, они все равно не будут подходить идеально. Мне кажется, что лучший способ показать именно подходящие материалы – выбрать их вручную.
Если вы автор всех материалов на сайте, или, по крайней мере, хорошо разбираетесь в тематике, то легко сможете подобрать статьи, которые могли бы дополнительно заинтересовать пользователя и при этом были бы релевантными по тематике. Давайте реализуем эту задумку.
Блок похожих статей Joomla. Шаг 1. Создаем дополнительное поле.
Начиная с версии 3.7, в Joomla появились настраиваемые поля (Custom Fields). Используя их, мы можем добавлять к материалам отдельные блоки информации. К сожалению, среди доступных типов полей, нет поля «Похожие материалы Joomla», но зато есть поле SQL, которое мы и будем использовать.
На первом этапе наша задача сводится к тому, чтобы создать для материала дополнительное поле, позволяющее привязывать к нему любые другие материалы. Для этого нам нужен множественный SELECT, опциями которого будут являться все материалы Joomla. Создать его очень легко.
1) Переходим в «Материалы –> Поля» и нажимаем кнопку «Создать»:
Перед вами откроется форма создания нового дополнительного поля. Заполняем ее следующим образом:
На вкладке «Основные» задаем:
- Тип: SQL
- Категория: Все
- Имя: see-more
- Название: на ваш выбор
- Обязательно: Нет
- Мультивыбор: Да
- Запрос: SELECT id as value, title as text FROM #__content WHERE state = 1
На вкладке «Параметры» задаем:
- Показать в: Оба
- Автоматическое отображение: Не показывать автоматически
После этого сохраняем поле, и видим его в списке:
Если всё сделано правильно, то при создании новой статьи или при изменении существующей, вы увидите вкладку «Поля» на которой будет наше созданное поле с возможностью выбора любой опубликованной статьи с сайта.
В настройках поля мы использовали самый простой SQL-запрос, который выбирает все опубликованные материалы из базы данных. Если вы хотите каким-либо образом ограничить этот список, то подправьте запрос под себя, добавив, например, категории или даты публикации для фильтрации выбора. Хотя в Joomla удобно работать с полем SELECT даже с большим списком опций.
Если после создания дополнительного поля вы не видите его в форме редактирования материала, убедитесь, что:
1) У вас активирована опция: «Общие настройки –> Материалы –> Вкладка «Интеграция» –> Включить настраиваемые поля»
2) Плагины дополнительных полей активированы в менеджере плагинов.
3) Вы используете Joomla 3.7 или выше.
На этом первый шаг закончен. Поле выбора похожих материалов создано.
Блок похожих статей Joomla. Шаг 2. Вносим правки в макет материала
Теперь, когда у нас есть возможность выбора похожих материалов, нужно вывести их под текстом текущей статьи. Для этого нам нужно внести некоторые исправления в макет материала Joomla. Хаков не будет, т.к. этот макет переопределяется в шаблон Joomla.
Для переопределения макета материала, копируем файл:
/components/com_content/views/article/tmpl/default.php
в папку:
/templates/ВАШ_ШАБЛОН/html/com_content/article/
и вносим все дальнейшие изменения уже там.
В скопированном файле нам нужно внести следующие изменения:
1) Найдите строчку (~24):
1
|
JHtml::_( 'behavior.caption' ); |
и вставьте после нее:
1
2
3
4
5
6
7
|
//------------------------------------------------------------------------------ //Получаем данные настраиваемых полей в удобном виде foreach ( $this ->item->jcfields as $jcfield ) { $this ->item->jcFields[ $jcfield ->name] = $jcfield ; } //------------------------------------------------------------------------------ |
В принципе, эту строчку можно вставить в любом месте в начале файле после:
1
|
defined( '_JEXEC' ) or die ; |
2) Найдите код:
1
2
3
|
<div itemprop= "articleBody" > <?php echo $this ->item->text; ?> </div> |
и вставьте после него:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
|
<?php //------------------------------------------------------------------------ if ( $this ->item->jcFields[ 'see-more' ]->rawvalue) { $model = JModelLegacy::getInstance( 'Articles' , 'ContentModel' , array ( 'ignore_request' => true)); $appParams = JFactory::getApplication()->getParams(); $model ->setState( 'params' , $appParams ); //Оставьте в следующей строке только те поля, которые нужны вам для отображения похожих статей $model ->setState( 'list.select' , 'a.fulltext, a.id, a.title, a.alias, a.introtext, a.state, a.catid, a.created, a.created_by, a.created_by_alias, a.modified, a.modified_by, a.publish_up, a.publish_down, a.images, a.urls, a.attribs, a.metadata, a.metakey, a.metadesc, a.access, a.hits, a.featured' ); $access = !JComponentHelper::getParams( 'com_content' )->get( 'show_noauth' ); $authorised = JAccess::getAuthorisedViewLevels(JFactory::getUser()->get( 'id' )); $model ->setState( 'filter.access' , $authorised ); //Подставляем ID материалов из дополнительного поля $model ->setState( 'filter.article_id' , $this ->item->jcFields[ 'see-more' ]->rawvalue); $seemore_items = $model ->getItems(); ?> <div class = "related-articles" > <h3>Смотрите также</h3> <ul> <?php foreach ( $seemore_items as $seemore_item ) { ?> <li> <a href= "/<?php echo JRoute::_(ContentHelperRoute::getArticleRoute($seemore_item->id, $seemore_item->catid)); ?>" ><?php echo $seemore_item ->title ?></a> </li> <?php } ?> </ul> </div> <?php } //--------------------------------------------------------------------?> |
Этот код получает материалы Joomla по их ID, которые, в свою очередь, мы берем из дополнительного поля, созданного на первом шаге. Далее материалы выводятся списком в блок похожих статей.
Статьи выводятся простым списком:
На самом деле, в $seemore_item доступно очень много дополнительных данных по статьям, которые вы также можете вывести при желании. Вы можете оформить вывод похожих статей в виде таблице или блоков с картинками, добавить к ним даты, краткое описание, рейтинг и многие другие параметры.
Есть еще один вариант использования, аналогичный старому доброму плагину Extranews – показывать краткое описание похожих материалов, при наведении курсора на ссылку. Если хотите такой вариант, используйте код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
|
<?php //------------------------------------------------------------------------ if ( $this ->item->jcFields[ 'see-more' ]->rawvalue) { $model = JModelLegacy::getInstance( 'Articles' , 'ContentModel' , array ( 'ignore_request' => true)); $appParams = JFactory::getApplication()->getParams(); $model ->setState( 'params' , $appParams ); //Оставьте в следующей строке только те поля, которые нужны вам для отображения похожих статей $model ->setState( 'list.select' , 'a.fulltext, a.id, a.title, a.alias, a.introtext, a.state, a.catid, a.created, a.created_by, a.created_by_alias, a.modified, a.modified_by, a.publish_up, a.publish_down, a.images, a.urls, a.attribs, a.metadata, a.metakey, a.metadesc, a.access, a.hits, a.featured' ); $access = !JComponentHelper::getParams( 'com_content' )->get( 'show_noauth' ); $authorised = JAccess::getAuthorisedViewLevels(JFactory::getUser()->get( 'id' )); $model ->setState( 'filter.access' , $authorised ); //Подставляем ID материалов из дополнительного поля $model ->setState( 'filter.article_id' , $this ->item->jcFields[ 'see-more' ]->rawvalue); $seemore_items = $model ->getItems(); JHTML::_( 'behavior.tooltip' ); ?> <div class = "related-articles" > <h3>Смотрите также</h3> <ul> <?php foreach ( $seemore_items as $seemore_item ) { ?> <li> <a class = "hasTip" title= "<?php echo htmlentities($seemore_item->title); ?>::<?php echo htmlentities($seemore_item->introtext); ?>" href= "/<?php echo JRoute::_(ContentHelperRoute::getArticleRoute($seemore_item->id, $seemore_item->catid)); ?>" ><?php echo $seemore_item ->title ?></a> </li> <?php } ?> </ul> </div> <?php } //--------------------------------------------------------------------?> |
Результат, в этом случае, будет выглядеть так:
Дальнейшее оформление блока зависит только от вашей фантазии.
Блок похожих статей Joomla. Шаг 3. Добавляем похожие материалы и проверяем
Блок похожих материалов Joomla готов. Осталось только наполнить дополнительное поле релевантными статьями для разных материалов Joomla и они автоматически появятся на сайте в нашем блоке.
Поле выбора в Joomla сделано очень удобно и содержит в себе форму поиска по названию, позволяющую быстро ориентироваться даже в большом списке опций:
Вот и всё. Таким нехитрым способом мы реализовали дополнительный, очень полезный функционал, обойдясь встроенными инструментами Joomla, и не используя сторонних расширений.