WordPress記事一覧をカテゴリタグ別に取得する方法、2ページ以降にも対応。

WordPress記事一覧をカテゴリタグ別に取得する方法、2ページ以降にも対応。

リクエストにはWP_Queryを使用します。

query_posts()get_posts()を使ってメインループを絞り込む方法では

next_posts_link()previous_posts_link()で期待しない結果が返ってくることがあると思います。

pre_get_postsを使う方法もありますが、特定のページ(フロントページ以外)で使用できない場合もあるのでWP_Queryを使います。

 

  1. 関数(発火点)を設置する。
  2. 関数を設定する。
  3. 番号付きページャーをつける。(ページネーション)

 

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の値を別の変数に保存しておきましょう。詳しくはこちらなどが参考になると思います。

₍ ᐢ. ̫ .ᐢ ₎マダナイ

コメントを残す

メールアドレスが公開されることはありません。

内容をご確認の上、送信してください。URLを含むコメントは承認待ちになります。