WordPressのパーマリンク設定でカテゴリーを追加している場合
カテゴリーを階層化するとURLが意外と長くなる
パーマリンク設定でカテゴリー名を含む設定にしていると、いろいろとトラブルというか、余計な部分に気を使う必要が生じる。そのため、カテゴリ名をURLに含む設定をすることはおすすめできない。
上の画像は、おなじみのパーマリンク設定の画面になりますが、カスタム構造として、
/%category%/%postname%.html
を設定しています。本記事は、このパーマリンク設定をしていることを前提にした記事です。
なお、個人的におすすめのパーマリンク設定は、
/%postname%.html
になります。
カテゴリの階層化
階層化するとURLも階層化される
パーマリンク設定でカテゴリ名をURLに含む設定した状態で、カテゴリを階層化してみました。
[ネットショップ]というカテゴリを作成し、その子カテゴリとして[本]カテゴリを作成したのが上の画像の状態です。
この状態で[本]カテゴリに記事を作成します。URLは、
wp40ja.local/netshop/book/book.html
となりました。
wp40ja.local/book/book.html
になることを期待していましたが、標準では、カテゴリ階層が反映されたURLになります。
さすがWordPress
しかし、URLを直打ちして確認してみたところ
wp40ja.local/book/book.html
でも問題なくアクセスできることが分かりました。
ただし、
wp40ja.local/netshop/book/book.html
へリダイレクトされる上に、HTMLのheadに出力されるcanonical属性が階層化されたURLで出力されていました。
1 | < link rel = 'canonical' href = 'http://wp40ja.local/netshop/book/book.html' /> |
課題
課題を整理すると、
- 記事が属するカテゴリ名のみでURLを構成したい
- リダイレクトせずにダイレクトにレスポンス200が返るようにしたい
- 記事URLだけでなくカテゴリURLもフラットにしたい
- ページに表示されるリンクをすべてフラットにしたい
という感じになります。
WordPressのフィルターフックを使えば、これらの課題を解決することが可能です。
post_linkフィルターフックで解決
基本
post_linkフィルターフックと処理を関連付けることで、パーマリンクをカスタマイズすることが出来ます。
1 2 3 4 5 | function permalink_change_post( $permalink , $post , $leavename ) { return $permalink ; } add_filter( 'post_link' , 'permalink_change_post' , 10, 3 ); |
$permalinkをreturnする前に、値を調整することになります。
カスタマイズ
具体的な使い方は以下の通りです。
事前にカテゴリ情報を取得し、親カテゴリが存在する場合のみ$permalinkをカスタマイズするコードになります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | function permalink_change_post( $permalink , $post , $leavename ) { // 記事が属するカテゴリと親カテゴリを取得 $category = get_the_category( $post ->ID); $parent = get_category( $category [0]->parent); // 親カテゴリが存在する場合は、フラットなURLにカスタマイズ if ( empty ( $category [0]->parent) === false ) { $permalink = home_url( '/' . $category [0]->slug. '/' . $post ->post_name. '.html' ); } return $permalink ; } add_filter( 'post_link' , 'permalink_change_post' , 10, 3 ); |
レスポンスコードを確認
上の画像で確認できますが、
- リダイレクトされることなくフラットなURLでアクセスできること
- 200がレスポンスされること
が確認できます。
また、
- ページ内のリンクURLがフラットになる点
- canonical属性のURLもフラットになる点
も確認できました。
category_linkフィルターフック
post_linkフィルターフックでURLをフラット化しても、ページ内のカテゴリURLは階層化されたままリンクが貼られていました。
wp40ja.local/category/netshop/book
ではなく、
wp40ja.local/category/book
でアクセスできるようにしたいといった要件になります。
カテゴリのリンクURLをカスタマイズする場合には、
category_linkフィルターフック
を利用して調整することが可能です。
1 2 3 4 5 6 7 8 9 10 11 12 | function permalink_change_category( $permalink , $post ) { // パーマリンクにnetshopという文字列が含まれる場合、その部分を削除してURLをフラット化 if ( strpos ( $permalink , 'netshop' ) ) { $permalink = str_replace ( array ( "netshop/" ), '' , $permalink ); } return $permalink ; } add_filter( 'category_link' , 'permalink_change_category' , 11, 2 ); |
パーマリンク設定でカテゴリを含む状態にしてあっても、フィルターフックを使ってURL構造をフラット化することが出来ます。