List of all posts in single category with pagination in arbitrary WordPress page

Постановка:

Клиент иска, когато човек разглежда дадена статия в блога – избирайки категорията, да му се визуализира страница показваща всички статии за тази категория.

Освен това иска да се странира и да показва само по 10 статии на страница, като линка за следваща или предишна страница да се скрива, ако няма други страници.

И на всичко от горе – иска статиите да са номерирани и когато премине на следващи страници, номерацията да продължава.

Променливи:

Най-напред си описах всичките типове изменения, които клиента иска. Обърнах ги в променливи и ги дефинирах в страницата за категориите (category.php).

<?php
// get the ID of the chosen category
$cur_cat_id = get_cat_id( single_cat_title("",false) );

// number of posts to display
$posts_per_page = 10;

// check if there is more than one page
$paged = (get_query_var('paged')) ? get_query_var('paged') : 1;

// for proper counting
$counter = (($paged * $posts_per_page) - $posts_per_page) + 1;

// to store newly defined WordPress query
$recent = new WP_Query();
?>

В $cur_cat_id запивам IDто на текущата категория. Ако искате да използвате кода в произволна страница, различна от category.php тук ще окажете, коя категория искате да се визуализира.

Предефиниране на заявката:

След като имах променливите, предефинирах стандартната заявка:

<?php $recent -> query('cat='.$cur_cat_id.'&showposts='.$posts_per_page.'&paged='.$paged); ?>

Генериране на HTML:

За визуализирането имаше изискване номерацията да продължава на всяка следваща страница. Създадох един ‘брояч’ $counter, който пресмята номера на първата статия от страницата и след това го използвам в html подреден списък, за да генерирам правилно номерирането.

<ol start="<?=$counter?>">
<?php while($recent->have_posts()) : $recent->the_post(); ?>
   <li>
      <a href="<?php the_permalink(); ?>">
         <?php the_title(); ?>
      </a>
   </li>
<?php endwhile; ?>
</ol>

Страниране:

Накрая остана странирането. Него го извадих отделно и с една проста проверка избягвам създаването на връзки към празни страници.

<dl>
   <dt>Page navigation</dt>
<?php if ($recent->max_num_pages > $paged) { ?>
   <dd><?php next_posts_link( '&larr; Older posts in the category' ); ?></dd>
<?php } ?>
   <dd><?php previous_posts_link( 'Newer posts in the category &rarr;' ); ?></dd>
</dl>

Изходния код:

Това е всичко по изискванията. И събрано на едно място:

<?php
// get the ID of the chosen category
$cur_cat_id = get_cat_id( single_cat_title("",false) );

// number of posts to display
$posts_per_page = 10;

// check if there is more than one page
$paged = (get_query_var('paged')) ? get_query_var('paged') : 1;

// for proper counting
$counter = (($paged * $posts_per_page) - $posts_per_page) + 1;

// to store newly defined WordPress query
$recent = new WP_Query();
?>

<?php $recent -> query('cat='.$cur_cat_id.'&showposts='.$posts_per_page.'&paged='.$paged); ?>

<ol start="<?=$counter?>">
<?php while($recent->have_posts()) : $recent->the_post(); ?>
   <li>
      <a href="<?php the_permalink(); ?>">
         <?php the_title(); ?>
      </a>
   </li>
<?php endwhile; ?>
</ol>

<dl>
   <dt>Page navigation</dt>
<?php if ($recent->max_num_pages > $paged) { ?>
   <dd><?php next_posts_link( '&larr; Older posts in category' ); ?></dd>
<?php } ?>
   <dd><?php previous_posts_link( 'Newer posts in category &rarr;' ); ?></dd>
</dl>

Вашият коментар

This site uses Akismet to reduce spam. Learn how your comment data is processed.