Отображение всех записей дочерней категории WordPress

Вопрос или проблема

Я создаю страницу на WordPress, где все мои посты в дочерних категориях команды отображаются в сетке. Я смог это сделать с помощью приведенного ниже кода. Форматирование и общий макет отличные, однако отображаются только 5 самых последних постов в дочерней категории вместо всех. В моем аккаунте WordPress у меня есть 7 постов, которые должны отображаться. Как мне получить посты, чтобы отображались все?

                <ul class="faces">

 <?php
$categories = get_categories( 'child_of=2' );  
foreach  ( $categories as $category ) {

    echo '<div class="grid-row"><h2>'.$category->name.'</h2></div>';

    $cat_posts = get_posts( 'cat=".$category->term_id );
    $end = count( $cat_posts ) - 1;
    $i = 0;
    foreach ( $cat_posts as $post ) {
        setup_postdata( $post );
        $face = get_field( "face' );
        $name = get_field( 'fullname' );

        if ( $i % 6 === 0 ) {
            echo '<div class="grid-row">';
        }
      echo '<div class="obj">';

        echo wp_get_attachment_image($face)
            . '<div class="name">'.$name.'</div>';

        echo '</div>';
                if ( $i % 6 === 5 ) {
            echo '</div>';
        }
               $i++;
    }
}?>
    </ul>

//css

div.grid-row {
    width: 100%;

   height: 100%;
    position: relative;
    overflow: hidden;
}
div.obj{
float: left;
    position: relative;
    padding-right: 10px;
}
.faces{
    width: 1000px;

}

введите описание изображения здесь

введите описание изображения здесь

введите описание изображения здесь

ИЗМЕНЕНО ДЛЯ НИЖЕПРИВЕДЕННОГО ПОСТА:
введите описание изображения здесь

ИЗМЕНИТЬ ДЛЯ НИЖЕПРИВЕДЕННОГО ПОСТА:

<?php
$categories = get_categories( 'child_of=2' );  
foreach  ( $categories as $category ) {

    echo '<div class="grid-row"><h2>'.$category->name.'</h2></div>';
    $args1 = array( 'posts_per_page' => -1, 'cat=".$category->term_id );
    $cat_posts = get_posts( $args1 );
    $end = count( $cat_posts ) - 1;
    $i = 0;
    foreach ( $cat_posts as $post ) {
    $post_category = get_the_category($post->ID);
    if($post_category->cat_name == $category->name){
        setup_postdata( $post );
        $face = get_field( "face' );
        $name = get_field( 'fullname' );

        if ( $i % 6 === 0 ) {
            echo '<div class="grid-row">';
        }
      echo '<div class="obj">';

       echo '<div class="faceThumb">';
       echo wp_get_attachment_image($face);
       echo '</div>';
          echo '<div class="name">';
          echo $name;
          echo '</div>';

        echo '</div>';
                if ( $i % 6 === 5 ) {
            echo '</div>';
        }
        }
               $i++;

    }
}?>

Одним из аргументов, которые вы можете передать в get_posts, является posts_per_page. Если вы не включите это, оно будет по умолчанию установлено на настройку «Показать страниц максимум» на странице «Чтение» в ваших настройках. http://wordpress.org/support/topic/get_posts-not-pull-all-posts-unless-numberposts-in-query. Да, я знаю, что тема форума устарела на 2 года, но она подтверждает подозрение, которое у меня возникло после прочтения http://codex.wordpress.org/Template_Tags/get_posts и исходного файла, указанного внизу этой страницы.

Может быть намного проще. Я не знаю, что такое get_field, думаю, это ваша пользовательская функция… но зачем не использовать стандартные пользовательские поля и функцию миниатюры поста? В любом случае

$categories = get_categories( 'child_of=3' ); 

foreach  ( $categories as $category ) {
  $i = -1;
  echo '<div class="grid-row"><h2>' . $category->name . '</h2></div>';
  $args = array( 'posts_per_page' => -1, 'cat' => $category->term_id );
  $cat_posts = new WP_Query($args);
  if ( $cat_posts->have_posts() ) : while ( $cat_posts->have_posts() ) :
    $i++;
    $cat_posts->the_post();
    $face = get_field( 'face' );
    $name = get_field( 'fullname' );
    if ( $i % 6 == 0 ) echo '<div class="grid-row">';
    echo '<div class="obj">';
    echo '<div class="faceThumb">';
    echo wp_get_attachment_image($face);
    echo '</div><div class="name">' . $name . '</div></div>';
    if ( ($i % 6 == 5) || $i == ($cat_posts->post_count - 1) ) echo '</div>';
  endwhile; endif;
}
wp_reset_postdata();

Ответ или решение

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

1. Цель

Мы стремимся вывести все посты из дочерних категорий определенной категории (в вашей ситуации, дочерние категории категории с ID 2) вместо 5 последних постов.

2. Использование WP_Query для получения всех постов

Ваш исходный код использует get_posts, но по умолчанию эта функция ограничивает количество возвращаемых постов согласно настройкам отображения на странице "Чтение". Чтобы получить все посты, используйте параметр posts_per_page равный -1.

3. Корректировки кода

Вот ваш обновленный код с внесенными изменениями:

<ul class="faces">

<?php
$categories = get_categories('child_of=2');  
foreach ($categories as $category) {
    echo '<div class="grid-row"><h2>' . esc_html($category->name) . '</h2></div>';

    $args1 = array(
        'posts_per_page' => -1, // Получаем все посты
        'cat' => $category->term_id,
    );

    $cat_posts = new WP_Query($args1);

    if ($cat_posts->have_posts()) {
        $i = 0;
        while ($cat_posts->have_posts()) {
            $cat_posts->the_post();
            $face = get_field("face");
            $name = get_field('fullname');

            if ($i % 6 === 0) {
                echo '<div class="grid-row">';
            }

            echo '<div class="obj">';
            echo '<div class="faceThumb">' . wp_get_attachment_image($face) . '</div>';
            echo '<div class="name">' . esc_html($name) . '</div>'; // Обеспечение безопасности вывода данных
            echo '</div>'; // Закрытие div.obj

            if ($i % 6 === 5) {
                echo '</div>'; // Закрытие div.grid-row
            }

            $i++;
        }
        // Закрытие оставшейся div.grid-row, если необходимо
        if ($i % 6 !== 0) {
            echo '</div>';
        }
    }
    wp_reset_postdata(); // Сбросим данные после цикла
}
?>

</ul>

4. Объяснения изменений:

  • WP_Query: Мы использовали new WP_Query($args1), чтобы извлечь посты с вашими аргументами. Это мощный класс, который позволяет получать и обрабатывать данные постов в WordPress.

  • posts_per_page: Значение -1 заставляет WordPress вернуть все посты, игнорируя остальные настройки по количеству отображаемых постов.

  • esc_html(): Мы используем эту функцию для экранирования имени категории и имени (полного имени), что улучшает безопасность и защиту от XSS-атак.

  • wp_reset_postdata(): Эта функция позволяет сбросить глобальные переменные, чтобы избежать конфликтов с будущими запросами постов.

5. Итоги

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

Если у вас есть дополнительные вопросы или вы хотите внести другие изменения, пожалуйста, дайте знать!

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

Капча загружается...