Перепробовал несколько плагинов для вывода "похожих публикаций" на странице детального просмотра. Но с каждым была какая-то беда, начиная с фоновых ajax запросов в административную часть сайта, до наличия маркетинговой ловушки от сторонних сайтов, которая отяжеляла загрузку контента. Решился запрограммировать самостоятельно.
В этой статье расскажу, как сделать блок "похожие публикации" самостоятельно, без плагинов. Этот блок располагается на странице детального просмотра публикации, под статьёй. Ссылки в блоке увеличивают вовлечённость пользователей, предлагая прочитать статью по той же теме.
Получим следующее:
Для реализации нужно знание программирования на PHP и CSS. Запрограммируем так, чтобы не было всех бесилок, которые присутствуют в плагинах этой тематики:
- Не будет js/jq скриптов. Ведь для блока из нескольких ссылок они и не нужны!
- Не будет обращений через jq/ajax в административную часть сайта (как у некоторых плагинов)
- Не будет назойливой рекламы и требований доната в административном интерфейса. У нашего программного кода не будет интерфейса в административной части вообще. Это плюс - админка будет работать быстрее.
- Не будет маркетинговой ловушки, которая собирает данные о пользователях и отсылает сторонним компаниям.
В конечном итоге хотим:
- Получить блок ссылок в виде плитки, в несколько рядов (4 в ряд, 2 рада).
- В каждой плитке будет уменьшенное (ресайзнутое) фото публикации и название.
- Сделаем так, чтобы кликабельными были не только названия, но и картинка. Добавим осветление блока при наведении курсора.
- Будут выводиться ссылки на публикации в том же разделе (не с теми же тегами).
- Статьи будут выбираться в случайном порядке. В выводе не должно быть текущей статьи.
- Весь блок будет появляться, только если есть хотя бы одна "похожая" статья.
- Подбор "похожих" статей ведётся из всех рубрик, к которых находится текущая статья.
Я не программист для WordPress. Поэтому собирал куски кода по интернету. Из-за этого решил пожертвовать одной необходимой функцией - кешированием результата. Но это не проблема, ведь у меня работает WP Super Cache, и скомпилированные однажды страницы выдаются через nginx, как статичные html. Если на сайте вообще нет средств кеширования страницы, то в блоке "похожие" публикации будут непрерывно выводиться новые результаты. Это будет замедлять сайт.
Я не верстальщик, поэтому прошу не кидать помидоры, как только увидите блочные элементы внутри строчных. Сделал так, чтобы работало. О правильности не думал. Каюсь.
Программируем html/php
Открываем файл детального просмотра публикации "single.php" (он находится в папке с темой) и добавляем после блока со статьёй следующий html/php код:
<?php
$categories = get_the_category($post->ID);if (count($categories)) {
$categoryIds = array();
foreach($categories as $individual_category) {$categoryIds[] = $individual_category->term_id;
}
$args = array('category__in' => $categoryIds,
'post__not_in' => array($post->ID),
'showposts'=>8,
'orderby'=>'rand',
'caller_get_posts'=>1);
$my_query = new wp_query($args);
if( $my_query->have_posts() ) {?><div class="rpost">
<h3>Похожие публикации</h3>
<div class="rpost-list"><?php
while ($my_query->have_posts()) {$my_query->the_post();
?><div class="rpost-el"><div class="rpost-in"><a href="<?php the_permalink();?>" title="<?php the_title();?>"><div class="img" style="background-image:url('<?php the_post_thumbnail_url(array( 150,150 ));?>');"></div><?php the_title();?></a></div></div><?php}?>
</div>
</div>
<?php
}
wp_reset_query();}?>
Сохраняем файл и проверяем результат в публичной части сайта.
Облагораживаем CSS
Сделаем вывод результата красивым. Открываем CSS файл темы и добавляем в конец:
.rpost {
overflow: hidden;
width: 100%;
display: block;
float: left;
clear: both;}
.rpost h3{clear: both;
display: block;
margin-bottom: 15px;
text-transform: none;
font-size: 20px;
color: #1a1a1a;}
.rpost .rpost-list{width: 100%;}
.rpost .rpost-el{width: 25%;
min-height: 220px;
display: inline-block;
float: left;
line-height: 1.5;
font-size: 14px;}
.rpost .rpost-el a{display: inline-block;
width: 100%;}
.rpost .rpost-el a:hover{opacity: 0.7;}
.rpost .rpost-in{padding: 0 5px;}
.rpost .img{background: 50% 50% no-repeat;
max-width: 100%;
height: 100px;
margin-bottom: 15px;
background-size: cover !important;}
Сохраняем файл и проверяем результат в публичной части. Перезагружаем страницу через Ctrl+F5, чтобы кеш браузера сбросился и подгрузился изменённый CSS файл.
Параметры
Как можно догадаться из строчки скрипта:
'showposts'=>8,
- он выдаёт ровно 8 публикаций. Можно поменять на любое число кратное 4 (в строке 4 элемента).