Чек лист по WP 4 часть

Дневник разработчика

Вывод последних публикаций в сайдбаре

Для вывода последних публикаций на страницах записей WP мы будем использовать функцию WP_Query{}, которая позволяет выбирать любые записи из БД сайта.

Мы возьмём стандартный have_posts() — цикл вывода постов и доработаем его под наши текущие требования — вывести последние опубликованные статьи.

<?php
if ( have_posts() ){
	while ( have_posts() ){
		the_post();
		// код вывода
	}
} else {
	echo wpautop( 'Постов для вывода не найдено.' );
}
?>

Или аналогичный цикл в альтернативном синтаксисе:

<?php
if ( have_posts() ) :
	while ( have_posts() ) : the_post();
		// код вывода
	endwhile;
else :
	echo wpautop( 'Постов для вывода не найдено.' );
endif;
?>
  1. Для нашего удобства и читабельности массив с нашими параметрами вынесем в отдельный массив $agrs
  2. В самом цикле мы используем не простую функцию have_posts, а метод объекта WP_Query
  3. Ну и в конце функции нам нужно wp_reset_postdata() — сбросить произвольный цикл, для того что бы все глобальные переменные вернулись в своё первоначальное состояние и нигде не было ошибок. Эта функция обязательна в конце такого цикла.
  4. В массиве, который мы сохранили в переменной, указываем пару параметров, что бы статьи отображались как в макете: posts_per_page — выводить только 4 последние статьи; ignore_sticky_posts — не учитывать закреплён пост или нет.

Вот такой цикл в шаблоне сайдбара у нас получился:

<?php
  $agrs = array(
    'posts_per_page' => 4,
    'ignore_sticky_posts' => true
  );

  $query = new WP_Query( $agrs );

  if( $query->have_posts() ) :
  ?>
<!-- Начало обёртки с разметкой (До самой записи)-->

        <?php while( $query->have_posts() ) : $query->the_post(); ?>

<!-- Разметка анонса записи-->

        <?php endwhile; ?>

<!-- Закрывающая разметка обёртки записи-->

  <?php endif;
wp_reset_postdata();
?>

Вывод похожих записей в шаблоне отдельной страницы со статьёй single.php

Тут мы используем аналогичный цикл, но с другими параметрами!

Реализовывать следующий сценарий вывода похожих статей — будем выводить все статьи, которые есть в тех же рубриках, что и основная запись, отображаемая на странице.

В массиве укажем аналогичные параметры количества постов — 3 штуки, а так же проигнорируем прикреплённые посты, как и ранее.

Теперь нам нужно получить категорию текущего поста, который показывается на странице single.php/

Для этого мы используем функцию get_the_category(), которая возвращает нам список категорий, к которым относится пост на странице.

Сохраняем функцию в переменную $current_categories

Ниже пишем конструкцию перебора массива foreach в котором перебираем категории статьи

Далее мы Объявляем переменную $category_ids в которой сохраняем список рубрик статьи

Ну и в конец добавляем в параметры нашего цикла наш массив с категориями (рубриками) блога ‘category__in’ => $category_ids

<?php
    /* получаем категорию поста, который показывается на странице  */
    $current_categories = get_the_category();
    /* Сохраняем id рубрик в переменную */
    $category_ids = array();

    foreach( $current_categories as $category ) {
    $category_ids[] = $category->term_id;
    }


    $agrs = array(
    'posts_per_page' => 3,
    'ignore_sticky_posts' => true,
    'category__in' => $category_ids,
    );

    $query = new WP_Query( $agrs );
    if( $query->have_posts() ) :
?>
<!-- разметка обёртки -->

        <?php while( $query->have_posts() ) : $query->the_post(); ?>
        
<!-- разметка Записи -->
        <?php endwhile; ?>
<!-- закрывающая разметка обёртки-->

    <?php endif;
    wp_reset_postdata();
    ?>

Важный нюанс при использовании переменных внутри дополнительных циклов!

Если вы используете одну и ту же переменную для дополнительных циклов на одной и той же странице (в одном и том же шаблоне) то это не проблема. Но станет ей, если вкладывать такие циклы друг в друга, т е если вы используете переменную внутри родительского и дочернего цикла — давайте им РАЗНЫЕ ИМЕНА!

Юрий Ронин