Как вывести похожие записи без плагина WordPress

Я бесплатно помогаю пользователям русскоязычного форума WordPress. На одном из сайтов меня попросили сделать вывод похожих записей из той же рубрики(категории).

 Конечно можно было бы для этого использовать плагины, но я предпочитаю чистый и живой код, а не нагружать сайт плагинами с ненужными для конкретной ситуации функциями.

Ниже я напишу 2 варианта вывода похожий записей, один будет выводить записи из той же рубрики(категории), а второй будет выводить записи с такими же метками.

Ниже приведенный код вставляется или в single.php или в loop-single.php, в зависимости от вашей темы.

Вывод похожих записей из той же категории и вывод записей из текущей рубрики

<div class="sample-posts">  
<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, 
			'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>

Думал немного расписать что к чему, но всё же решил сделать пометки в коде, которые всё объясняют.

 Вывод похожих новостей при помощи меток

Этот способ лучше подходит, если вы редко пользуетесь метками или они у вас настолько разные, что почти не пересекаются

<h3>Похожие статьи:</h3>   
<div class="sample-posts">
<ul>        
<?php
$tags = wp_get_post_tags($post->ID);
if ($tags) {
	$first_tag = $tags[0]->term_id;
	$args=array(
		'tag__in' => array($first_tag),
		'post__not_in' => array($post->ID), //Исключаеим текущую запись
		'showposts'=>5, //Указываем сколько записей выводить
		'caller_get_posts'=>1
	);
	$my_query = new WP_Query($args);
	if( $my_query->have_posts() ) {
		while ($my_query->have_posts()) : $my_query->the_post(); 
?>
			<li><a href="<?php the_permalink() ?>" rel="bookmark" title="Permanent Link to <?php the_title_attribute(); ?>"><?php the_title(); ?></a></li>
<?php
		endwhile;
	}
	wp_reset_query();
}
?>
</ul>
</div>

Тут я тоже не знаю, что ещё можно написать.

23 thoughts on “Как вывести похожие записи без плагина WordPress

  1. Вот только это не совсем похожие записи. Нужен код чтобы похожие по заголовку выводились.

    • Вы правы, мои решения выводят записи с таким же тегом и из той же категории.
      Поиск по базе отдельно взятых слов из поста или из заголовка создаст очень большую нагрузку — это не целесообразно

  2. Здравствуйте.
    Подскажите как вывести похожие записи у нового типа записи?
    Т.е. у меня есть новый тип записи, дял них также создана таксономия (категории), и мне надо выводить под записью несколько записей из этой же категории новых типов записи.

    • После
      $args=array(
      Добавьте
      ‘post_type’=> ‘page’
      Вместо page напишите тип вашего поста

  3. АЛЛО есть тут кто кто может объяснить этот код и кому можно задать вопрос ответьте пожалуйста!!

    • Я тут, я готов ответить на все вопросы, если смогу :).
      Просто пишите ваш вопрос

  4. Друзья.
    Есть необходимость выводить посты или записи по нажатию кнопки без перезагрузки страницы.
    Т.е. сортировка и отображение на соответвующую тегу или метке кнопку.
    В идеале логика такая.
    На странице отображаются все статьи главной категории, и на этой странице в начале есть кнопки с названиями тегов или меток. При нажатии на соответсвующую кнопку на странице остаются только страницы у которых есть соответвующий тег.

    Видел на сайте. как реализовано не знаю.

    • Евгений, для этого вам надо будет использовать Ajax

  5. Приветствую Вас!
    Весь вечер сидел, бился, но так и не смог разобраться.
    Скажите, пожалуйста, если у нашей текущей записи несколько меток, как вывести по всем этим меткам связанные записи?
    Насколько я понял, в примере выводятся только записи по первому тегу текущей записи?

    • Да, действительно, пример в посте берет только первую метку

      Если вам надо все метки, тогда используйте следующий код:

      <h3>Похожие статьи:</h3>   
      <div class="sample-posts">
      <ul>        
      <?php
      $tags = wp_get_post_tags($post->ID); //Получаем список тегов
      if ($tags) {
      	$tags_id = array(); //Тут будут храниться id тегов
      	foreach ($tags as $tag) {
      		array_push($tags_id, $tag->term_id); // закидываем id каждого тега в массив тегов
      	}
      	$args=array(
      		'tag__in' => $tags_id,
      		'post__not_in' => array($post->ID), //Исключаем текущую запись
      		'showposts'=>5, //Указываем сколько записей выводить
      		'caller_get_posts'=>1
      	);
      	$my_query = new WP_Query($args);
      	if( $my_query->have_posts() ) {
      		while ($my_query->have_posts()) : $my_query->the_post(); 
      ?>
      			<li><a href="<?php the_permalink() ?>" rel="bookmark" title="Permanent Link to <?php the_title_attribute(); ?>"><?php the_title(); ?></a></li>
      <?php
      		endwhile;
      	}
      	wp_reset_query();
      }
      ?>
      </ul>
      </div>
  6. Всё прекрасно работает, но возник вопрос со страницами категорий.
    Есть ли возможность категориям присвоить метки?
    А то на страницах категорий что попало выдаёт, в смысле то по одной метке, то по другой.
    Или может быть подскажете идею, как красиво написать условие, чтобы для страниц категорий выдавать, например, стационарно прописанный кусок html, а не формировать его, как для остальных страниц.
    Заранее спасибо!

    • Категории метку присвоить не получится

  7. Не могу разобраться как сделать, чтобы на основных категориях выводились записи только из основных категорий, а на подкатегориях из подкатегорий.

  8. Например, есть категории: кат1, кат2, кат3. В них есть записи и подкатегории: подкат11, подкат12, подкат13, подкат21, подкат22, подкат23 и подкат31, подкат32, подкат33. В них есть другие записи. Надо чтобы на страницах категорий выводились записи только из категорий (на них не выводить из подкатегорий). А на подкатегориях только из подкатегорий (на них не выводить из основных категорий).

    • Похоже, что никак. рекомендую все записи хранить в подкатегориях

  9. Надо именно так как у меня. Получилось для первой категории с подкатегориями сделать, но на остальных вообще не отображаются.

    • Это код работает одинаково не зависимо от категории

  10. Может кому пригодится. Нашёл код для этих целей:
    function no_children( $query ) {
    if ( ! is_admin() && $query->is_main_query() && $query->is_category() )
    $query->set( ‘category__in’, array( get_queried_object_id() ) );
    }
    add_action( ‘pre_get_posts’, ‘no_children’ );

    Писать в functions.

Leave a Comment