ページナビプラグインなしで固定ページに複数カテゴリーの記事一覧を全て表示する

2020/2/25 10:28:31作成
以前、Wordpressで複数カテゴリの記事一覧を固定ページに表示していたものの、投稿表示がWordpressで設定されている1ページの投稿数を越えてもページナビゲーションが表示されず過去の分を見ることができなくなったため対応したものです。調べてみるとページナビゲーションの表示にはプラグインを使った方法が多く記載されています。しかし、ここではプラグインは利用せずテーマオリジナルのページナビゲーションを利用しようとしたものです。もっとスマートな方法があるかも知れませんが備忘録として掲載します。

まず、固定ページに特定のカテゴリーを表示するにはPHPコードを使ったファイルをショートコードで記述し読み込ませ表示するというのが一般的な手段です。ショートコードでPHPコードを使ったファイルを読み込ませるためには子テーマのテーマフォルダ内にあるfunctionsファイルに次のコードを追加する必要があります。

以下の場合、固定ページで[myphp file='info']と記述することによって、子テーマ内のincludeフォルダ内にあるPHPコードが記述されたinfo.php(名前は自由に設定可能)というファイルを読み込みその内容が表示されるという事になります。
function Include_info_php($params = array()) {
    extract(shortcode_atts(array(
        'file' => 'default'
    ), $params));
    ob_start();
    include(get_stylesheet_directory() . '/includes/info.php');
    return ob_get_clean();
}
add_shortcode('infophp', 'Include_info_php');

次に、子テーマ/include/info.phpの内容です。
ポイントは、
1.ページナビゲーションが表示されなかったこと
これは最大ページの数(max_num_pages)が取得できなかったことです。そこでカテゴリーごとの投稿数(ここではIDが19と17のもの)を統合し、1ページに表示される投稿数の設定値(get_option('posts_per_page'))で割り、切り上げた値を$GLOBALS['wp_query']に入れるということでページナビゲーションが表示されるようになりました。
$GLOBALS['wp_query']->max_num_pages = ceil((get_category('19') ->count + get_category('17') ->count)/get_option('posts_per_page')); 

2.投稿のoffsetの値を設定
offsetの値とは投稿数のどこまで飛ばして読み込むかという事です。何個目の投稿から読み込むかという事でこれも投稿数の設定値(get_option('posts_per_page'))から計算が可能で必要分を表示することにしました。
$my_offset = get_option('posts_per_page') * ($paged-1); 

3.カテゴリーIDの設定
WordpressでカテゴリーIDを確認する方法はカテゴリーのページから取得するカテゴリーのリンクにID=○○と番号が書かれているので確認することができます。複数のカテゴリーを表示するにあたってここではIDが19と17のものを表示しています。

最後にinfo.phpのコードです。
<?php 
$paged = (get_query_var('paged')) ? get_query_var('paged') : 1; //現在のページを取得 
$my_offset = get_option('posts_per_page') * ($paged-1); //一番最初から投稿数を何個飛ばすかを計算
$args = array(
	'posts_per_page'   => get_option('posts_per_page'),  //1ページの投稿数設定
	'offset'           => $my_offset,       //一番最初から投稿数を何個飛ばして表示するかを設定
	'category'         => '19,17'//表示するカテゴリをIDで取得
);
$posts = get_posts($args); global $post; //配列を設定
?>

<?php  if($posts): foreach($posts as $post): setup_postdata($post); //配列からデータを取得し表示する?>
<div>
<a href="<?php the_permalink() ?>"><?php the_title(); ?></a>
<?php the_excerpt() ; ?>
<div>
<?php echo get_the_date( $format, $post ); ?>
</div>
<div>
<?php the_author(); ?>
</div>
</div>
<?php endforeach; endif;?>

<?php
//ページナビを表示する為$GLOBALS['wp_query']->max_num_pagesに値をセット
$GLOBALS['wp_query']->max_num_pages = ceil((get_category('19') ->count + get_category('17') ->count)/get_option('posts_per_page')); 
the_posts_pagination();
wp_reset_postdata();
?>


今のところ正常に表示されています。
投票数:50 平均点:1.80

趣味を楽しもう新着記事

欲しい商品が必ず見つかるメジャーなネットショップ

ログイン

Facebook,RSSリンク表示

検索

アクセスカウンタ

今日 : 547
昨日 : 654
総計 : 1628645