Отобразить все посты из всех категорий с пагинацией

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

Хорошо, это может быть сложно объяснить, но я постараюсь изо всех сил.

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

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

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

В начале каждой категории я хочу, чтобы отображалось название категории, как показано выше. Я также использую jQuery infinite-scroll от Пола Ириша, так что, по сути, кнопки пагинации заменяются индикатором загрузки, и он просто загружается на той же странице, когда пользователь прокручивает вниз.

Мой текущий код:

<div class="post clear">
    <a href="https://wordpress.stackexchange.com/questions/161475/<?php echo get_category_link(4); ?>"><div class="date"><?php echo get_cat_name(4); ?></div></a>
    <?php
    $catPost = get_posts('cat=4&posts_per_page=-1');
    foreach ($catPost as $post) : setup_postdata($post); ?>
        <?php get_template_part('content'); ?>
    <?php endforeach;?>
</div>
<div class="post clear">
    <a href="<?php echo get_category_link(1); ?>"><div class="date"><?php echo get_cat_name(1); ?></div></a>
    <?php
    $catPost = get_posts('cat=1&posts_per_page=-1');
    foreach ($catPost as $post) : setup_postdata($post); ?>
        <?php get_template_part('content'); ?>
    <?php endforeach;?>
</div>

И это действительно работает. Ну, почти. Прежде всего, мне нужно вставлять категорию за категорией каждый раз, когда я создаю новую, при этом большая часть кода дублируется. Единственное, что меняется, это ID категорий. Было бы намного лучше, если бы я мог получить все категории одним кодом так, как мне нужно.

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

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

Есть ли решения/предложения?

Заранее спасибо!

ИЗМЕНЕНИЕ @bestprogrammerintheworld

<?php
    $args=array(
      'posts_per_page' => -1,
      'orderby' => array( 'date' => 'DESC', 'title' => 'ASC' ),  //Это работает в WP4.0!!!     
      'caller_get_posts'=> 1
    );
    $my_query = new WP_Query($args);


    if( $my_query->have_posts() ) {
      $nr_datesyear = 0;
      while ($my_query->have_posts()) : $my_query->the_post();

        $year = get_the_date('Y');


        if ($year !== $yeargroup && $nr_datesyear <=5) {
            $nr_datesyear = 0;  
            echo '<div class="post clear">';
        }
        echo '<a href="'. $year .'"><span class="date">'. $year .'</span></a>';                  
        get_template_part('content');

        if ($year !== $yeargroup && $nr_datesyear <=5) {
            echo '<div>'; //конец группы постов по году
            $yeargroup = $year;   
        }

        $nr_datesyear++;  
            endwhile;            
        }

        wp_reset_query();
?>

Чтобы иметь возможность сортировать по категории, вам нужно перехватить запрос MySQL.

Начните с pre_get_posts:

add_action('pre_get_posts','setup_my_query_interception');

function setup_my_query_interception($query){
    if(!is_admin() && $query->is_home() && $query->is_main_query()){
     add_filter( 'posts_clauses', 'order_by_category_intercept_query_clauses', 20, 1 );
  }
}

Теперь мы улучшаем запрос MySQL, чтобы включить таблицы терминов и таксономий:

function order_by_category_intercept_query_clauses($pieces){
        global $wpdb;
        $pieces['join'].=" LEFT JOIN $wpdb->term_relationships trt ON ($wpdb->posts.ID = trt.object_id) LEFT JOIN $wpdb->term_taxonomy ttt ON (trt.term_taxonomy_id = ttt.term_taxonomy_id) INNER JOIN $wpdb->terms termts ON (termts.term_id = ttt.term_id)";
        $pieces['where'].=" AND ttt.taxonomy = 'category'";
        $pieces['orderby']="termts.name ASC, ".$pieces['orderby'];
        // Удалите фильтр, чтобы он выполнялся только один раз в нашем основном запросе
        remove_filter('posts_clauses', 'order_by_category_intercept_query_clauses');
        return $pieces;
}

Это должно привести к тому, что ваш основной запрос будет выведен, упорядоченный сначала по имени вашей категории (пагинация должна по-прежнему работать). Когда вы будете выполнять цикл, вы можете группировать свои категории следующим образом:

…перед циклом:

global $activetax;
$activetax = "";
echo '<div class="mywrapper">

…в цикле:

$cats = get_the_terms(get_the_ID(),'category');
if(is_array($cats)){
    if(!($activetax==$cats[0]->name)){
            $activetax = $cats[0]->name;
            ?>
            </div>
            <h2 id="tax_id_<?php echo $cats[0]->term_id; ?>" class="cat-header"><?php echo $activetax; ?></h2>
            <div class="mywrapper">
            <?php
    }
}
get_template_part('content'); 

… после вашего цикла

echo "</div>";

Не тестировал, но должно работать 😉

Счастливого кодинга.

Вы также можете использовать этот код для отображения категории и поста (если вы используете категорию и пост по умолчанию в WordPress)

<?php 
        $terms = get_terms( 'category', array(
        'hide_empty' => false,
        'order_by' => 'name',
        'order' => 'ASC',
        'number' => 100,
        'taxonomy' => 'category'
    ) );

         //print_r($terms);

         foreach($terms as  $termss)
        {
        //echo "<br/>";
         //echo $termss->term_id;
            //echo "<br/>";
            ?>
        <h1> <?php echo $termss->name; ?></h1>
         <?php 
            //echo "<br/>";
          //echo $termss->slug;


           $query =  query_posts("category_name="$termss->name"&showposts=5");
        //print_r($query);
        foreach($query as  $querys)
        {
        //$querys->ID;
        ?>
        <h3><?php echo $querys->post_title; ?></h3>

        <p><?php echo $querys->post_content; ?></p>

    <?php   //echo "<br/>";
        }


        }
         ?>

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

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

Этапы реализации:

  1. Запрос категорий: Мы начнем с того, чтобы получить все категории и отсортировать их. Это позволит вам динамически генерировать контент без необходимости ручного добавления ID каждой категории в код.

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

  3. Отображение постов и заголовков категорий: На основе полученных данных мы будем отображать посты и заголовки категорий на странице.

  4. Пагинация: Использование jQuery Infinite Scroll для динамической подгрузки контента без перезагрузки страницы.

Пример кода:

add_action('pre_get_posts', 'setup_my_query_interception');
function setup_my_query_interception($query) {
    if (!is_admin() && $query->is_home() && $query->is_main_query()) {
        $query->set('posts_per_page', 5); // Указание количества постов на странице
    }
}

function display_all_posts_with_pagination() {
    // Получаем все категории
    $categories = get_categories(array('hide_empty' => false));

    // Проходимся по каждой категории
    foreach ($categories as $category) {
        // Выводим название категории
        echo '<h2 class="cat-header">' . esc_html($category->name) . '</h2>';

        // Создаем новый объект WP_Query для получения постов в этой категории
        $args = array(
            'category__in' => array($category->term_id),
            'posts_per_page' => -1, // Получать все посты
            'paged' => get_query_var('paged') ? get_query_var('paged') : 1, // Поддержка пагинации
        );

        $cat_posts = new WP_Query($args);

        // Проверяем наличие постов
        if ($cat_posts->have_posts()) {
            echo '<div class="mywrapper">';
            while ($cat_posts->have_posts()) {
                $cat_posts->the_post();
                // Подключаем файл контента
                get_template_part('content', get_post_format());
            }
            echo '</div>'; // Закрытие обертки постов

            // Пагинация
            echo '<div class="pagination">';
            echo paginate_links(array(
                'total' => $cat_posts->max_num_pages,
            ));
            echo '</div>';
        } else {
            echo '<p>Постов в этой категории нет.</p>';
        }

        // Сбрасываем данные поста
        wp_reset_postdata();
    }
}

// Вызов функции в шаблоне
display_all_posts_with_pagination();

Пояснения по коду:

  • Фильтрация запросов: В самом начале мы используем pre_get_posts, чтобы настроить запрос так, чтобы на главной странице отображалось нужное количество постов на страницу.

  • Цикл по категориям: Вместо жесткой привязки к ID категорий, мы используем цикл, который проходит по всем категориям. Это предотвращает дублирование кода и делает его более управляемым.

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

  • Вывод данных и пагинация: Мы используем функцию paginate_links() для создания ссылок на страницы с постами. Эта функция автоматически учитывает, сколько страниц есть для текущей категории.

Заключение:

Данный подход обеспечивает более универсальное решение для отображения постов из всех категорий с пагинацией. Вы сможете легко управлять категориями и постами, не дублируя код. Вдобавок, использование jQuery Infinite Scroll улучшит пользовательский опыт, позволяя избежать перезагрузки страницы при просмотре постов.

Постоянное обновление и оптимизация кода помогут поддерживать производительность и удобство вашего сайта. Это также положительно скажется на SEO, поскольку улучшит время загрузки страниц и общее восприятие пользователями.

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

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