【WordPress】投稿一覧をタクソノミーごとに表示する方法
以前こちらの記事で、投稿一覧をタクソノミーごとに区切って表示して、それぞれにタイトルを付ける方法を掲載しました。
しかし、その時点では、ページネーションを付けることがかないませんでした。
今回その2では、ページネーションも兼ね備えたバージョンを紹介します。固定ページにphpを適用させたり、function.phpにコードを追記する点に関しては前回と同様なので、プラグインの使い方などは前回記事を参考にしてください。
ページネーションに関しても、以前作成したものを流用しているので、そちらを参考にしてください。
【WordPress】ページネーションを作成する
固定ページに記載するコード
<?php
$max_publish = 3; //1ページに表示する投稿数
$current_page = get_query_var('paged');
$current_page = $current_page == 0 ? '1' : $current_page;
//一つ前のページの最後に表示されていた都道府県を知りたい
$publish_num = 0;
$start_prefecture = 1; //表示するページの最初の都道府県のi
$max_taxonomy_num = 47;//タクソノミーの数
if (function_exists('listQuery')) {
for ($i = 1; $i <= $max_taxonomy_num; $i++) {
if ($publish_num < $max_publish * ($current_page - 1) && $i != $max_taxonomy_num) {
$add_num = listQuery($i, -1)->post_count;
$publish_num += $add_num;
} else {
if ($publish_num / (($current_page - 1) * $max_publish) == 1) {
$start_prefecture = $i;
$shift = 0; //ずらしなし
} else {
$shift = $max_publish * ($current_page - 1) - $publish_num + $add_num;
$i == $max_taxonomy_num ? $start_prefecture = $i : $start_prefecture = $i - 1;
}
break;
}
}
}
$publish_num = 0;
if (function_exists('prefecturesLoop')) {
$show_publish = 0;
for ($i = $start_prefecture; $i <= $max_taxonomy_num; $i++) {
if ($show_publish < $max_publish) {
$posts_per_page = $max_publish - $show_publish; //1回に表示する数
$publish_num = prefecturesLoop($i, $posts_per_page, $shift); //この都道府県の投稿数
if ($i == $start_prefecture) {
$show_publish = $publish_num - $shift;
$shift = 0;
} else {
$show_publish += $publish_num;
}
} else {
break;
}
}
}
if (function_exists('pagination')) {
pagination($current_page, 5, $max_publish);
}
?>
function.phpに記載するコード
タクソノミー別に記事がいくつあるか調べる関数
function listQuery($slug, $posts_per_page)
{
$list_args = array(
'post_type' => 'prefectures',
'tax_query' => array(
array(
'taxonomy' => 'prefectures',
'field' => 'slug',
'terms' => array($slug),
)
),
'posts_per_page' => $posts_per_page,
);
$query = new WP_Query($list_args);
wp_reset_postdata();
return $query;
}
指定のタクソノミーがついた記事の一部を取り出す関数
function prefecturesLoop($slug, $posts_per_page, $shift)
{
switch ($slug) {
case '1':
$prefecture = "北海道";
break;
case '2':
$prefecture = "青森県";
break;
〜省略〜
case '46':
$prefecture = "鹿児島県";
break;
case '47':
$prefecture = "沖縄県";
break;
default:
$prefecture = "";
break;
}
$list_args = array(
'post_type' => 'prefectures',
'tax_query' => array(
array(
'taxonomy' => 'prefectures',
'field' => 'slug',
'terms' => array($slug),
)
),
'posts_per_page' => $posts_per_page + $shift,
);
$list_query = new WP_Query($list_args);
$current_post = $list_query->post_count;
if ($list_query->have_posts()) : //投稿が存在するものに限る。
echo '<h2>' . $prefecture . '</h2>';
$count = 0;
while ($list_query->have_posts()) : $list_query->the_post();
$count++;
if ($count > $shift) {
echo '<div>
<div>
<h5>
<a href=' . get_the_permalink() . '>' . get_the_title() . '</a>
</h5>
<p>' . get_the_content() . '</p>
<a
href=' . get_the_permalink() . '
>記事を読む</a
>
</div>
</div>';
}
endwhile;
endif;
wp_reset_postdata();
return $current_post;
}
ページネーション
【WordPress】ページネーションを作成する
こちらに記載しております。
注意
こちらの実装方法では、複数のタクソノミーを記事につけた際、ページャーの数が足りないというバグが発生します。
記事に複数のタクソノミーをつけたい場合には、ページャーの
$full_page = ceil(wp_count_posts('introduction')->publish / $max_publish);
この部分をカスタマイズしてください。
コメント