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で出力されていました。
<link rel='canonical' href='http://wp40ja.local/netshop/book/book.html' />
課題
課題を整理すると、
- 記事が属するカテゴリ名のみでURLを構成したい
- リダイレクトせずにダイレクトにレスポンス200が返るようにしたい
- 記事URLだけでなくカテゴリURLもフラットにしたい
- ページに表示されるリンクをすべてフラットにしたい
という感じになります。
WordPressのフィルターフックを使えば、これらの課題を解決することが可能です。
post_linkフィルターフックで解決
基本
post_linkフィルターフックと処理を関連付けることで、パーマリンクをカスタマイズすることが出来ます。
function permalink_change_post( $permalink, $post, $leavename ) { return $permalink; } add_filter( 'post_link', 'permalink_change_post', 10, 3 );
$permalinkをreturnする前に、値を調整することになります。
カスタマイズ
具体的な使い方は以下の通りです。
事前にカテゴリ情報を取得し、親カテゴリが存在する場合のみ$permalinkをカスタマイズするコードになります。
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フィルターフック
を利用して調整することが可能です。
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構造をフラット化することが出来ます。