技術

wordpressでカスタム投稿タイプとタクソノミーを作った時のURL設計

Pocket

Qiita WordPress Advent Calendar 2017の記事です。
公開がすごく遅くなって申し訳ない。

wordpressってイマイチURL設計に自由度がないのよね〜などと言われた時に「そんなことないもん」って言い返したいための、カスタム投稿タイプとカスタムタクソノミーを混ぜたURL設計のやり方です。

実際、カスタム投稿タイプやカスタムタクソノミーなどを作成した時に「あれ、このパーマリンクどうやって実現するんだっけ」ってなることがおおいにあることでしょう。
たとえば
カスタム投稿タイプ:animals
カスタム投稿タイプanimalのカスタムタクソノミー:animal-families
を作成したとしてお話を進めていきますよ。

カスタム投稿タイプとタクソノミーを作る

functions.phpに以下のように記載し、カスタム投稿タイプとカスタムタクソノミーを作成します。

animal-familiesは以下のようになっているとしよう。

  • felidae(ネコ科)
    • panthera(ヒョウ属)
    • felis(ネコ属)
  • canidae(イヌ科)
    • vulpes(キツネ属)
    • nyctereutes(タヌキ属)

(亜目とかのことはわすれてください)

期待するURL

カスタム投稿タイプanimalの記事は
/animals/%postname%
カスタム投稿タイプanimalsに紐づくカスタムタクソノミーanimal-familiesのアーカイブは
/animals/family/%term%
(なので、taxonomyのrewriteではslugにanimals/familyと記載)

このままではアクセスできない!

しかしこのままではanimal-familiesのアーカイブにアクセスはできないのです。
/animals/以下はカスタム投稿タイプの記事を探されてしまうから。

add_rewrite_ruleを追記して解決しよう

ここでfunctions.phpに以下の通り追記します。

add_rewrite_ruleを追記した後のお約束

add_rewrite_ruleを追記した後はこちらの関数を呼ぶ必要があります。
やり方としては2通り。
1. functions.php内でflush_rulesを実行する
2. 「設定」の「パーマリンク設定」で何も変更せずに「保存」をクリックする(内部でflush_rulesが呼ばれている)

1番は

みたいな使い方をします。しかし、flush_rulesは結構負担が大きい処理なので、前出の例ではinitという毎回呼ばれているfunctionに記載するのはやだなーということで今回は2番で書き換えしてます。
えっ、じゃあそもそもadd_rewrite_ruleってinitに書く必要あるの?いいえ、ないです。
本来はこんな感じで書くといいですね。前出は検証ってことでinitに書いちゃったっていうだけです。

flush後、アクセスして確認。

なんということでしょう。期待した通りのURLでアクセスできるではありませんか。

/animals/family/%term%
/animals/%postname%

カスタムタクソノミーをURLに入れ込みたい

この例の場合、キツネ属のアカギツネだからURLも
/animals/family/vulpes(%term%)/red_fox(%postname%)/
みたいな感じにしたいな〜という要望もあるかもしれない。

これらは、まあ実現できないこともないのです。
まずはrewrite_ruleをちょこっと追記します。

これで/animals/family/vulpes/red_foxにアクセスされた際のルーティングはOK

お次にリンク生成部分の処理に手を加えるべく、post_type_linkとpost_linkに以下の処理をadd_filterします。

これで/animals/family/vulpes/のアーカイブページにアクセスした際、ちゃんと期待したURLがリンクとして生成されています。
/animals/family/vulpes/red_fox/にアクセスすると

/animals/family/%term%/%postname%/

このように実現します。

もし複数のtermが紐づいていたら・・・とか考えると、あんまり実装するべきではないのかなー、と思いますが。

Pocket

mm

作成者: ぴーやま

なんとかエンジニア。忘れっぽいのでブログにメモをしている。 最近、一番好きな食べ物は汁物に浮いているたまごなんじゃないかなぁと思ってきた。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です