5
12

More than 5 years have passed since last update.

【WordPress】カスタム投稿タイプにも対応しているページネーション用関数

Posted at

コード

functions.php

<?php
/**
* ページネーションHTML出力
*
* $limit      ページあたりの表示上限数
* $post_typed 投稿タイプのスラッグ
*/
function pagenation($limit = NULL, $post_typed = 'posts') {
    global $wp_rewrite;
    global $paged;
    global $wp_query;

    // 検索条件
    $query = array();
    if ($limit != NULL) {
        $query['posts_per_page'] = $limit;
    }
    if (count($query) != 0) {
        $wp_query->query($query);
    }

    $wp_query->query(array(
        'post_type' => $post_typed,
    ));
    $paginate_base = get_pagenum_link();

    if( strpos( $paginate_base, '?' ) || !$wp_rewrite->using_permalinks() ) {
        $paginate_format = '';
        $paginate_base = add_query_arg( 'paged', '%#%' );
    } else {
        $paginate_format = (substr( $paginate_base, -1, 1 ) == '/' ? '' : '/') . user_trailingslashit('page/%#%/','paged');
        $paginate_base .= '%_%';
    }


    if( $paged < 2 ) {
        $paged = 1;
    }
    $args = array(
        'base' => $paginate_base,
        'format' => $paginate_format,
        'total' => $wp_query->max_num_pages,
        'current' => $paged,
        'show_all' => false,
        'prev_next' => true,
        'prev_text' => '&laquo;',
        'next_text' => '&raquo;',
        'type' => 'array',
    );
    $pagenate_array = paginate_links($args);

    // 配列がある場合のみ
    if (is_array($pagenate_array) == TRUE) {
        $pagenate .= '<div class="wp-pagenavi">';
        foreach ($pagenate_array as $key => $value) {

            if (preg_match('/current/', $value) == TRUE) {
                $class = '';
            }
            else {
                $class = '';
            }

            // $value = "<span class=\"{$class}\">".$value.'</span>';
            // リンク追加
            $pagenate .= $value;
        }

        $pagenate .= '</div>';
        echo $pagenate;
    }
}
?>

ページネーションを使いたい場面で使おう。

  • 「カスタム投稿タイプtestに対してページネーションを作りたい場合」
<?php
pagenation($posts_per_page, 'test');
?>
  • 通常の使い方
<?php
pagenation($posts_per_page);
?>

そもそも

ページネーションのことをよく分かってなかった自分は、
カスタム投稿タイプと、通常の投稿タイプ(post_typeがpost)の両方に
同じ関数を使っていました。

投稿のペースがほぼ同じ場合には良いのですが、カスタム投稿タイプ用の設定無しだと、
当然post_typeがpostの投稿数に応じたページネーションが作成されるので、
カスタム投稿タイプのみの投稿一覧にそれを使っちゃうとおかしなことになってしまいます。

そこで

ページネーション用の関数に、

$wp_query->query($query);

を加えることで、ページネーション生成のための検索条件を指定します。($queryの部分に検索条件が入ります。)

検索条件を追加してオリジナルなページネーションにしよう

  • 指定したカテゴリーを検索条件に加えないようにする
functions.php
function pagenation($limit = NULL, $post_typed = 'post', $not_in_category = NULL) {

// 省略

    // 不要なカテゴリの指定
    if ($not_in_category != NULL) {
        $wp_query->query(array(
            'category__not_in' => $not_in_category,
        ));
    }

// 省略

ここでは、第三引数にcategory__not_inで指定できる値を入れることで、
それを検索条件に反映しています。

category__not_inに関してはこちら等をご覧ください。
query_posts(WP_Queryクラス)でカテゴリーを絞り込む – WordPress私的マニュアル

最後に

色んなパターンにおけるページネーション実装に遭遇した際に
あたふたしないようにしたいです( ;∀;)

5
12
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
12