WordPressでカテゴリ階層をURLに反映させる方法

WordPressでカテゴリ階層をURLに反映させる方法

WordPressで投稿URLをカテゴリの階層(親カテゴリ・子カテゴリ)に基づいて生成したい場合、functions.phpファイルをカスタマイズする方法が必要です。以下の手順とコードを使って、カテゴリの階層を含んだ投稿のURLを実現できます。

1. パーマリンク設定の確認

まず、WordPressの「パーマリンク設定」を以下のように確認します。

  1. WordPress管理画面にログインします。
  2. 左メニューから「設定」 > 「パーマリンク設定」を選択します。
  3. 「カスタム構造」を選択し、以下のように設定します:
textコピーする編集する/%category%/%postname%/

これで、基本的に投稿のURLが次のような形式になります:

rubyコピーする編集するhttps://example.com/category/category-name/post-title/

ただし、この設定ではカテゴリ階層(親カテゴリと子カテゴリ)が反映されない場合があります。

2. カテゴリ階層を反映させるためのカスタマイズ

カテゴリ階層をURLに反映させるためには、functions.phpファイルにカスタムコードを追加する必要があります。これにより、投稿URLに親カテゴリと子カテゴリが反映されるようになります。

functions.php に追加するコード

以下のコードを、テーマの functions.php ファイルに追加します。このコードは、投稿が属するカテゴリの階層を取得し、投稿のURLに階層を反映させるためのものです。

function custom_category_permalink($url, $post) {
// 投稿が存在し、投稿タイプが 'post' の場合
if (is_object($post) && $post->post_type == 'post') {
// 投稿に関連するカテゴリを取得
$categories = get_the_category($post->ID);

if ($categories) {
$category = $categories[0]; // 最初のカテゴリを取得(必要に応じて変更可能)
$parent_cat = get_category($category->parent); // 親カテゴリを取得

// 親カテゴリがあれば、URLに親カテゴリを追加
if ($parent_cat->term_id) {
$url = str_replace(home_url(), home_url() . '/' . $parent_cat->slug, $url);
}
// 子カテゴリ(または最初のカテゴリ)をURLに追加
$url = str_replace(home_url() . '/category/', home_url() . '/category/' . $category->slug . '/', $url);
}
}
return $url;
}
add_filter('post_link', 'custom_category_permalink', 10, 2);

コードの詳細説明

  1. add_filter('post_link', 'custom_category_permalink', 10, 2);:
    • この行は、post_link フィルターフックにカスタム関数 custom_category_permalink を追加するものです。post_link は、投稿のURL(パーマリンク)を生成する際に呼び出されるフィルターです。
    • 10 はフィルターの優先度で、2 はフィルター関数に渡される引数の数です(ここではURLと投稿オブジェクト)。
  2. custom_category_permalink 関数:
    • get_the_category($post->ID) を使って、投稿に関連するカテゴリ情報を取得します。
    • 最初のカテゴリ(または任意のカテゴリ)を選択し、その親カテゴリ($category->parent)を取得します。
    • 親カテゴリが存在する場合、URLのhome_url()部分を親カテゴリのスラッグで置き換えます。
    • その後、最初のカテゴリのスラッグをURLに追加します。

例:カテゴリ階層のURL

例えば、親カテゴリが「company」で、子カテゴリが「product」の場合、投稿のURLは次のようになります:

https://example.com/category/company/product/post-title/

これにより、カテゴリ階層がURLに反映されます。

3. 注意点

  • 上記のコードを追加した後、パーマリンク設定を再保存することをお勧めします。これにより、変更が適用されることがあります。
  • カスタムURL構造を適用した後、旧URLへのリダイレクト設定を行うことを強くお勧めします。これにより、SEOの効果を維持し、ユーザーが古いリンクをクリックしても正しいページにリダイレクトされます。リダイレクトの設定には、Redirectionプラグインや、.htaccessの編集が役立ちます。

まとめ

  • WordPressの投稿URLにカテゴリ階層を反映させるためには、パーマリンク設定をカスタマイズするだけでなく、functions.phpファイルでカスタムコードを追加する必要があります。
  • add_filter('post_link', 'custom_category_permalink', 10, 2); は、投稿URLの生成時にカスタム関数を実行し、カテゴリ階層を反映させるために使用するフィルターフックです。
  • コードを追加することで、親カテゴリや子カテゴリを含むURLを作成することができます。