URLのカテゴリ階層をカスタマイズしてフラットなURLにする

WordPressのパーマリンク設定でカテゴリーを追加している場合

カテゴリーを階層化するとURLが意外と長くなる

パーマリンク設定でカテゴリー名を含む設定にしていると、いろいろとトラブルというか、余計な部分に気を使う必要が生じる。そのため、カテゴリ名をURLに含む設定をすることはおすすめできない。

category-postname

上の画像は、おなじみのパーマリンク設定の画面になりますが、カスタム構造として、

/%category%/%postname%.html

を設定しています。本記事は、このパーマリンク設定をしていることを前提にした記事です。

なお、個人的におすすめのパーマリンク設定は、

/%postname%.html

になります。

カテゴリの階層化

階層化するとURLも階層化される

パーマリンク設定でカテゴリ名をURLに含む設定した状態で、カテゴリを階層化してみました。

category-hierarchy

[ネットショップ]というカテゴリを作成し、その子カテゴリとして[本]カテゴリを作成したのが上の画像の状態です。

この状態で[本]カテゴリに記事を作成します。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 WordPress Codex

基本

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 );

レスポンスコードを確認

http-status-200

上の画像で確認できますが、

  • リダイレクトされることなくフラットな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構造をフラット化することが出来ます。

Webエンジニアブログにコメント

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

URLのカテゴリ階層をカスタマイズしてフラットなURLにするの記事にコメントを投稿

カスタマイズ