韓国留学、ベルリン短期ワーホリ、転職、Webデザイン、英語勉強、旅行、食べ物、ディズニーなど

WordPress WP-PageNaviで1ページ目のみ表示を変える

WordPress

WordPressで、ブログサイトを作るとき、プラグイン「WP-PageNavi」で、ページネーションを設置した際に、1ページ目と2ページ目以降の表示を変えるというのをやってみました。

具体的には、1ページ目は、最新記事2件目まで特別に大きく見せ、3件目以降は小さめに表示します。そして、1ページに8件まで表示することにします。
なので、2ページ目は、9件目から表示することになるのですが、1ページ目とは違い、8件全てを小さめに表示するようにします。

やるべきことを分けると、
1、最新記事◯件分のみ表示する。もしくは、◯番目の記事のみ表示する
2、◯番目以降の記事を表示する
3、WP-PageNaviでページネーションを作ったとき、2ページ目以降の表示内容を変える
4、WP-PageNaviと、offset問題について
5、WP-PageNaviが取得するページ数を調整
のようになります。

1、最新記事◯件分のみ表示する

例として、最新記事2件目まで抜粋することにします。

<?php $posts = get_posts( array(
 'post_type' => 'post',//投稿タイプ
 'posts_per_page' => '2' //表示する件数(最新の記事2件まで)
 ) );
 foreach ($posts as $post) : setup_postdata($post); ?>
 〜1,2番目の記事のループの内容〜
<?php endforeach; wp_reset_postdata(); ?>

もしくは、◯番目の記事のみ表示する方法はこちらです。
例として、2番目の記事のみ抜粋することにします。

<?php if(have_posts()): while(have_posts()):
 the_post(); $counter++; ?>
 <?php if ($counter == 2): ?>
 〜2番目の記事のループの内容〜
<?php else:?>
<?php endif;?>
<?php endwhile; endif; ?>

ちなみに、「$counter <= 1」とすれば、1件目のみ表示、「$counter <= 2」とすれば、2件目まで表示になります。

スポンサーリンク

2、◯番目以降の記事を表示する

例として、3番目以降を表示する場合はこちらです。1ページに8件の記事を表示することにします。

<?php
$newslist = get_posts( array(
'posts_per_page' => 8, //取得記事件数(1ページに表示する件数)
'offset' => 2 //表示しない件数  
));
foreach( $newslist as $post ):
setup_postdata( $post );
?>      
 〜3番目以降のループの中身〜
<?php endforeach; 
wp_reset_postdata();?>

3、WP-PageNaviでページネーションを作ったとき、2ページ目以降の表示内容を変える

<?php if ( !is_paged() ) : // 1ページ目 ?>
1ページ目だけのコンテンツ
<?php else : // 2ページ目以降 ?>
2ページ目以降のコンテンツ
<?php endif; ?>

参考サイト:「WordPressで1ページ目だけに表示するif分岐phpテーマ

4、WP-PageNaviと、offset問題について

1〜3番目の内容を組み合わせれば、一見、完成しそうな気がしますが、WP-PageNaviとoffsetを一緒に使うと、うまくページ送りができなくなります。
そこで、offsetの数値を動的に設定することで、解決できました。
具体的には、

<?php
$perpage = 8;//1ページあたりの表示件数
$offset = ($paged-1)*$perpage+2;//現在のページに該当するoffset値(表示しない件数)の計算
if (have_posts()) :
query_posts("showposts=$perpage&offset=$offset&paged=$paged");
while (have_posts()) : the_post(); 
?>
 〜ループの内容〜
<?php endwhile;?>
<?php wp_reset_query();endif;?>

のようになります。

offset(表示しない件数)の計算は、まず、$perpage(1ページあたりの表示件数)×(一つ前までのページ数)に、1ページ目で特別に表示させた件数を足した数字です。$pagedは現在のページ数のことです。$paged-1で、今いるページの1つ前のページ数になります。

↑の説明書いているうちにわけわからなくなってきましたが、これでうまくいきました。

参考サイト:「WP-PageNaviとoffsetの関係 -WordPress(ワードプレス)

最終的に、このようなコードになりました。

<?php if ( !is_paged() ) : // 1ページ目 
//ここから1ページ目だけのコンテンツ?>
	<?php if(have_posts()): while(have_posts()): the_post(); $counter++; ?>
	 <?php if ($counter <= 1): ?>
	〜1件目の記事〜
	<?php elseif ($counter == 2): ?>
	〜2件目の記事〜
	<?php endif;?> <?php endwhile; endif; ?>
	   ||省略||
	<?php
      $perpage = 8;//ページごとの表示件数
      $offset = 2;//表示しない件数
      if (have_posts()) : query_posts("showposts=$perpage&offset=$offset&paged=$paged");
      while (have_posts()) : the_post(); 
      ?>
        <?php get_template_part('each_excerpt_post'); ?>
      <?php endwhile;?>
      <?php wp_pagenavi(); //ページネーション ?>
      <?php wp_reset_query();endif;?>
<?php else : // 2ページ目以降 
//ここから2ページ目以降のコンテンツ?>
	<?php 
	 $perpage = 8;//ページごとの表示件数 
 	$offset = ($paged-1)*$perpage+2;//現在のページに該当するoffset値の計算 
	 if (have_posts()) : query_posts("showposts=$perpage&offset=$offset&paged=$paged"); 
	 while (have_posts()) : the_post(); ?>
	〜9件目から最後までの記事〜
	<?php endwhile;?>
        <?php wp_pagenavi(); //ページネーション ?>
	 <?php wp_reset_query();endif;?>
<?php endif; ?>

5、WP-PageNaviが取得するページ数を調整

最後に、WP-PageNaviで表示されるページ数のズレを調整します。
例えば、記事が18件あるとき、1ページ目に10件、2ページ目に8件表示するので、ページ数は2ページになるはずですが、このままだと、単純に18件÷8(1ページに表示する件数)をしてしまい、ページ数は3ページになってしまいます。

これを直すために、WP-PageNaviのソースを直接編集します。
バージョンは2.91です。
core.phpの、256行目に、

$total_pages = max( 1, absint( $query->max_num_pages ) );

と書いてあります。
これを、

if(is_home()){
	$total_pages = max( 1, ceil( ( ($query->found_posts) -2 ) / $posts_per_page ) );
}else{
	$total_pages = max( 1, absint( $query->max_num_pages ) );
}

と書き換えました。
if(is_home())で分岐してあるのは、1ページ目と2ページ目以降の表示を変えているのは、home.phpだけだからです。
$query->found_postsで、投稿の全記事数を取得し、offsetの値(今回は2件)を引いた数を、ページごとの表示件数で割ります。
そうすれば、18件記事がある場合は、最初にoffsetの2を引いた16件÷8(ページごとの表示件数)となり、ページ数はちゃんと2ページになります。

これが一番良い方法なのかはわかりませんが、今のところ問題なく動いています。

スポンサーリンク

内容をご確認の上、「送信」ボタンを押してください。

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください