Всем привет! В этот раз на SEO-Mayak.com я продемонстрирую: как вывести похожие записи или статьи на WordPress без плагина.
Существует масса плагинов для вывода похожих статей, такие как: Simple Tags, Similar Posts или Yet another related posts.
Конечно, иметь дело с плагинами гораздо проще, чем копаться в кодах различных файлов. Но многие знакомые мне блогеры, которые в свое время понаставили кучу плагинов, теперь всячески пытаются от них избавиться.
Известно, что плагины не хило нагружают сервер и значительно снижают скорость загрузки страницы. Заметно это становится не сразу, а со временем, когда блог наполнится контентом и посещаемость будет стремится к 1000 уников.
Поэтому я решил, что буду описывать на своем блоге только те плагины, которые действительно являются важными. А о плагинах, что в последствии все равно заменятся кодами, писать не вижу смысла.
Иначе получится так, что в одной статье я расхваливаю какой-то плагин, описывая его офигенный функционал и простоту, а в другой мне придется объяснять почему его надо удалить и заменить кодом.
Два способа вывода похожих записей или статей без плагина
Обращаюсь к начинающим веб-мастерам. Ребята, не бойтесь Вы этих кодов, не такие они и страшные. Если вы опасаетесь напороть косяков, то установите себе на компьютер локальный сервер и проводите на нем эксперименты. Я сам, до сих пор все новшества сначала испытываю на локалке и только потом уже готовые решения переношу на свои реальные блоги.
Так что выводить похожие записи надо обязательно!
И так, приступим к рассмотрению вариантов кодов вывода похожих записей на WordPress без плагинов.
Обычно блок похожих записей располагается под статьей, а за вывод статей отвечает файл single.php, с которым мы и будем работать. Напомню, что файл single.php находиться в папке с Вашей темой: wp-content -> themes -> Название темы, а для редактирования файлов советую пользоваться бесплатным текстовым редактором Notepad++.
Способ №1. Функция сортировки похожих статей по меткам (тегам)
Многие веб-мастера используют теги или метки, которые служат для связки статей со схожими темами, но при этом записи могут находиться в разных категориях. Вставляем этот код в файл single.php под статьей.
Шаблоны у всех разные, поэтому экспериментируйте и если не получится с первого раза вставить код в желаемое место, то просто пробуйте его вставить в другое.
<div class="similar_records"> <h3>Похожие записи:</h3> <?php $tags = wp_get_post_tags($post->ID); if ($tags) { $tag_ids = array(); foreach($tags as $individual_tag) $tag_ids[] = $individual_tag->term_id; $args=array( 'tag__in' => $tag_ids, // Сортировка производится по тегам 'post__not_in' => array($post->ID), 'showposts'=>5 // Цифра означает количество выводимых записей ); $my_query = new wp_query($args); if( $my_query->have_posts() ) { echo '<ul>'; while ($my_query->have_posts()) { $my_query->the_post(); ?> <li><a href="<?php the_permalink() ?>" rel="bookmark" title="<?php the_title_attribute(); ?>"><?php the_title(); ?></a></li> <?php } echo '</ul>'; } wp_reset_query(); } ?></div>
Если в коде ничего не менять, то вывод похожих статей будет будет осуществятся по тегам (меткам), но с учетом даты, начиная с самих свежих. Для того, чтобы статьи выводились рандом (в случайном порядке), то необходимо добавить еще одну строчку:
'orderby'=>rand,
Прописываем это условие после 9 строки:
'tag__in' => $tag_ids,
Также не лишнем будет добавить еще одно условие:
'caller_get_posts'=>1,
Которое запрещает повторение одной и той же ссылки. Например, у Вас на блоге еще небольшое количество статей, а вы в коде указали вывод по 10 ссылок:
'showposts'=>10,
В этом случаи, в блоке похожих записей могут появиться одинаковые ссылки. Надеюсь понятно.
В итоге у нас должен получится такой код:
<div class="similar_records"> <h3>Похожие записи:</h3> <?php $tags = wp_get_post_tags($post->ID); if ($tags) { $tag_ids = array(); foreach($tags as $individual_tag) $tag_ids[] = $individual_tag->term_id; $args=array( 'tag__in' => $tag_ids, // Сортировка происходит по тегам (меткам) 'orderby'=>rand, // Добавляем условие сортировки рандом (случайный подбор) 'caller_get_posts'=>1, // Запрещаем повторение ссылок 'post__not_in' => array($post->ID), 'showposts'=>5 // Цифра означает количество выводимых записей ); $my_query = new wp_query($args); if( $my_query->have_posts() ) { echo '<ul>'; while ($my_query->have_posts()) { $my_query->the_post(); ?> <li><a href="<?php the_permalink() ?>" rel="bookmark" title="<?php the_title_attribute(); ?>"><?php the_title(); ?></a></li> <?php } echo '</ul>'; } wp_reset_query(); } ?></div>
Теперь вывод похожих записей будет производится в случайном порядке.
Способ №2. Функция сортировки похожих статей по рубрикам (категориям)
Лично я использую второй способ вывода похожих записей, так как считаю, что сортировка по рубрикам наиболее подходит для текстовых заголовков, но в любом случаи выбор за Вами.
<div class="similar_records"> <h3>Похожие записи:</h3> <?php $categories = get_the_category($post->ID); if ($categories) { $category_ids = array(); foreach($categories as $individual_category) $category_ids[] = $individual_category->term_id; $args=array( 'category__in' => $category_ids, // Сортировка производится по категориям 'orderby'=>rand, // Условие сортировки рандом 'post__not_in' => array($post->ID), 'showposts'=>5, //Количество выводимых записей 'caller_get_posts'=>1); // Запрещаем повторение ссылок $my_query = new wp_query($args); if( $my_query->have_posts() ) { echo '<ul>'; while ($my_query->have_posts()) { $my_query->the_post(); ?> <li><a href="<?php the_permalink() ?>" rel="bookmark" title="<?php the_title_attribute(); ?>"><?php the_title(); ?></a></li> <?php } echo '</ul>'; } wp_reset_query(); } ?></div>
Я сразу включил условие сортировки рандом, но если вы хотите установить сортировку по датам, то просто уберите строчку:
'orderby'=>rand,
Напоминаю, что код надо вставить в файл single.php после статьи. Обычно его вставляют сразу после скриптов социальных кнопок, но если возникнут сложности, то пожалуйста задавайте вопросы в комментариях.
Стили для блока похожих записей
Если мы просто вставим код в файл saingle.php без применения стилей, то выглядеть блок похожих записей будет так:
Что согласитесь, мягко сказать, не эффектно. Поэтому прописываем стили для класса:
class="similar_records"
За стили отвечает файл style.css, который также находиться в папке с темой.
В качестве примера я приведу список стилей для похожих записей со своего блога с подробными разъяснениями.
/*похожие записи*/ .similar_records a{ /* "а" в конце класса означает, что все стили прописываются для ссылок */ background:#F6F9FD url(images/st.gif) no-repeat left; /* Цвет фона и адрес картинки перед каждой ссылкой */ border-bottom-left-radius: 5px; /* Закругление левого нижнего края фона в пикселях */ border-bottom-right-radius: 5px; /* Закругление правого нижнего края фона в пикселях */ border-top-left-radius: 5px; /* Закругление левого верхнего края фона в пикселях */ border-top-right-radius: 5px; /* Закругление правого верхнего края фона в пикселях */ color: #444444; /* Цвет самой ссылки */ display: block; /* Обозначаем элемент как блочный */ margin: 5px 0; /* Внешние отступы, в данном случаи указываем расстояние между ссылками */ padding: 5px 5px 5px 5px; /* Внутренние отступы */ position: relative; /* Привязываем блок к реальному местоположению в файле */ text-decoration: none; /* Отменяем подчеркивание ссылок и элементов списка (1,2,3 и т.д.) } .similar_records a:hover{ color: #C6C600; /* Цвет ссылки при наведении курсора */ }
Не бойтесь менять значения отступов, цвет фона или ссылок, подгоняйте стили под дизайн Вашего шаблона. Ничего такого страшного нет, самое главное не забывайте ставить «;» в конце строчки. Если Вы используете редактор Noteped++, то подсветка синтаксиса будет вам подсказывать, где закралась ошибка. Успехов!
В будущих статьях я обязательно расскажу о том: как вывести похожие записи с миниатюрами без плагина, как сделать блок популярных записей с миниатюрами в сайдбаре, а также как вывести миниатюры на главную страницу, так что обязательно подпишитесь на обновления блога.
На сегодня у меня все. Как Вам статья?
С уважением, Виталий Кириллов
Кстати на счет одинаковых записей. У меня на блоге появились 2 статьи, которые абсолютно одинаковы. Написаны они еще в том году. Попробуем воспользоваться данным плагином для решения проблемки:)
Успехов Вам и всего хорошего! 🙂
Очень понравилось решение вставки блока похожих записей без плагина которое выводится по категориям. Так как хочу дождаться выхода Вашей статьи про вывод похожих записей с картинками. Скажите, с картинками похожие статьи по тегам можно будет сортировать?
Владимир с картинками код маленько видоизметься но принцип действия останется такой же, так что И функция сортировки по тегам тоже никуда не денется. Дождитесь выхода статьи.
Статья, как всегда, отличная!) Многим пригодится. Я тоже, может, в ближайшие месяцы доберусь до замены некоторых плагинов на код. Пока еще до 1000 уников еще оочень далеко)
Все равно Саша это не за горами!
Спасибо за обьяснение стилей. Этого я не понимала. У меня вопрос. Я сделала по коду чтобы показывало похожие записи, но у меня выводятся блоки и названия статей. А самых картинок нету. Я так поняла, что у меня нету миниатюр к записям, что ли. Как это можно исправить?
Елена! Вывод похожих записей с миниатюрами это уже другая тема. Я в стилях показал как выводить маленькие картинки перед ссылками, но это не миниатюры к записям а картинка со стрелкой как у меня или что другое. Вывод блока с записей миниатюрами будем рассматривать в одной из следующих статей.
Эх добавила ваш сайт в закладки.Как только найдется свободная минутка попробую так сделать как написано в вашей статье.
Спасибо за статью! У меня при вставке 2-м способом возникает проблема: если вставлять после комментариев, то все нормально, а если вставляю после соц.кнопок (именно сюда и нужно вставить), то после сохранения изменений вместо записи появляется пустая белая страница.
Вставляю скрипт после строчки:
// Include Social Shares
if(get_post_meta($post->ID, ‘post-option-social-enabled’, true) == «Yes»){
echo «»;
echo $translator_social_share;
echo «»;
include_social_shares();
echo «»;
}
Виктор, совсем не обязательно вставлять код после соц.кнопок, можете выбрать любое другое место, если у Вас шаблон артачится.
У меня при вставке рекомендуемого кода второго варианта появляется ошибка Parse error: syntax error, unexpected ‘}’ in Z:\home\localhost\www\wp\wp-content\themes\twentytwelve\single.php on line 44. В чём может быть проблема. Код копирую правильно, но все равно скобка чем-то не нравится вордику)
Юрий, возможно код не хочет работать на локальном сервере.
Приветствую, Виталий!
Не слушается меня мой single.php! Сначала пробовал вставить код на локальном. Не выходило. Теперь попробовал и на рабочем блоге. Результат в принципе один — блог перестает работать, главная открывается, а вот ни один переход по любой ссылке становится невозможен. Испробовал все возможные варианты, где вставить код. Но, видно, файл устроен довольно хитро! Там, кстати, нет ни одного div’а. Лишь несколько строчек записей между знаками Часть из них заключена, насколько я понял, в теги
Александр, надо посмотреть Ваш шаблон. Вы мне файлы темы на почту пришлите, я гляну.
Хорошо!
Как и ожидал, знаки ?php и тег article не прошли в коммент. Как тебе можно показать фрагмент кода?
Александр, чтобы код отображался, заключите его в теги [ php][ /php], без пробелов конечно.
Здравствуйте, а можно ли сделать так, что бы статьи формировались по категориям и меткам? Спасибо.
Ваня, так оставьте вывод по меткам, у Вас и статьи из категорий также будут выводится. Как это реализовано у меня в похожих записях с миниатюрами.
Отличное решение для перелиновки на сайте.
Добрый день! Не могу понять, как же мне правильнее выводить похожие записи. Изначально выставил второй вариант. Теперь же я не уверен. Вот у меня кулинарный сайт, к примеру я открываю статью свинина тушеная с солеными огурцами, она находится в рубрике вторые блюда и похожие записи выдаются из этой же рубрики, но это не про свинину, а куриные сердечки в сметане, карп с картошкой в духовке и прочее, что присутствует в этой рубрике. Может вывод по меткам будет правильнее? Просто если выбирать мо меткам, к примеру курица, то это могут быть как вторые блюда, так и первые или вообще выпечка, что же лучше?
Лично я для себя выбрал вариант сортировки по тегам. Конечно не все идеально с подбором соответствующих тематических рецептов, но я думаю это совсем не обязательно.
Доброй ночи! Извините, что не по теме, Вы не знаете, как вывести последние комментируемые записи (не последние комментарии а именно последние комментируемые записи)? Очень нужно. Спасибо!
Виталий, подскажите пожалуйста, этот код подойдёт только для записей или для страниц тоже? Дело в том, что на моём сайте новостойка-анапы.рф я сделал новостную ленту и там с похожими записями вполне справляется вп релэйтед пост, а статьи я пишу не в записях, а создавая новые страницы. Как бы мне в конце страниц сделать вывод похожих страниц?
Андрей, данный способ не подойдет для статических страниц.
Воспользовался вторым методом с категориями, то что надо! Только есть вопрос. Подскажите пожалуйста, у меня на сайте есть иерархия, есть главная категория и есть подкатегории, если мы заходим в подкатегорию то отображаются записи этой подкатегории. Что нужно добавить в код, чтобы отображались записи из всех родственных подкатегорий. Спасибо.
Илья, я как-то написал код для отдельного шаблона категорий, там я использовал как раз похожую схему, что вы мне описали. Почитайте эту статью и если есть базовые знания, то думаю разберетесь.
Жаль, не разберусь.
А как сделать так, чтобы перед названием выводимых рубрик или какие-нибудь звёздочки стояли, или чёрточки?
Олеся, вы имеете в виду символы?
Да, всё верно. Только как сделать чтобы они выводились перед списком статей. Т.е. я использую ваш код и всё работает, похожие стать имеют вид:
статья
статья
статья
А я хочу:
«символ» статья
«символ» статья
Так ведь возможно сделать?
Олеся, вообще тег ли выводит вот такой символ → • ← и если его нет, то значит от отменен в файле style.css такой директивой:
Спасибо огромное, я хотел идти на фриланс, а теперь сам все сделал. вывел статьи по рубрикам и все красиво и бесплатно. Спасибо Виталий за толковый урок!
Вставил код. Все получилось, но надпись «Похожие записи» отображается на сайте знаками: ???????
Если написать латиницей, то все нормально. Может подскажете, в чем причина и как исправить?
Ван надо исправить кодировку файла. В комментариях я уже отвечал на данный вопрос.
Здравствуйте!
Спасибо за интересную статью!
Но вот у 2 вопроса.
1.
Я не хочу чтобы статьи выводились по рубрикам или меткам. Тем более что я так понимаю,
что для того чтобы похожие статьи выводились по меткам, нужно обязательно прописывать метки для каждой статьи…?!
Подскажите кто-нибудь, а есть ли возможность, прописать какой-нибудь код, чтобы похожие статьи выводились по совпадению в тайтле?
2.
Как убрать заголовок «похожие записи», на страницах где этих записей похожих нет?
Добрый день, спасибо за хороший метод перелинковки без плагина. Интересует следующий вопрос, как сделать что бы ссылки были постоянными на похожие записи, так как при обновлении страницы происходит реиндексация всех ссылок, получается что ни одна страница не имеет постоянную ссылку с другой. Читал об этом, пишут что полезно для скоросной индексации гуглом, а по поводу провижения НЧ?
Да Роман такие мнения есть, но последние слово все равно за Гуглом. Ведь на индексацию влияет множество факторов.
Давняя, но крайне полезная статья. Что касается «Функции сортировки похожих статей по меткам», как можно сделать так, чтобы сортировка выполнялась по всем местам, КРОМЕ одной, для определенность с ID=100?
Попробуйте так:
‘post__not_in’=>100,
Здравствуйте! Все отлично работает. Скажите, как эти функции правильно засунуть в файл function.php, чтобы выводить шорткодом?
Данные функцию в шорткод засунуть не получится, так как они работают только внутри цикла WordPress.
Здравствуйте! Код отлично работает. Но у меня сейчас стоит дополнительная задача. У меня каждый пост относится к трем разным рубрикам. Сейчас сортировка происходит по совпадению хотя бы одной рубрики. Можно ли сделать чтобы сортировало по совпадению всех рубрик? Заранее спасибо.
Анна в комментариях к статье есть ответ на Ваш вопрос, поищите.
Добрый день установил Ваш код — все работает.
Но после установки кода — первая запись в категориях теперь дублируется.
В каждой категории первая запись идет также и второй.
Убираю Ваш код — все нормализуется.
Но он мне очень понравился — отлично работает и я хочу его оставить.
Подскажите как это можно исправить.
Добрый день! Спасибо большое за интересный пост, на днях собираюсь сделать нечто похожее, но с миниатюрами. Про них тоже прочёл.
А как сделать чтобы похожие записи показывались в странице вложения???
Например сайт.ру/какая-то-запись РАБОТАЕТ
а на здесь сайт.ру/какая-то-запись/продолжение НЕ РАБОТАЕТ
Здравствуйте, спасибо за отличную статью, поняла, сделала и даже получилось))) вопрос следующий — я эти же стили поставила на кнопку категорий, которая выводится в статье, какую директиву в стилях нужно добавить, чтоб фон кнопки растягивался не на всю ширину экрана с текстом, а регулировался по длине слова (названия категории)?
Добрый вечер! Скажите пожалуйста, как можно вывести статьи НЕ принадлежащие какой-то категории, а принадлежат только метке, например ПУГОВИЦЫ.
Как вывести эти статьи на странице по метке? По id категории выводится, но уж не хочется плодить много категорий (я для каждой создаю свои индивидуальный файл).
СПАСИБО!
polnymledi.ru
А вот у меня вопрос совершенно другой. Но непосредственно относиться к этой теме. Я успешно, установил на сайт код, воспользовавшись вашими инструкциями. Но столкнулся с одной «проблемкой». Дело в том, что что на главной, у меня выводиться отдельная страница. И теперь, внизу появилась строка «Ркомендуем к прочтению» под которой соответственно нет никаких записей, так как это отдельная страница.
Подскажите как исправить эту ситуацию. Чтобы на главной странице перестали выводиться «рекомендации», а на остальных остались?
Оберни весь код в в условие, if ( !is_home ). Естественно добавь открытие и закрытие php
Спасибо за отличный код! Пробовал рекомендации с других сайтов, но подошел именно этот! Правда, вывод заголовка модуля в h3 не устроил с точки зрения СЕО, сделал тегом p и еще обернул блок полностью в noindex тоже для СЕО.
Все супер. Но ведь можно же как то это все дело выводить при помощи шорткода. Как все это добро запехать в шорткод?
И что потом? В каждую статью этот шорткод пихать? Неудобно же. Проще один раз в код вставить и забыть об этом.
Совершенно верно, именно это мне и нужно. Но вставлять не в каждую статью, а в некоторые. Щас попробую объяснить! У меня сайт — каталог инфопродуктов. В одной статье размещается вся информация связанная с автором ряда видеокурсов, — биография, видео ролики, все его курсы и тд. Но к сожалению случается так, что тот или иной автор прекращает выпускать свои инфопродукты, а на эту страницу то, люди приходят по определенным запросам. Я не хочу ее удалять, чтоб не терять трафик, но при этом и людям надо предложить что то взамен того, зачем они пришли. Сейчас у меня так: В статье, в том месте, где был перечень всех курсов автора, выводится сообщение о том, что его деятельность приостановлена, курсов больше нет, бла бла бла … А хотелось бы в этом месте выводить перечень подходящих статей, в которых бы люди могли найти что то взамен тому за чем пришли. Что теперь скажите?
Наверное в таком случае проще оставить вручную просто ссылку на соответствующую рубрику со всеми этими статьями. И написать, что идите вы туда, там есть то что вам надо, а тут больше нету.
Правильней будет сделать шорткод, но не проще. По крайней мере для меня.
Но если я вставляю код в single-slug (шаблон для пользовательского типа записей), то код уже не работает
Значит не туда вставляешь, если перестает работать код. Внимательнее будь с открытием и закрытием тегов php кода. Да и вообще почему single-slug, а не просто single.php? Вроде туда вставлять надо, если не ошибаюсь. Хотя шаблоны конечно у всех разные
Добрый день! Добавил давным давно вывод по тэгам с рандомом. Вчера обновил PHP до 7.2 и в логах стали появляться ошибки — PHP Warning: Use of undefined constant rand — assumed ‘rand’ (this will throw an Error in a future version of PHP)
Ругается как я понял на рандом, строчка с — ‘orderby’=>rand, но сам поправить не могу…
Я пока не обновлял php.
Надо как-то выбрать время.
Без миниатюр как то неочень. Не поделитесь кодом с миниатюрами
Как вывести похожие записи с миниатюрами на WordPress без плагина
А как цвет подчеркивания ссылок изменить?