今日はカスタム投稿のページング機能に大苦戦した。
それでなくても健康診断でバリウム飲んだせいで、お腹の調子悪いっていうのに。

今回のページング機能については、今日のワークでざっくり書いてみます。
同じことで悩んでる人がいたら役に立つかも。
ちなみに、ネット上にはズバリどころかニアの記事もなかったので、かなり苦戦した。

今日のやったこと、できたこと

  • 健康診断
  • カスタム投稿一覧のページング機能
  • 読書

明日への課題

  • 日曜日の準備
  • データ増やす時の効率いい方法
  • PPC広告の準備

今日のワーク

今日はあっさり終われると思ったページング機能に大苦戦。
結局解決に3時間くらい掛かった。

しかも、原因と解決方法がネットに情報全然なくて。解決方法もすげー強引なので、もっとスマートな方法を知っている人がいたら是非教えて欲しい次第です。

今回、ページング機能を実装したのはカスタム投稿の一覧ページ(archive)。
しかも、読み込むテーブルがwp_postsではなく、独自テーブルっていうのがキモだった。

なんでこんなことしているのか説明すると、まずオリジナルの項目を作りたかったのと、データ件数が多いのでCSVでデータを流し込みたかった。でも、postmetaを使うと無駄にサーバ負荷かかるしって理由。ワードプレス固有のテーブル汚したくなかった。

独自テーブルには100件以上データが入っていて、1ページに30件表示なので、ページにして4ページになる。
ここは問題なく値も取れているし、ページネーションも出力されていた。

しかし、2ページ目以降をクリックして開こうとすると、404ページにリダイレクトされてしまう。
この原因をネットで調べていたら、URLを正しく認識できていないといった記事が多かった。

自分もそのパターンかと思って調べてみたりプログラムいじったりしていたんだけど、どうやっても2ページ目が表示されない。
つまり、2ページ目は存在していないってことっぽい。

悩んだ挙句、よくよく考えてみると、archive.phpは基本的にpostsテーブルを見に行ってるってこと。
つまり、カスタム投稿用のテンプレートである以上、自動的にpostsのカスタム投稿をselectして、その結果で表示を切り替えていることに気づいた。気づいてみたら当たり前のことなんだけど。

で、対象のカスタム投稿を見ると1件しか存在していない。つまり2ページ目以降は存在しない。
ちなみに、対象データが0件でも1ページ目は存在するので404にリダイレクトはされない、2ページ目以降だけ起こるリダイレクトになる。

しかし、このpostsを見に行く部分を変更する手段がわからない。
remove_actionすればいいかなと思ったんだけど、その後の処理もあるだろうからどの処理を削除すべきなのか答えが見つけられなかった。

そこで出した今回の強引な答えが、とりあえず表示結果が1件でもあればいいだろうってこと。
ページングで言えばOFFSETの設定。常にOFFSETを0にして投稿を1件しておけば常に検索結果は1になる。

ここで使ったフックが「pre_get_posts」。
このsetできるパラメータにはワードプレスの公式サイトには書いてなかったんだけど、実は「offset」というパラメーターがあるっていうのを見つけた。なので、これに常に0を設定すればOKだった。コード的にはこんな感じ。

function my_pagenation_reset($query) {
  if ( !is_admin() && $query->is_main_query() ) {
    if ($query->is_post_type_archive("xxxxx")) {
      $query->set( 'offset', 0 );
    }
  }
}
add_action( 'pre_get_posts','my_pagenation_reset' );

細かいところは各自でカスタマイズしてもらえれば。
しかし、こんな強引な方法以外でないものだろうか。いい方法知ってたら教えてください。