WordPressのWP_Query(get_posts)でループした時のページネーションへのデータ引継ぎ方

2018年10月13日

当サイトはアフィリエイト広告を利用しています。

WordPressで独自のページネーションを作った場合、「どのように現在のページをの情報を保持して、次のページへデータを引き渡すのか」という部分を紹介します。

WordPressでは、query_postsの利用が非推奨となっており、get_postsの利用が推奨されています。

そのためページネーションを作成する時は、get_postsを利用したいところですが、get_postsではページネーションで必要な情報が取得できないのでget_postsに似ている関数「WP_Query」を使います。

取得できる内容の違い

  • get_postsは、投稿記事のみ取得できる。
  • WP_Queryは、投稿記事以外の関連データも取得できる(総ページ数など)。

ページネーションを作る時に、総ページ数などを取得することができるので、WP_Queryを使った方が便利です。

それぞれ取得したデータをvar_dumpしてみるとわかりやすいです。
例:
$myposts = new WP_Query($args);
var_dump($myposts);
$myposts = get_posts($args);
var_dump($myposts);
※$argsは下記を参考に値設定が必要。

それぞれの関数は、下記のような使い分けをするといいです。

  • get_postsは、ページネーションが必要ないランキングトップ10など。
  • WP_Queryは、ページネーションが必要あるページなど。

WP_Queryで独自ページネーションを使ったサンプルコード

記事一覧を表示して、その下にページネーションを表示するためのサンプルコードです。

get_postsだと、記事一覧の取得はできますが、総ページ数が取得できないので、ページネーションの作成が難しいです。

// 設定
// 取得、20記事
// 日付、ソート
// 日付、降順
// ポストタイプ、postやカスタム投稿タイプなど
$def['posts_per_page'] = 20;
$def['orderby'] = 'date';
$def['order'] = 'DESC';
$def['post_type'] = 'カスタム投稿など';	

$args = array(
  'paged' => $paged,//このパラメータを設定。現在のページを判定。2ページ以降で正しい記事を表示するため。
  'posts_per_page' => $def['posts_per_page'],
  'orderby' => $def['orderby'],
  'order' => $def['order'],
  'post_type' => $def['post_type'],
);

//ポストデータ取得
//WP_Queryでデータ取得すると総ページ数を取得できる。
//get_posts()だと取得できない・・・。
$myposts = new WP_Query($args);

//以下、取得したデータの処理
if($myposts->have_posts()) {

  //記事のループ処理whileにあたる部分
  foreach($myposts->posts as $post){
    //$post->ID
    //でポストIDが取得できます。
    //カスタムフィールドを取得したい場合
    //get_post_meta($post->ID, 'カスタムフィールド名', true);
  }

  //ページネーション
  if (function_exists("pagination")) {
    $max_page = $myposts->max_num_pages;  //WP_Queryでデータ取得すると総ページ数を取得できる。
    pagination($max_page);  //ページネーションのfunction(関数)
  }
}

wp_reset_query();

ページネーションの関数とCSSは、下記のサイトのものを利用すれば完成します。
※上記のサンプルコードの「pagination($max_page);」の部分です。

ページネーション
https://wemo.tech/978

ページネーションでは、現在ページ情報を$argsに設定している'paged' => $paged,で保持しています。

これによって、2ページ目以降のページをクリックした場合に、正しい記事を表示することができます。

これを設定しないと、ずっと1ページ目が表示されてしまいます。

WP_Queryでデータ取得することで、ページネーションで必要な総ページ数を簡単に取得できます。

関数が違うのであたりまえですが、get_postsでは下記の方法でも総ページ数を取得できません。

global $wp_query;
$max_page = $wp_query->max_num_pages;

以上、独自のページネーションを作る時には、WP_Queryを使いましょう。

記事をループする処理については、下記の記事も参考になります。

ループで記事を取得・表示する
WordPressで、WP_Query(get_posts)で記事一覧を表示する。

-ワードプレス
-, ,