【WordPress】複数カテゴリを階層にしたパーマリンクを設定する方法
やりたいこと
例えば
- 東京支部 (tokyo)
- 関西支部 (kansai)
- ブログ (blog)
- お知らせ (news)
という4つのカテゴリがあって
投稿に「東京支部」「ブログ」の2つのカテゴリを設定したとき
何もしなければ、次のどちらかのパーマリンクになりますが
/tokyo/hello_tokyo/
/blog/hello_tokyo/
これをこのように、ディレクトリ階層のようにしたい、という話。 (東京支部のブログ、みたいな)
/tokyo/blog/hello_tokyo/
「関西支部」と「お知らせ」が設定されれば「/kansai/news/○○/」となるように
ちなみに
「ブログ」を「東京支部」の子カテゴリに設定すれば「/tokyo/blog/○○/」となりますが
「関西支部」の下にも「ブログ」を作ると、スラッグが重複するので「blog-kansai」となってしまうんですよね。
なので、強引にやるしかなさそう。
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行目で子にしたいカテゴリのスラッグを定義
現在の投稿に②と③のカテゴリが一つずつ設定されているとき
「/②/③/○○/」となるようにパーマリンクを変更します。
すると、パーマリンクが変わりました。
ページを更新するだけではURLは変わらなかったので、再度一覧などから開きましょう。
お役に立てましたら応援をお待ちしております!
頂いた応援は子育てに活用させていただきます。
または以下のボタンからなにか買って応援 (PR)
Amazon
楽天市場
Yahoo!ショッピング