「Simplicity2」で子カテゴリー一覧ページの<title>に「functions.php」を修正して親カテゴリー名も表示!

「Simplicity2」で子カテゴリー一覧ページの<title>に「functions.php」を修正して親カテゴリー名も表示!

「ページタイトルに親カテゴリー名も出したい」という依頼

久々にWordPressのカスタマイズの話。

万が一の事が起こっても責任は持てません。あくまでの自己責任で。

Simplicity2 (バージョン 2.6.0.9)」のテーマを使ったWordPressのサイトで、子カテゴリーの一覧ページに親カテゴリーの名前も表示したいという相談があった。

ページの構成は概ね以下の通り(フェイク入り)で、子カテゴリーの名前がそれぞれダブっている状況。

  • AAA出版
    • ミステリー
    • SF・ファンタジー
    • ホラー
    • 時代小説
  • BBB出版
    • ミステリー
    • SF・ファンタジー
    • ホラー
    • 時代小説
  • CCC出版
    • ミステリー
    • SF・ファンタジー
    • ホラー
    • 時代小説

Simplicity2のデフォルトのままだと、例えば「SF・ファンタジー」カテゴリーの一覧ページは、下記のようにAAA出版、BBB出版、CCC出版のいずれも同じ<title>が出力される。
※「 | 」右記のサイト名の表記はSimplicity2の設定による。

  <title>SF・ファンタジー | サイト名</title>

そこで、親カテゴリーを持つ子カテゴリーに関しては、「<title>に親カテゴリー名も表記したいなぁ~、SEOのためにも」という事だ。

まずは「Simplicity2」のサポートページにアクセス。すると、そのものずばりの質問がフォーラムにあり、もちろん期待して見たところ…。

カテゴリーページのタイトルについて | Simplicity

親カテ名=A 子カテ名=B
とした時に子カテページのタイトル表示を「A-B」のように表示できますでしょうか?

<中略>   

ただ、サポート対象外のものにもあるように、基本的にPHPのカスタマイズ方法までは、サポートしていないので、処理は自前でお願いします。

残念! ヒントはあったが「カスタマイズは自分でしてね」という事でだったので、そのヒントを基に色々と試行錯誤してみた。

作成の手順をざっくりと説明

functions.phpの修正

原本となるfunctions.phpのバックアップを必ず取り、まずは“ヒント”どおりに以下の文言をfunctions.phpにコピペする。

function simplicity_title_parts( $title ){
  $site_name = trim( get_bloginfo('name') );
  $title['tagline'] = '';

  if(is_front_page()): //フロントページ
    $title['title'] = $site_name;
    $title['site'] = '';
    if ( is_catch_phrase_to_frontpage_title() )://キャッチフレーズを追加する場合
      $title['tagline'] = trim( get_bloginfo('description') );
    endif;
  elseif(is_singular()): //投稿・固定ページ
    $title['title'] = trim( get_the_title() );
    //SEO向けのタイトルが設定されているとき
    if (get_seo_title_singular_page()) {
      $title['title'] = get_seo_title_singular_page();
    }
    $title['site'] = '';
    if ( is_site_name_to_singular_title() )://サイト名を追加する場合
      $title['site'] = $site_name;
    endif;
  // elseif(is_404()):
  //   $title['title'] = trim( get_theme_text_not_found_title() );
  //   $title['site'] = $site_name;
  endif;

  return $title;
}

続いて、この基になるコードには、カテゴリーページに関する記述がないので以下の部分にカテゴリーの一覧ページに関する記述を追記する(まぁ、コメントは別になくてもいいんだけど、分かりやすいようにしておく)。

function simplicity_title_parts( $title ){
  $site_name = trim( get_bloginfo('name') );
  $title['tagline'] = '';

  if(is_front_page()): //フロントページ
    $title['title'] = $site_name;
    $title['site'] = '';
    if ( is_catch_phrase_to_frontpage_title() )://キャッチフレーズを追加する場合
      $title['tagline'] = trim( get_bloginfo('description') );
    endif;
  elseif(is_singular()): //投稿・固定ページ
    $title['title'] = trim( get_the_title() );
    //SEO向けのタイトルが設定されているとき
    if (get_seo_title_singular_page()) {
      $title['title'] = get_seo_title_singular_page();
    }
    $title['site'] = '';
    if ( is_site_name_to_singular_title() )://サイト名を追加する場合
      $title['site'] = $site_name;
    endif;
  // elseif(is_404()):
  //   $title['title'] = trim( get_theme_text_not_found_title() );
  //   $title['site'] = $site_name;
// -- [ ▼ カテゴリー関連の記述を以下に追記 ▼ ] --------------



// -- [ ▲ カテゴリー関連の記述を以上に追記 ▲ ] --------------
  endif;

  return $title;
}

結論を先に書くと、以下の記述を追記すればOK(のはず)。

  elseif(is_category()):
    $cat_info    = get_queried_object();
    $cat_name    = $cat_info->cat_name;
    $cat_parent  = $cat_info->parent;
    $current_cat = $cat_info->cat_ID;
    if (!$cat_parent) {
      $title['title'] = $cat_name;
    } else {
      $ancestor = array_pop(get_ancestors( $current_cat, 'category' ));
      $title['title'] = get_cat_name($ancestor) .'「'. $cat_name .'」';
    }
    $title['site'] = '';
    if ( is_site_name_to_singular_title() )://サイト名を追加する場合
      $title['site'] = $site_name;
    endif;

「Simplicity2」のブラウザから見える部分は名前どおりシンプルだが、内部はかなりこだわり抜いて細かく変更されているため、素人に毛の生えた自分が下手にいじってグチャグチャにしては元も子もないので、不要と思えるようなところも敢えて残してある。

完成形は以下の通り。

function simplicity_title_parts( $title ){
  $site_name = trim( get_bloginfo('name') );
  $title['tagline'] = '';

  if(is_front_page()): //フロントページ
    $title['title'] = $site_name;
    $title['site'] = '';
    if ( is_catch_phrase_to_frontpage_title() )://キャッチフレーズを追加する場合
      $title['tagline'] = trim( get_bloginfo('description') );
    endif;
  elseif(is_singular()): //投稿・固定ページ
    $title['title'] = trim( get_the_title() );
    //SEO向けのタイトルが設定されているとき
    if (get_seo_title_singular_page()) {
      $title['title'] = get_seo_title_singular_page();
    }
    $title['site'] = '';
    if ( is_site_name_to_singular_title() )://サイト名を追加する場合
      $title['site'] = $site_name;
    endif;
  // elseif(is_404()):
  //   $title['title'] = trim( get_theme_text_not_found_title() );
  //   $title['site'] = $site_name;
// -- [ ▼ カテゴリー関連の記述を以下に追記 ▼ ] --------------
  elseif(is_category()):
    $cat_info    = get_queried_object();
    $cat_name    = $cat_info->cat_name;
    $cat_parent  = $cat_info->parent;
    $current_cat = $cat_info->cat_ID;
    if (!$cat_parent) {
      $title['title'] = $cat_name;
    } else {
      $ancestor = array_pop(get_ancestors( $current_cat, 'category' ));
      $title['title'] = get_cat_name($ancestor) .'「'. $cat_name .'」';
    }
    $title['site'] = '';
    if ( is_site_name_to_singular_title() )://サイト名を追加する場合
      $title['site'] = $site_name;
    endif;
// -- [ ▲ カテゴリー関連の記述を以上に追記 ▲ ] --------------
  endif;

  return $title;
}

追記した内容の説明

なんかはじめて見るコードが多いw

参考ページは下記、というかそのものをほぼコピペした感じ。有り難うございます。

ここでウダウダ説明するよりも、リンク先のサイト様を見た方が十倍ためになると思うw

一応、コメントを追加してみる。

// -- [ ▼ カテゴリー関連の記述を以下に追記 ▼ ] --------------
  elseif(is_category()):
    $cat_info    = get_queried_object();
    $cat_name    = $cat_info->cat_name;  //現在表示しているカテゴリーの名称
    $cat_parent  = $cat_info->parent;    //親カテゴリーのIDが入り、親カテゴリーであれば「0」
    $current_cat = $cat_info->cat_ID;    //現在表示しているカテゴリーのID
    if (!$cat_parent) {
      $title['title'] = $cat_name;
    } else {
      $ancestor = array_pop(get_ancestors( $current_cat, 'category' ));
      $title['title'] = get_cat_name($ancestor) .'「'. $cat_name .'」';
    }
    $title['site'] = '';
    if ( is_site_name_to_singular_title() )://サイト名を追加する場合
      $title['site'] = $site_name;
    endif;
// -- [ ▲ カテゴリー関連の記述を以上に追記 ▲ ] --------------

上記コードの2行目で「カテゴリー」ページだったらという分岐をかけている。

  elseif(is_category()):

3行目~6行目までは「get_queried_object」で取得したものを各変数に代入している。表記がキャメルケースからスネークケースになっているのは、Simplicity2の表記に合わせたためで、それ以外に特に意味は無い。

5行目については、少々補足しておく。表示されているページが子カテゴリーページであれば、素直にカテゴリーIDが代入されるが、このページが親ページであった場合は、カテゴリーIDの如何を問わず「0」が代入される事になる。

で、下記7行目については、なぜこの表記でいいのか分からなかったが、以下のページを読んで、何となく分かった感じ。

    $cat_parent  = $cat_info->parent;

isset関数とempty関数と「!」の違い – PHPプログラミングの教科書 [php1st.com]

よくわからない構文かもしれませんが「if (!$value)」は「if ($value == false)」のことなので、falseに評価される変数を「空っぽ」だと判断している仕組みです。中身が空の場合も含めて数字の0もfalseに評価されるので、結局はempty関数と同じ動作のようになります。
「!」は「0」を空だと判断する

つまり、当該カテゴリーが親カテゴリーであるならば、「$cat_parent」には「0」が代入されているため、空だと判断されて親カテゴリーの名称が出力されるというわけ(う~ん、分かったようで分からんかもw)。

で、10、11行目は、現在表示されているページが「子カテゴリー」だった場合の挙動で、10行目の記述で配列の一番最後の値であるカテゴリーID、つまり親カテゴリーのIDを取得し、11行目の「get_cat_name($ancestor)」部分で取得したIDを基にカテゴリー名を出力する指示をしている。

      $ancestor = array_pop(get_ancestors( $current_cat, 'category' ));
      $title['title'] = get_cat_name($ancestor) .' 「'. $cat_name .'」';

尚、11行目の後半部分は子カテゴリー名を“「」”で括った様式で出力するための記述。この場合、以下の文字列が出力される。

  <title>AAA出版 「ミステリー」 | サイト名</title>
  <title>AAA出版 「SF・ファンタジー」 | サイト名</title>
  <title>AAA出版 「ホラー」 | サイト名</title>
  <title>AAA出版 「時代小説」 | サイト名</title>

以下のように記述した場合は、「子カテゴリー | 親カテゴリー | サイト名」という表記になる。

  $title['title'] = $cat_name .' | '. get_cat_name($ancestor);
▼     <title>ミステリー | BBB出版 | サイト名</title>
  <title>SF・ファンタジー | BBB出版 | サイト名</title>
  <title>ホラー | BBB出版 | サイト名</title>
  <title>時代小説 | BBB出版 | サイト名</title>

以上。

functions.phpのカスタマイズにはくれぐれもご注意を!