フロントの人の雑多メモ

【WordPress】複数カテゴリを階層にしたパーマリンクを設定する方法

【WordPress】複数カテゴリを階層にしたパーマリンクを設定する方法

やりたいこと

例えば

  • 東京支部 (tokyo)
  • 関西支部 (kansai)
  • ブログ (blog)
  • お知らせ (news)

という4つのカテゴリがあって

WordPress 複数カテゴリ

投稿に「東京支部」「ブログ」の2つのカテゴリを設定したとき

WordPress 複数カテゴリ

何もしなければ、次のどちらかのパーマリンクになりますが

/tokyo/hello_tokyo/

/blog/hello_tokyo/

これをこのように、ディレクトリ階層のようにしたい、という話。 (東京支部のブログ、みたいな)

/tokyo/blog/hello_tokyo/

「関西支部」と「お知らせ」が設定されれば「/kansai/news/○○/」となるように

ちなみに

「ブログ」を「東京支部」の子カテゴリに設定すれば「/tokyo/blog/○○/」となりますが

WordPress 親カテゴリ

「関西支部」の下にも「ブログ」を作ると、スラッグが重複するので「blog-kansai」となってしまうんですよね。

WordPress 親カテゴリ

なので、強引にやるしかなさそう。

post_linkを使う

「post_link」というフックを使ってパーマリンクを変更します。

post_link | Hook | WordPress Developer Resources

functions.phpに以下を追記

//複数カテゴリのパーマリンクを階層化
function permalink_change_post($permalink, $post){
	//記事のカテゴリを取得し、スラッグを配列に格納
	$category = get_the_category($post->ID);
	$category_slug = array();

	foreach ($category as $cate){
		array_push($category_slug, $cate->slug);
	}

	//カテゴリその1
	$cate_arr1 = array('tokyo', 'kansai');
	//カテゴリその2
	$cate_arr2 = array('blog', 'news');

	//「記事のカテゴリ」と「カテゴリその1、2」の差分
	$diff_1 = array_intersect($cate_arr1, $category_slug);
	$diff_2 = array_intersect($cate_arr2, $category_slug);

	//カテゴリその1と2が一つずつ含まれるとき
	if(count($diff_1) === 1 && count($diff_2) === 1){
		//パーマリンクを階層に変更
		$permalink = home_url('/'.$diff_1[0].'/'.$diff_2[0].'/'.$post->post_name.'/' );
	}

	return $permalink;
}
add_filter('post_link', 'permalink_change_post', 10, 2);

ごちゃっとしてますが

①まず、現在の投稿のカテゴリを取得

②12行目で親にしたいカテゴリのスラッグを定義

③14行目で子にしたいカテゴリのスラッグを定義

現在の投稿に②と③のカテゴリが一つずつ設定されているとき

「/②/③/○○/」となるようにパーマリンクを変更します。

すると、パーマリンクが変わりました。

WordPress 投稿

ページを更新するだけではURLは変わらなかったので、再度一覧などから開きましょう。

WordPress 投稿を表示

コメント

内容を確認の上、個人情報などは省いて掲載させていただきます。

直接送信されます。確認の上、「送信」してください。

シェア

Twitterでシェア Facebookでシェア LINEでシェア はてなブックマークでシェア