コード
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' => '«',
'next_text' => '»',
'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私的マニュアル
最後に
色んなパターンにおけるページネーション実装に遭遇した際に
あたふたしないようにしたいです( ;∀;)