Создание пользовательской страницы категории с пагинацией
На прошлой неделе я пытался разобраться с созданием пользовательской страницы категории с пагинацией. Я пробовал множество способов, но не могу правильно настроить пагинацию. Если кто-то может помочь.
То, что я хотел сделать в моей теме 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(); ?>
У вас есть несколько проблем здесь
Следующий фрагмент кода неверен и не нужен
$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(); ?>

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

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

Когда я попробовал это решение, я всё равно получаю ошибку "Страница не найдена". Я знаю, что это очень старый вопрос, но это единственное, что помогло мне продвинуться дальше, чем другие варианты. Я пытаюсь организовать постраничную навигацию для записей в категориях 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);
