WordPressのカスタム投稿でarchive内ページネーションを作る方法

予想以上にドはまりしてもう一生やりたくないよ!ってくらいやりたくないのでここでまとめておきますw

相当ごりごりっと解決してしまったのでもっとスマートにやりたかったんですが、色々検索して出てきたものがことごとくうまくいかなかったのでしょうがないです・・・

流れとしては、

  • $wp_queryを一時保存して、新たにWP_Queryクラスのインスタンスを$wp_queryに上書きする形で作る
  • GETの値を調べる(ページが今何ページか調べる)
  • ページネーションの関数で出力する
  • $wp_queryを元に戻す

なぜ$wp_queryを上書きするかというと、デフォルトで多くの関数が$wp_queryを使用して関数の出力を行っているためです(まぁglobalなんでね)

実行環境としては

  • PHP 5.4.24
  • WordPress 3.6.1

それでは以下コードになります。

functions.php

function bmPageNavi() {
  global $wp_rewrite;
  global $wp_query;
  global $paged;

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

  $result = paginate_links( array(
    'base' => $paginate_base,
    'format' => $paginate_format,
    'total' => $wp_query->max_num_pages,
    'mid_size' => 5,
    'current' => ($paged ? $paged : 1),
  ));

  return $result;
}

 

archive.php

 2,
    'paged' => $paged,
    'post_type'      => your_post_type,
    'orderby'        => 'post_date',
    'order'          => 'DESC'
);
$wp_query->query($param); 

get_header(); ?>
    have_posts() ) : ?>
        have_posts() ) : $wp_query->the_post(); ?>
  
    

 

これで自分の場合ちゃんと動きました!

最後に

WordPressでもよくあるだろうページネーションでこんなに大変な思いをするとは思ってませんでした。
でももともとページネーションは複雑ですししょうがないですよね。最終的にどうにかなってよかったです。

WordPressレッスンブック HTML5&CSS準拠
エビスコム
ソシム
売り上げランキング: 10,185