Создание пользовательской страницы категории с пагинацией

5 июл. 2015 г., 17:18:14
Просмотры: 32.5K
Голосов: 2

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

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

ПРИМЕР

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

Вот пример кода...

<?php
/**
 * Название шаблона: Шаблон категории
 *
 */

get_header(); ?>

<div id="primary" class="content-area">
<main id="main" class="site-main" role="main">
<?php
$category = get_post();
$category = $category->post_title;

$query = new WP_Query( array( 
'category_name' => $category,
'order' => 'asc',
'post_type' => 'post',
'post_status' => 'publish',
));
?>
<?php 
if ($query->have_posts()) {
   while ($query->have_posts()) : $query->the_post(); ?>

<article id="post-<?php the_ID(); ?>">
<header class="entry-header">
<?php the_title( sprintf( '<h2 class="entry-title"><a href="%s" rel="bookmark">', esc_url( get_permalink() ) ), '</a></h2>' ); ?>
</header><!-- .entry-header -->

<div class="entry-content">
<?php 
the_content();
?>
</div><!-- .entry-content -->
</article><!-- #post-## --><hr>

<?php endwhile; ?>
<?php the_paging_nav(); ?>
<?php
}
?>

</main><!-- #main -->
</div><!-- #primary -->

<?php get_footer(); ?>
0
Все ответы на вопрос 2
3

У вас есть несколько проблем здесь

  • Следующий фрагмент кода неверен и не нужен

    $category = get_post();
    $category = $category->post_title;
    

    Объект текущей страницы сохраняется в get_queried_object(), поэтому вы можете использовать эту функцию, чтобы получить заголовок записи. Кроме того, post_title - это неверное свойство для использования здесь. Вам нужно смотреть на slug записи, который сохраняется в свойстве post_name. Параметр category_name ожидает slug категории, а не её название. Параметр category_name, на мой взгляд, назван неправильно. Это как дать девочке мужское имя, а затем ожидать, что другие будут знать, что человек в вопросе - девочка, основываясь на имени.

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

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

  • the_paging_nav() - это не основная функция WordPress, поэтому вам нужно связаться с автором кода, чтобы узнать, как код должен использоваться с пользовательскими запросами.

Что-то вроде следующего должно работать

<?php
/**
 * Шаблон страницы: Шаблон категории
 *
 */

get_header(); ?>

<div id="primary" class="content-area">
    <main id="main" class="site-main" role="main">

        <?php
        $current_page = get_queried_object();
        $category     = $current_page->post_name;

        $paged = get_query_var( 'paged' ) ? get_query_var( 'paged' ) : 1;
        $query = new WP_Query( 
            array(
                'paged'         => $paged, 
                'category_name' => $category,
                'order'         => 'asc',
                'post_type'     => 'post',
                'post_status'   => 'publish',
            )
        );

        if ($query->have_posts()) {
               while ($query->have_posts()) { 
               $query->the_post(); ?>

                <article id="post-<?php the_ID(); ?>">
                    <header class="entry-header">
                        <?php the_title( sprintf( '<h2 class="entry-title"><a href="%s" rel="bookmark">', esc_url( get_permalink() ) ), '</a></h2>' ); ?>
                    </header><!-- .entry-header -->

                    <div class="entry-content">
                        <?php the_content(); ?>
                    </div><!-- .entry-content -->
                </article><!-- #post-## --><hr>

                <?php
            }

            // Использование next_posts_link() с max_num_pages
            next_posts_link( 'Старые записи', $query->max_num_pages );
            previous_posts_link( 'Новые записи' );

            wp_reset_postdata();
        }
        ?>

    </main><!-- #main -->
</div><!-- #primary -->

<?php get_footer(); ?>
5 июл. 2015 г. 18:56:04
Комментарии

Спасибо за ответ и совет. Ещё один вопрос: могу ли я использовать функцию twentyfourteen_paging_nav() в этом случае, потому что я хочу нумерованную навигацию по страницам.

Puni Puni
5 июл. 2015 г. 19:16:11

Нет, нельзя, она также поддерживает только основной запрос (но вы можете изменить её, чтобы она работала с пользовательскими запросами). Я некоторое время назад написал расширенную функцию пагинации для этого. Посмотрите её здесь. Только учтите, она не будет работать на версиях PHP старше 5.4. Вам понадобится как минимум PHP 5.4.

Pieter Goosen Pieter Goosen
5 июл. 2015 г. 19:22:17

Извините, я был занят в тот день и не смог вернуться, чтобы проверить ответ. В любом случае, большое спасибо за ответы на мои вопросы, и да, у меня PHP 5.5.12, поэтому я попробовал ваш код, и он работает.

Puni Puni
6 июл. 2015 г. 20:21:59
0

Когда я попробовал это решение, я всё равно получаю ошибку "Страница не найдена". Я знаю, что это очень старый вопрос, но это единственное, что помогло мне продвинуться дальше, чем другие варианты. Я пытаюсь организовать постраничную навигацию для записей в категориях arizona-beer и arizona-wine:

$current_page = get_queried_object();
$category     = $current_page->post_name;
$paged        = get_query_var( 'paged' ) ? get_query_var( 'paged' ) : 1;
        
$args = array(
    'posts_per_page'    => 2,
    'post_type'         => array( 'arizona_wine', 'arizona_beer', 'post' ),
    'paged'             => $paged, 
    'category_name'     => $category,
);
$category_posts = new WP_Query($args);
16 июн. 2024 г. 01:44:22