多階層のカテゴリを表現したURLを実現する方法【WordPress】

最終更新日: 公開日: 2023年12月

WordPress などの CMS を使わないでホームページを作成するとカテゴリの分類と同じように多階層でディレクトリ(フォルダ)を作って,多階層のディレクトリ構造になった URL になっているケースが多いだろう.

そして,リニューアル時に WordPress を使って,色々便利な機能を享受したいと思うことは多いはずだが,CMS を使わずに静的に作っていたサイトの URL が同じにならないケースが多い.

WordPress における URL

URLでカテゴリーの階層を重ねる方法

それは WordPress が標準では URL を作る際にカテゴリは階層で重ねることが出来ないからである.
例えば,Aというカテゴリの下にBというカテゴリを作って,その下にCという投稿記事がある場合,パンくずリストは

ホーム > A > B > C
となるので,
https://www.xxxxxx.com/a/b/c.html
としたいが,WordPress で普通に作ると
https://www.xxxxxx.com/b/c.html
となってしまう.

つまり,カテゴリが親子関係にあっても親のカテゴリしか URL には出てこない.

なるべく同じ階層構造をとりたい場合にプラグインを使わずに functions.php だけで何とかする方法を備忘録として書いておく.

コード

まず,複数階層のカテゴリに属する記事のパーマリンクを変更する部分は以下のようになる.

// カテゴリを祖先まで遡って,url の一部を返す.
function get_catdir($cat){
  if (!$cat->parent) {
    return '/' . $cat->slug;
  }
  $arrAncestor = array_reverse(get_ancestors($cat->term_id, 'category'));
  $cat_dir = '';
  foreach($arrAncestor as $catans) {
    $cat_dir .= '/' . $catans->slug;
  }
  return $cat_dir;
}

投稿ページの拡張子を html とするコードは以下のようになる.

// 拡張子 .html を付加
function custom_post_permalink ($post_link, $post) {
  if (!empty($post->ID)) {
    if (is_single()) {
      // カテゴリを取得
      $cat = get_the_category()[0];
      $cat_dir = get_catdir($cat);
      return home_url() . $cat_dir . '/' . $post->post_name . '.html';
    }
  }
  return $post_link;
}
add_filter('post_type_link', 'custom_post_permalink', 10, 2);
add_filter('post_link', 'custom_post_permalink', 10, 2);

カテゴリーの選択をチェックボックスからラジオボタンに変更

ただし,これを正しく動作させるためには一つの投稿ページ(記事)が複数カテゴリーに含まれてはいけない.
なので,複数カテゴリに登録できないようにする必要がある.

のページが参考になるが,これは jQuery を使って書かれているので,jQuery をオフにしているサイトでは使えない.
そこで,javascript で動くように書き直してみた.
function my_admin_print_footer_scripts() {
?>
<script>
  // カテゴリーをラジオボタンに変更
  var matches = document.querySelectorAll('#categorychecklist input[type=checkbox]');
  matches.forEach(function(item) {
    item.setAttribute("type", "radio");
  });
  // 「新規カテゴリーを追加」を非表示
  document.getElementById('category-adder').style.display = 'none';
  // 「カテゴリー一覧」「よく使うもの」を非表示
  document.getElementById('category-tabs').style.display = 'none';
</script>
<?php
}
add_action('admin_print_footer_scripts', 'my_admin_print_footer_scripts');

カテゴリー選択時に先頭に移動してしまうのを防ぐ方法

さらにこれでもまだ選択したものが先頭に来るので使いにくい.
以下のページのコードをそのまま拝借させていただいた.

// 選択したターム・カテゴリーが先頭に来ないように固定
function my_wp_terms_checklist_args($args){
  $args['checked_ontop']=false;
  return $args;
}
add_action('wp_terms_checklist_args','my_wp_terms_checklist_args');

パーマリンク設定

設定→パーマリンク設定を変更する必要がある.

「カスタム構造」を選択し,

/%category%/%postname%.html

とする.
さらに,オプションのカテゴリーベースに . を入れると URL に category が入らなくなる.

 

Contact

ご質問等ありましたら,お手数ですが弊社の個人情報保護方針をお読み頂いた上でフォームからお願い致します.

 
   
contact
Pagetop