Загрузка...

Как угодить всем?

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

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

Блок похожих статей Joomla. Шаг 1. Создаем дополнительное поле.

Начиная с версии 3.7, в Joomla появились настраиваемые поля (Custom Fields). Используя их, мы можем добавлять к материалам отдельные блоки информации. К сожалению, среди доступных типов полей, нет поля «Похожие материалы Joomla», но зато есть поле SQL, которое мы и будем использовать.

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

1) Переходим в «Материалы –> Поля» и нажимаем кнопку «Создать»:

Перед вами откроется форма создания нового дополнительного поля. Заполняем ее следующим образом:

2

3

На вкладке «Основные» задаем:

  • Тип: SQL
  • Категория: Все
  • Имя: see-more
  • Название: на ваш выбор
  • Обязательно: Нет
  • Мультивыбор: Да
  • Запрос: SELECT id as value, title as text FROM #__content WHERE state = 1

На вкладке «Параметры» задаем:

  • Показать в: Оба
  • Автоматическое отображение: Не показывать автоматически

После этого сохраняем поле, и видим его в списке:

4

Если всё сделано правильно, то при создании новой статьи или при изменении существующей, вы увидите вкладку «Поля» на которой будет наше созданное поле с возможностью выбора любой опубликованной статьи с сайта.

5

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

Если после создания дополнительного поля вы не видите его в форме редактирования материала, убедитесь, что:

1) У вас активирована опция: «Общие настройки –> Материалы –> Вкладка «Интеграция» –> Включить настраиваемые поля»

6

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, которые, в свою очередь, мы берем из дополнительного поля, созданного на первом шаге. Далее материалы выводятся списком в блок похожих статей. Если вам сложно разобраться с кодом, начните, например, с видеоуроков html.

Статьи выводятся простым списком:

7

На самом деле, в  $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 } //--------------------------------------------------------------------?>

Результат, в этом случае, будет выглядеть так:

8

Дальнейшее оформление блока зависит только от вашей фантазии.

Блок похожих статей Joomla. Шаг 3. Добавляем похожие материалы и проверяем

Блок похожих материалов Joomla готов. Осталось только наполнить дополнительное поле релевантными статьями для разных материалов Joomla и они автоматически появятся на сайте в нашем блоке.

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

9

Вот и всё. Таким нехитрым способом мы реализовали дополнительный, очень полезный функционал, обойдясь встроенными инструментами Joomla, и не используя сторонних расширений.

{

}