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

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

В данном уроке я расскажу о том, как вы можете быстро, самостоятельно, и абсолютно бесплатно сделать блок с похожими статьями под основным материалом, выведя в нем практически любую информацию. Для создания блока не используются сторонние расширения, только функционал Joomla «из коробки».

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

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

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

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

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

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

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

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):

JHtml::_('behavior.caption');

и вставьте после нее:

//------------------------------------------------------------------------------
//Получаем данные настраиваемых полей в удобном виде
foreach($this->item->jcfields as $jcfield)
	{
	  $this->item->jcFields[$jcfield->name] = $jcfield;
	}
//------------------------------------------------------------------------------

В принципе, эту строчку можно вставить в любом месте в начале файле после:

defined('_JEXEC') or die;

2) Найдите код:

<div itemprop="articleBody">
	<?php echo $this->item->text; ?>
</div>

и вставьте после него:

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

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

7

На самом деле, в  $seemore_item доступно очень много дополнительных данных по статьям, которые вы также можете вывести при желании. Вы можете оформить вывод похожих статей в виде таблице или блоков с картинками, добавить к ним даты, краткое описание, рейтинг и многие другие параметры.

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

<?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, и не используя сторонних расширений.

Об авторе
Об авторе
Wedal (Виталий). Веб-разработчик полного цикла (Full Stack). Создатель и автор сайта Wedal.ru.
Основной профиль – создание сайтов и расширений на CMS Joomla.

Понравилась статья? Сохраните себе на стену:

Ваша оценка материала очень важна для нас. Просим вас оценить статью или оставить отзыв в комментариях.

Комментарии  

0 # RE: Делаем блок похожих статей в Joomla за 3 простых шагаiygv 28.04.2018 10:49
Спасибо за свеженькую статью. Только у меня этот блок вывелся вначале статьи, под заголовком, при чем обычным текстом, а не ссылками.
Ответить | Ответить с цитатой | Цитировать
0 # RE: Делаем блок похожих статей в Joomla за 3 простых шагаWedal 03.05.2018 02:37
iygv, значит вы не отключили опцию "Автоматическое отображение" в настройках поля.
Ответить | Ответить с цитатой | Цитировать
0 # Пожалуйста, пишите!Александр 28.04.2018 16:53
Пожалуйста, пишите впредь!
Даже если ваши заметки не являются необходимыми именно сейчас, они позволяют чувствовать ритм.
Спасибо!
Ответить | Ответить с цитатой | Цитировать
0 # RE: Делаем блок похожих статей в Joomla за 3 простых шагаАлександр 21.05.2018 10:59
Спасибо за отличную статью, Виталий!
Вопрос по теме: "как реализовать вывод такого поля для похожих статей, но не в под текстом текущей статьи, а например, после 5 абзаца?"
Ответить | Ответить с цитатой | Цитировать
0 # RE: Делаем блок похожих статей в Joomla за 3 простых шагаWedal 22.05.2018 03:11
Александр, это немного сложнее. Прежде всего вам нужно точно понять, будут ли у вас в каждой статье абзацы (тег "p"), будет ли в каждой статье 5й абзац. Если ответы везде: ДА, то находим в макете статьи переменную, которая отвечает за вывод текста статьи, далее наша задача разбить ее на две части. В первую часть должны попасть только первые 5 тегов "p". Всё остальное во вторую часть. В результате у вас получится 2 новые переменные. Выводите первую, затем код блока похожих статей, затем вторую. Так решается задача.
Но вообще, это сомнительный вариант, как раз потому, что не всегда в тексте есть абзацы, оформленные тегом "p" и не всегда их 5 и больше. Вы можете также использовать маркер разбиения статьи на 2 части, который будете вставлять в материал самостоятельно, что-то вроде: {divide}. Далее делаете примерно так, как я писал в этом кейсе: https://wedal.ru/virtuemart-cases/kak-razdelit-opisanie-v-kategorii-virtuemart-2-3-na-do-i-posle-tovarov-kejs-6.html
Ответить | Ответить с цитатой | Цитировать

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

Для отправки комментария введите код с картинки:
Защитный код
Обновить

Вверх