前回の記事で、WP_QueryやQuery_postsで’offset’のプロパティを使用すると、ページャーにエラーが出て同じ記事しか表示されない…的なことを書きました。
WordPressでページネーション実装したときのWP_Queryとquery_posts共通のハマりポイント
で?なに?if(have_posts()): while(have_posts()): the_post();でいいじゃん?
って方も多いと思いますが、上記のような問題は、ページにループを2つ作る場合に非常に困るんですよね。
最新記事のみ「ループ1」、2番目以降は「ループ2」で出力したい時とかあると思うんですね。
ループ2の最初の記事は先頭から2記事目を表示したい、ということです。
WP-PageNaviとoffsetの関係 -WordPress(ワードプレス) (wald-grun/blog)
一応ここにそれっぽい解決法がありましたが、どうも上手く行かず。
なので、事実上offsetは諦めて、先頭記事をループ2から除外することにしました。
WP_Queryやquery_postsでoffsetを指定せずに2番めの記事から表示する
では、どうするか…
先頭記事のIDを取得して、ループ2からそれを除外します。
WP_QueryやQuery_postsにはそれぞれ、投稿を除外するアレがありますね。
テンプレートタグ/query posts – WordPress Codex 日本語版
関数リファレンス/WP Query – WordPress Codex 日本語版
‘post__not_in’に指定するIDを取得する
get_the_IDをループ2の直前で使います。
関数リファレンス/get the ID – WordPress Codex 日本語版
それを、WP_Queryの引数として指定する配列にブチ込みます。
1
2
3
4
5
6
7
|
$firstID = get_the_ID(); //投稿の最初の記事ID
$postOthers = array(
‘showposts’ => 5 ,
‘paged’ => get_query_var(‘paged’) ,
‘post__not_in’ => array($firstID)
);
|
ループ1と2の扱いはこんな感じ。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
|
<ul class=“loop1”>
<?php //【1】
$postNum1 = array(
‘posts_per_page’ => 1 ,
);
$post1 = new WP_Query( $postNum1 );
if($post1–>have_posts()){
while($post1–>have_posts()){ //最初の1記事
$post1–>the_post();
?>
<li>
<a href=“<?php the_permalink(); ?>”>
ループ1で出したい内容…
</a>
</li>
<?php
}
}
?>
</ul>
<ul class=“loop2”>
<?php //【2】
$firstID = get_the_ID(); //投稿の最初の記事ID
$postOthers = array(
‘showposts’ => 5 ,
‘paged’ => get_query_var(‘paged’) ,
‘post__not_in’ => array($firstID) //ここにさっきの$firstIDを。
);
$postOther = new WP_Query($postOthers) ;
if($postOther –> have_posts()){
while($postOther–> have_posts()){ //最初の1記事以降の
$postOther–>the_post();
?>
<li class=“<?php echo addCatClass(post);?>”>
<a href=“<?php the_permalink(); ?>”>
ループ2で出したい内容…
<h2><?php echo get_the_title(); ?></h2>
<p><span class=“data-date”><?php the_time(‘Y年n月j日’); ?></span></p>
<button type=“button” class=“btn btn-default” >記事を読む</button>
</a>
</li>
<?php
}
}
?>
</ul>
|
ちょっと素人クサイかもしれませんが、これでイケました!
ページャーで次のページにジャンプした時、そのページでの先頭記事がスッポ抜けるかと心配していましたが…それも無事回避していました!やったね!
おそらく、ループ2の外でget_the_ID()しているのがミソかと思います。
試していませんが、ループの中だと各記事のIDを取ってしまうのではないかと。
これを思いつく前にふと、最初の記事だけ漠然と判別できれば…と思いましたが、それをどうするかイマイチ閃かなかったので、こっちでも「こうやれば同じこと出来るよ!」とかアイデアがあれば是非是非お申し付けくださいませ
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
function isFirst(){//最初の記事の判別
global $wp_query;
return ($wp_query–>current_post === 0);
}
function isLast(){//最後の記事の判別
global $wp_query;
return ($wp_query–>current_post+1 === $wp_query–>post_count);
}
function isOdd(){//奇数記事の判別
global $wp_query;
return ((($wp_query–>current_post+1) % 2) === 1);
}
function isEver(){//偶数記事の判別
global $wp_query;
return ((($wp_query–>current_post+1) % 2) === 0);
}
|
今回はWP_Queryで実装していましたが、理屈は同じ(?)なのでquery_postsでも大丈夫だと思います。ダメだったら言ってください。satohmsysが陳謝します。
でわ!