WordPress で index にカテゴリーを指定した記事一覧とページ送りを表示する。
タイトル長いですが、まぁ、この通りな事をしたかったんです。
以前「WordPress でカテゴリーを複数指定して新着を表示する。」って事をしてたので、このブログでも表示してるページ送り(ページャー?ページネーション?)と合わせればちょちょっとできると思ってました。
ところが、まったくうまくいかず、解決するのにほぼ一日かかりました…。
もしかしたら、同じく困ってる人がいるかもしれないと思ったので記録用として。
ここから続き
まずは WP_Query カテゴリー指定の投稿一覧を表示
最初は『query_posts('cat=1')』と『<?php while (have_posts()) : the_post(); ?>』でカテゴリー指定の記事一覧を取得したのですが、ちょっと調べたら query_posts は非推奨だったので WP_Query に切り替えました。
- home.php
-
<?php $paged = get_query_var('paged') ? get_query_var('paged') : 1; ?> <?php if(is_mobile()): ?> <?php $args = array( 'posts_per_page' => 8, 'category_name' => 'カテゴリースラッグ', 'paged' => $paged ); ?> <?php else: ?> <?php $args = array( 'posts_per_page' => 9, 'category_name' => 'カテゴリースラッグ', 'paged' => $paged ); ?> <?php endif; ?> <?php $query = new WP_Query($args); if ( $query->have_posts() ) : while ( $query->have_posts() ) : $query->the_post(); ?> <div> <?php the_title(); ?> <?php the_content(); ?> とかのループ内容 </div> <?php endwhile; endif; wp_reset_postdata(); ?>
一行目の get_query_var で、ページ送りを表示するのに「1ページ目を表示するよッ。」って感じ。
あとは posts_per_page に1ページ内に表示する数を指定し、category_name でカテゴリースラッグを入れることでカテゴリーを指定してます。
ちなみに is_mobile() で条件指定して、PC と スマホで表示件数を変えていますが、自分が必要だっただけなので無くても動きます。
カテゴリ指定の記事一覧とページ送りは相性が悪い
次に paginate_links でページ送りを表示。
- home.php
-
<?php $big = 999999999; echo paginate_links(array( 'base' => str_replace($big, '%#%', esc_url(get_pagenum_link($big))), 'current' => max(1, get_query_var('paged')), 'total' => $query->max_num_pages, 'mid_size' => 2, )); ?>
コレでページ送りは表示されるのですが、2ページ目以降は 404 で表示されない…。
調べてみたらよくある(?)事のようで、イロイロ解決策が書かれていたのですが、なぜか自分の場合はうまくいかず…。
もしかしたら WordPress のバージョンも関係あるのかな?
原因は管理画面の表示設定
理由はわかりませんが、原因は管理画面の「1ページに表示する最大投稿数」より posts_per_page の数を小さくしていると 404 になる様子。
Qiita にもそんな情報が載ってました。
wordpressでページャー2ページ目以降が見つかりません
なので「1ページに表示する最大投稿数」をいっそ 1 にしてしまえばイイのですが、そうすると category.php を使って表示してた別ページの違うカテゴリー一覧も 1 になっちゃう…。
ここから WP_Query を使ってカテゴリー指定一覧を表示しつつ、ページ送りが 404 にならない方法を試しては失敗の繰り返しでした…。
そこでひらめいた get_option('posts_per_page')
いろんな方法を試してる最中に、get_option('posts_per_page') で「1ページに表示する最大投稿数」を取得することが出来ることを知りました。
「ん?じゃぁ、この辺イジって index だけ最大投稿数を 1 にすればイイんじゃなかろうか。」と。
そこで、コレを上書きする方法(フックするって言うらしい。)を調べてたところ下記のブログに到着。
WordPressで記事の表示変数を変更する方法
この方法を自分用に合わせて下記に変更し、functions.php に追加。
- functions.php
-
function my_pre_get_posts($query) { if ($query->is_main_query() && !is_admin()) { if (is_home() || is_front_page()) { $query->set('posts_per_page', 1); } } } add_action('pre_get_posts', 'my_pre_get_posts');
コレでようやく解決しました… ( ;∀;)
ちなみに、通常はページ送りを表示するのに the_posts_pagination() でも可能なのですが、こっちだと functions.php で上書きした posts_per_page の数と連動して表示がおかしくなります。
つまり今回の場合だと 1 だったので、投稿数分ページ送りの番号が表示される感じ。
ホント、落とし穴ありすぎ。
他にも原因があったのかも
ここまで書いといてなんですが、試行錯誤中に管理画面からパーマリンクの設定とかも変更したりしてたので他にも原因があったかも。
正直イロイロ試しすぎて覚えてない…。
Comment Form