Как без плагинов вывести похожие записи с миниатюрами | Часть 2

Настройки

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

Как без плагинов вывести похожие записи с миниатюрами | Часть 1

1. Для того, чтобы подключить использование миниатюр в подобных целях, прочтите первую часть поста Как без плагинов вывести похожие записи с миниатюрами | Часть 1. В ней я подробно описал, какие настройки нужно выставить в блоге и какой код добавить в файл functions.php. После выполнения инструкций первого пункта можете переходить к следующему абзацу.

2. Для формирования списка похожих постов по категориям, создадим в файле functions.php специальную функцию:

function show_previous_posts_from_category ($the_post_id, $the_category_id = 0, $post_num = 5){
$num = 0;
global $wpdb;
$sql = "SELECT wposts.* 
FROM $wpdb->posts wposts
  LEFT JOIN $wpdb->term_relationships ON (wposts.ID = $wpdb->term_relationships.object_id)
  LEFT JOIN $wpdb->term_taxonomy ON ($wpdb->term_relationships.term_taxonomy_id = $wpdb->term_taxonomy.term_taxonomy_id)
WHERE $wpdb->term_taxonomy.taxonomy = 'category'
  AND $wpdb->term_taxonomy.term_id = '$the_category_id'
    AND wposts.post_status = 'publish'
    AND wposts.post_type = 'post'
  AND wposts.ID get_results($sql, OBJECT);
//if (!$result){ echo "Записей не найдено"; return false; }
global $post;
echo '';
foreach ($result as $post){ setup_postdata($post);
//выводим информацию как обычно в ВП это бывает :)
get_the_post_thumbnail($post->ID, 'thumbnail');
echo '<br /><span style="color:#666">',the_time('d·m·Y '),'</span>  <span class="write-comment" style="font-size:1.0em">'.get_the_title().'</span>';
$num++;
}
// если предыдущих постов меньше заданого колличества, выводим ниже последние из рубрики
if ( $num < $post_num || !$result ){ $need_more = $post_num-$num;
$more_posts = get_posts("numberposts=$need_more&category=$the_category_id");
foreach ($more_posts as $post){ setup_postdata($post);
//выводим информацию как обычно в ВП это бывает :)
echo '<br /><span style="color:#666">',the_time('d·m·Y'),'</span>  <span class="write-comment" style="font-size:1.0em">'.get_the_title().'</span>';
}}
echo '';
wp_reset_query();
}

Функция создает список из пяти ссылок с названиями записей, которые были опубликованы последними в этой же категории, что и текущий пост. Теперь этот список нужно вывести в посте. Для этого открываем файл single.php, находим в нем вывод содержимого (обычно это функция the_content), и вставляем после него такой код:

<div>
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 '';
		while ($my_query->have_posts()) {
			$my_query->the_post();
		?>
			<div style="width:210px;padding:10px;text-align:center;vertical-align:top;float:left">
			<div style="text-align:center"><a href="" title=""></div>
			<div style="text-align:center"></a></div>
			</div>
		
</div>

В этом коде мы используем функцию ordered_thumbnails, отвечающую за вывод миниатюры поста — эту функцию мы подключили в первом пункте. Обратите внимание на количество выводимых ссылок (‘showposts’=>5) — оно должно быть таким же, как и в том коде, который вы вставили в файл functions.php (post_num = 5). Для наглядности я оставил оформление ссылок неизменным — возможно, что вам придется немного поработать над ним, адаптируя к дизайне своего блога.

tiaurus

Автор n-wp.ru — блога о WordPress для новичков.

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

  1. eminkoff

    А можно ли сделать так, чтобы миниатюрой бралось первое изображение из поста?
    Спасибо.

    Ответить
    1. В качестве изображения берется первая миниатюра из поста.

      Ответить
      1. eminkoff

        а если я загружал изображения не через админку?
        пользуюсь Win Live Writer для написания, а он грузит изображения напрямую на фтп.
        я вставил код, но не вижу превью.

        Ответить
        1. На сколько я знаю, Windows Live Writer по-своему работает с изображениями, поэтому если вы в теме используете автоматически создаваемые миниатюры, лучше использовать встроенный редактор.

          Ответить
  2. jack-napier

    Ваш рассказ заканчивается словами «и вставляем после него такой код:» — и дальше пусто. Так какой код надо вставлять?

    Ответить
    1. Обновите страницу.

      Ответить
  3. Nixx

    Приветствую.
    Подскажите как доделать так, чтобы если в записи нет изображений, отображалась картинка заглушка? Спасибо.

    Ответить
    1. Как вариант, можно использовать такой способ: Как вывести первое изображение из поста, а если его нет, то показать случайно выбранную картинку-заглушку.
      Либо выводить миниатюру примерно так:

      <?
      if($post->files[0]->thumbnail) echo '<img src="'.$post->files[0]->thumbnail.'" />';
      elseif($html = get_the_post_thumbnail('thumbnail') )  echo $html;
      else echo '';
      ?>
      Ответить
  4. Nixx

    Спасибо за быстрый ответ.
    Правда у меня что-то не получилось.
    Поставил предложенный вами код (заменил

    <?php ordered_thumbnails_medium(); ?>

    ) и теперь вместо первых картинок, везде отображается только заглушка. В чем может быть дело?
    Было бы замечательно если бы получилось объединить https://n-wp.ru/kak-vyivesti-pervoe-izobrazhenie-iz-posta-a-esli-ego-net-to-pokazat-sluchayno-yibrannuyu-zaglushku/ и https://n-wp.ru/kak-bez-plaginov-vyivesti-pohozhie-zapisi-s-miniatyurami-chast-2/

    Ответить
    1. Первая картинка и миниатюра поста — это разные штуки. Вы какой код использовали?

      Ответить
      1. Nixx

        Если код:

        " title="<?php the_title('', ''); ?>">
                    <div class="prev-block">
                      <div class="prev-thumb"><?php ordered_thumbnails(); ?></div>
                      <div class="prev-title"><?php the_title(); ?></div>
                    </div>

        то так:

        Если код:

        " title="<?php the_title('', ''); ?>">
                    <div class="prev-block">
                      <div class="prev-thumb">
                      <?
        if($post->files[0]->thumbnail) echo '<img src="'.$post->files[0]->thumbnail.'" />';
        elseif($html = get_the_post_thumbnail('thumbnail') )  echo $html;
        else echo '';
        ?>
                      </div>
                      <div class="prev-title"><?php the_title(); ?></div>
                    </div>

        то так:

        Ответить
        1. Попробуйте так:

          <?php 
          if(has_post_thumbnail()) {
          	the_post_thumbnail();
          } else {
          	echo '';
          }
          ?>
          Ответить
  5. Nixx

    Большое спасибо за помощь.
    Прибавил код от https://n-wp.ru/kak-vyivesti-pervoe-izobrazhenie-iz-posta-a-esli-ego-net-to-pokazat-sluchayno-yibrannuyu-zaglushku/.
    Получилось так

    <div class="prev-thumb"><img src="<?php echo catch_that_image() ?>" title="<?php the_title(); ?>" alt="<?php the_title(); ?>"/></div>

    Все прекрасно работает.
    Если можно удалите пожалуйста два моих комментария выше.

    Ответить
    1. Комментарии выше тоже полезные. Вы спрашивали о том, как выводить картинку-заглушку, если в посте нет миниатюр, а воспользовались способом, выводящим первое изображение поста — это не одно и то же. Хотя можно и так и сяк.

      Ответить
  6. serj

    Здравствуйте. Реально ли запихнуть сей код в сайдбар, и подключить миниатюры которые генерирует мой шаблон(onecool-thumb).
    Скажите, как сие чудо сотворить.. Спасибо.

    Ответить