Help us understand the problem. What is going on with this article?

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

More than 1 year has passed since last update.

コード

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私的マニュアル

最後に

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

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした