WordPress 固定ページのページ送りをいぢる


やりたいこと

こんなカンジで各ページに手動でOrderをセットする

  • page1000 (order: 1000)
    • page1001 (order: 1001)
    • page1002 (order: 1002)
  • page2000 (order: 2000)

 

page1001を開くと、ページ下部に

<- page1000                   page1002 ->

とページ送りが設置されている。

 

 

やる

いくつかのテーマをながめてみると、下記2つのファンクションで実装されていることがわかった。

previous_post_link(…)

next_post_link(…)

中を追っていくと、両方ともget_adjacent_post(…)を呼んでおり、うまいことfilterなるものを設定すれば挙動を変えられそうな気がする。

 

 

テーマ hueman (3.3.2)の場合

注:get_adjacent_postの引数で$post(及び$taxonomy)が指定できるのはWordPress4.4.0から
なのでそれ以前はglobalのpostを使用する必要あり

Child Theme Configuratorというのを使って子テーマ(hueman-child)を作成

wp-content/themes/hueman-child
├── functions.php    <- 自動で作成される。ここにフィルターを定義する。
├── page.php    <- このテーマの固定ページにはページ送りが無いので、親テーマからコピーして変更
├── parts
│   └── post-nav.php    <- 投稿の場合ここでページ送りを作成しているので、固定ページ用の処理を追加
├── screenshot.png
└── style.css

実験として、同じ親ページを持つページだけを送りの対象にした。
(post_parentを指定)

 

13行目を追加

 

3, 4行目でxxx_post_linkのお尻の引数をtrueにした。(投稿のページ送りを同カテゴリーに制限)

6-16行目で固定ページ用のフィルターをセット

 

下記の用に表示
投稿ページ:同カテゴリー制限、投稿時刻昇順
固定ページ:同親ページ制限、Order(menu_order)昇順

 

 

テーマ customizr (3.4.36)の場合

注:get_adjacent_postの引数で$post(及び$taxonomy)が指定できるのはWordPress4.4.0から
なのでそれ以前はglobalのpostを使用する必要あり

customizrの場合、固定ページのページ送りがサポートされており、UIからオプションをONにする。

ただ、このままだと固定ページのソートが投稿時刻になっているので、Order(menu_order)に変更する。

さっきhuemanで実装した”投稿のページ送りを同カテゴリーに制限”について

  • Restrict the post navigation to the same category
    を見るとtc_previous_single_post_link_args、tc_next_single_post_link_argsという引数を定義すると制御できるように書いてあるけど、呼び出し元のczr-front.phpで前後投稿の存在判定をこの引数と関係なく行っているので、下記のように空のボタンが表示されてしまう。
  • czr-front.phpは結構でかいファイルなのでいぢりたくない
  • 同カテゴリーに縛らなくていい気がしてきた

ので、投稿ページはそのまま(同カテゴリー制限なし)、固定ページも同親ページ制限は実装せず、ソートのみOrder順に変更する。

 

Child Theme Configuratorというのを使って子テーマ(customizr-child)を作成

wp-content/themes/customizr-child
├── functions.php   <- 自動で作成される。ここにフィルターを定義する。
├── screenshot.png
└── style.css

8行目のtc_show_post_navigationは、czr-front.php内部のページ送り作成処理から呼び出してもらうため。

 

下記の用に表示
投稿ページ:投稿時刻昇順(デフォルトのまま)
固定ページ:Order(menu_order)昇順

 

Leave a comment

Your email address will not be published. Required fields are marked *