wordpressのインデックスで表示を分割する方法

wordpressでのインデックス(ホームページ)で、最新の記事を表示してるのは基本だと思いますが、その表示はループといわれる機能をつかって連続処理することで、最新の何件という風に表示してるんだけども…

さて、その途中でぶった切って、GoogleAdsenseや、お知らせとか、特集の記事リストとか、なんか入れたいと。

俺の場合は、このさかどん記録のインデックスでもやっているけど、1番最新の記事を表示した後に、その記事以降の記事リストと、固定ページリスト、それにAdsenseを表示させたかった。

なぜかというと、まあサイドバーに最新記事リストとか横に長いのを入れるのは窮屈だし、はたしてサイドバーがそれによって長くなるのもなあと。ビックフッターというのも流行ったけど、一番下まで記事リスト見るためには見ないよと。

それにおいら自身が、この記事見覚えないな、というのを直接見れればそれで良いなーとか。巡回中なら、もう見覚えのあるタイトルだったら、次のサイトを読めるし。

あと、そのリンクでその記事の単独表示ページ(パーマリンク先)に飛んでくれれば、そっちのほうがAdsense多いとかいう腹黒いところもあったりw

まあそんなこんなで、ぶった切りたかった。

で、結局どうしたか

いろいろぐぐりまくって、いろんな参考文献を見つけて総括してなんとかごり押しで実現した。

前提条件は、index.phpでの話ということぐらいか。以下の通り;

<?php if ( !is_paged() ) : // 1ページ目 ?>
<?php $my_query = new WP_Query('showposts=1'); //まず最初の最新1件を表示 ?>
<?php while ($my_query->have_posts()) : $my_query->the_post(); ?>
通常のループ内HTMLを書く。
<?php endwhile; //最初の1件おわり、この下は最新記事のリスト ?>
ここに、途中で挟みたいものを書く。HTMLでもいいしループでもなんでも。
<?php $my_query = new WP_Query('showposts=3&offset=1'); //最新1件をのぞいた3件を表示 ?>
<?php while ($my_query->have_posts()) : $my_query->the_post(); ?>
1ページ目に表示する記事の、のこりの件数のためのループをここにいれる。
<?php endwhile; //1ページ目のみのエントリー表示部分 終わり ?>
<?php else : // 2ページ目以降 ?>
<?php if (have_posts()) : ?>
<?php while (have_posts()) : the_post(); ?>
記事ループ
<?php endwhile; //記事ループおわり ?>
<?php else : //記事がなんもない場合 ?>
<?php endif; ?>
<?php endif; //ページ分け終わり ?>

こんな感じ。

<?php if ( !is_paged() ) : // 1ページ目 ?>

is_paged()を呼び出して、おまえがis_pagedじゃなければ以下の部分を表示しろと。ここで言うis_paged()なページとは、2枚目のページだとか、10枚目のページだとか、とにかく1番最初のページではないこと。

<?php $my_query = new WP_Query('showposts=1'); //まず最初の最新1件を表示 ?>

ここで、まず最新の1件を表示させようと仕向けてる。2件表示させたいならshowposts=の値を変更すればいい。

<?php while ($my_query->have_posts()) : $my_query->the_post(); ?>
通常のループ内HTMLを書く。

普通にループを仕向けてる。ここではなぜだがget_the_tags()が動かなかった。なぜだろう?

<?php endwhile; //最初の1件おわり、この下は最新記事のリスト ?>
ここに、途中で挟みたいものを書く。HTMLでもいいしループでもなんでも。

ループを終わらせて、そこに挟める。Adsenseのjs読み込みなど。

<?php $my_query = new WP_Query('showposts=3&offset=1'); //最新1件をのぞいた3件を表示 ?>
<?php while ($my_query->have_posts()) : $my_query->the_post(); ?>
1ページ目に表示する記事の、のこりの件数のためのループをここにいれる。

書いてあるとおりだが、ここにのこりの件数を入れる。

のこりの件数の算出方法だが、wordpressの「設定」→「表示設定」での設定画面「1 ページに表示する投稿数」にて指定した数から一番最初に表示する件数(ここでは1)を引いた数である。その数をshowposts=の値(ここでは3)とする。offsetの値は、一番最初に表示する件数(ここでは1)も忘れずに入れること。でないと重複表示してしまう。

<?php endwhile; //1ページ目のみのエントリー表示部分 終わり ?>
<?php else : // 2ページ目以降 ?>

ここでループを終わらせ、2ページ目以降はどのように表示させるかを続けている。このelse部分の処理をなくせば、2ページ目以降も同じように表示させる。

ここから下は、通常でも扱うような感じなので割合。まあ、コメントに書いてあるとおりです。

例外判断とかかなり曖昧なので、その辺を意識すると記事が1つもないとき、どういう表示するのか謎だけど…まあいいや。記事が有ればいい。

問題点としては、上げたとおりget_the_tags()あたりが動かないっぽい?ことと、結構強引にやってるから、設定画面の「1ページに表示する投稿数」との調和が取れないところか。その辺は実際に値を持ってるのを引っ張ってくればいいんだろうけど、めんどくさいので決めうちにしてしまってる…。だれか直して☆

まあ、そんなところ。もっと簡単な方法がありそうだけど、気にせず使うこととする。良いのかどうかはううむ…。

参考になれば幸いです。。