リクエストにはWP_Queryを使用します。
query_posts()やget_posts()を使ってメインループを絞り込む方法では
next_posts_link()とprevious_posts_link()で期待しない結果が返ってくることがあると思います。
pre_get_postsを使う方法もありますが、特定のページ(フロントページ以外)で使用できない場合もあるのでWP_Queryを使います。
WP_Queryを使った方法を説明する前にquery_posts()を使った問題のあるコードを紹介します。
index.php
<?php query_posts('tag=キーワード');?>
<?php if (have_posts()) :
while (have_posts()) : the_post(); ?>
//装飾用コード
<?php endwhile; ?>
<?php else : ?>
<p>Not found</p>
<?php endif; ?>
<?php previous_posts_link('新しい投稿ページへ'); ?>
<?php next_posts_link('古い投稿ページへ'); ?>
これでタグで絞った記事を取得してループを回せますがnext_posts_link()の動作がおかしくなります。
次にpre_get_postsを利用した方法を紹介します。
function.php
function pre_get_posts_custom($query) {
if(is_admin() || ! $query->is_main_query()){
return;
}
if ($query->is_pagee()) {
$query->set('posts_per_page', '5');
$query->set('tag', 'キーワード');
$query->set('cat', 'キーワード')
return;
}
}
add_action('pre_get_posts', 'pre_get_posts_custom');
これをfunction.phpに追加してあとはhave_posts()で同じようにループを回す。これで問題が起こらない場合はpre_get_postsを使うのがクールなやり方だと思います。
これで問題が生じた場合はWP_Queryで細かく設定します。
関数(発火点)を設置する。
index.php
<?php
$paged = get_query_var('page');
recentPosts($paged);
2.$paged = get_query_var(‘page’);
現在のページ番号を取得し$pagedに渡します。引数内のpageは静的フロントページの場合です。それ以外のページではpagedに変更します。
3.ループ処理を全て生成する関数getRecentPosts()を設置します。引数に取得した
関数を設定する。
別の場所で使うかもしれないので今回はfunction.phpに作ります。
function.php
<?php
function recentPosts($paged)
{
$query = array(
'post_type' => 'post',
'posts_per_page' => 10,
'paged' => $paged
);
$the_query = new WP_Query($query);
$str = '';
if ($the_query->have_posts()) {
while ($the_query->have_posts()) {
$the_query->the_post();
$pcate = '';
$category = get_the_category();
if ( $category[0] ) {
foreach ($category as $key) {
$pcate .= '<a href="' .get_category_link( $key->term_id ). '">' .$key->cat_name. '</a> ';
}
}
$plink = get_permalink();
$ptitle = get_the_title();
$str .= '<article"><header><div class="post_meta"><div class="time">' .get_the_date(). '</div>
<div class="post_category">' .$pcate. '</div></div><h1 class="post_title"><a href="' .$plink. '"title="' .$ptitle. '">' .$ptitle. '</a></h1>
</header><a href="' .$plink. '"title="' .$ptitle. '">' .get_the_post_thumbnail(). '</a></article>';
}
}
echo $str;
next_posts_link( '次のページへ', $the_query->max_num_pages );
previous_posts_link( '前のページへ' );
wp_reset_postdata();
}
HTMLコードが見づらいのでエディターなどで確認してください。
4-9行目絞り込む条件を指定。タグを指定したい場合は’tag’ => ‘program’の様に指定。
14.$pcate = ”;
カテゴリを格納するように変数を作成しておきます。カテゴリ(タグ)が複数ある場合に対応するようにしています。
16行目から20行目でカテゴリを変数に渡しています。
21行目から25行目で用意した変数を利用してHTMLを組み立てて$strに渡しています。
29.next_posts_link( ‘次のページへ’, $the_query->max_num_pages );
第二引数に今回のクエリで得たmax_num_pagesを指定。
スマートではありませんがこれで問題が解決できました。ページ送りが上手く機能しない場合はindex.phpから関数へ渡す引数(ページ番号)が間違っていると思います。
番号付きページャーをつける。(ページネーション)
prev< 12345.. >next のように番号でページ送りをさせたい場合はnext_posts_link()の代わりにpaginate_links()を使います。
index.phpは同じものを使うので省略します。引数に送るページ番号に注意してください。
function.phpもあまり変わらないので変わらない部分(1-28行目)は省きます。
function.php
$big = 99999;
echo paginate_links( array(
'base' => str_replace( $big, '%#%', esc_url( get_pagenum_link( $big ) ) ),
'format' => '/page/%#%',
'current' => max( 1, get_query_var('page') ),
'total' => $the_query->max_num_pages
) );
wp_reset_postdata();
}
4.‘format’ => ‘/page/%#%’,
URLの末尾に付く文字の整形、詳しくはリファレンスを見てください。
「?paged=2」のようにしたい場合は’format’ => ‘?paged=%#%’とする。
5.‘current’ => max( 1, get_query_var(‘page’) ),
現在のページ番号、静的フロントページ以外のページでは第二引数にpegedを指定。get_query_var(‘paged’)
どうしてもquery_postsやget_postsを使いたい場合はnext_posts_link()を使う前にグローバルのWP_Queryの値を別の変数に保存しておきましょう。詳しくはこちらなどが参考になると思います。
> コメント0件!書き込みのチャンス! <
 ̄Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y ̄