WordPressで独自のページネーションを作った場合、「どのように現在のページをの情報を保持して、次のページへデータを引き渡すのか」という部分を紹介します。
WordPressでは、query_postsの利用が非推奨となっており、get_postsの利用が推奨されています。
そのためページネーションを作成する時は、get_postsを利用したいところですが、get_postsではページネーションで必要な情報が取得できないのでget_postsに似ている関数「WP_Query」を使います。
取得できる内容の違い
- get_postsは、投稿記事のみ取得できる。
- WP_Queryは、投稿記事以外の関連データも取得できる(総ページ数など)。
ページネーションを作る時に、総ページ数などを取得することができるので、WP_Queryを使った方が便利です。
例:
$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);」の部分です。
ページネーションでは、現在ページ情報を$argsに設定している'paged' => $paged,で保持しています。
これによって、2ページ目以降のページをクリックした場合に、正しい記事を表示することができます。
これを設定しないと、ずっと1ページ目が表示されてしまいます。
WP_Queryでデータ取得することで、ページネーションで必要な総ページ数を簡単に取得できます。
関数が違うのであたりまえですが、get_postsでは下記の方法でも総ページ数を取得できません。
$max_page = $wp_query->max_num_pages;
以上、独自のページネーションを作る時には、WP_Queryを使いましょう。
記事をループする処理については、下記の記事も参考になります。