「極力プラグインを少なく!」をモットーに、パンくずは基本テーマ内で自作するようにしています。WordPressのバージョン4.1以降から導入されたget_the_archive_title()という、アーカイブページで適したタイトルを取得してくれる関数があるのですが…「これ使えばもっとシンプルにいけんじゃね?」ということで、ずーっと放置し続けてた自作のパンくずを、いよいよ見直してみました!
コンテンツ一覧
オリジナル関数を定義
結論から申しますと的な流れになってしまうのですが…以下が最終的な関数となります。
<?php
function the_breadcrumbs(){
global $post;
$results = '';
// ターム情報生成
$taxonomy = get_post_taxonomies( $post );
$term = get_the_terms( $post, $taxonomy[0] );
// 変数に格納
$results .=
'
<ol class="l-breadcrumbs-list">
<li class="l-breadcrumbs-list__item l-breadcrumbs-list__item--home">
<a href="'.home_url( '/' ).'">
ホーム
</a>
</li>
';
// アーカイブの場合
if( is_archive() ){
$results .=
'
<li class="l-breadcrumbs-list__item l-breadcrumbs-list__item--current">
'.get_the_archive_title().'
</li>
';
}
// 投稿の場合
else if( is_single() ){
if( $term ){
$results .=
'
<li class="l-breadcrumbs-list__item">
<a href="'.get_term_link( $term[0], $taxonomy[0] ).'">
'.$term[0]->name.'
</a>
</li>
';
}
$results .=
'
<li class="l-breadcrumbs-list__item l-breadcrumbs-list__item--current">
'.get_the_title( $post ).'
</li>
';
}
// ページの場合
else if( is_page() ){
// 親ページがある場合祖先から階層出力
if( $post->post_parent != 0 ){
$ancestors = array_reverse( $post->ancestors );
foreach( $ancestors as $ancestor ){
$results .=
'
<li class="l-breadcrumbs-list__item">
<a href="'.get_permalink( $ancestor ).'">
'.get_the_title( $ancestor ).'
</a>
</li>';
}
}
$results .=
'
<li class="l-breadcrumbs-list__item l-breadcrumbs-list__item--current">
'.get_the_title( $post ).'
</li>
';
}
// 404の場合
else if( is_404() ){
$results .=
'
<li class="l-breadcrumbs-list__item l-breadcrumbs-list__item--current">
404 Not Found
</li>
';
}
// 検索結果の場合
else if( is_search() ){
$results .=
'
<li class="l-breadcrumbs-list__item l-breadcrumbs-list__item--current">
'.'"'.get_search_query().'"の検索結果
</li>
';
}
$results .= '</ol>';
// 出力
echo $results;
}
◯◯の場合といったように、いくつか条件分岐を設け、結果を変数に格納していき最終的に出力(echo)するという流れになります。
関数について
それでは、先程のコードを所々抜粋しながら解説していきたいと思います。
ターム情報の生成
$taxonomy = get_post_taxonomies( $post ); $term = get_the_terms( $post, $taxonomy[0] );
こちらは投稿に入った段階で使用する変数となり、カスタムタクソノミーに対応すべくこのようにしてみました。
get_the_terms()関数ですが、こちらは第2引数にタクソノミーのスラッグを指定する必要性があるのです。その指定する用のスラッグを$taxonomy = get_post_taxonomies( $post );で定義しています。
例えば、タクソノミー:カテゴリー(category)に属している記事だった場合、$taxonomyの中身は以下のようになります。
Array
(
[0] => category
[1] => post_tag
[2] => post_format
)
配列の1番目、つまり[0]はタクソノミーのスラッグはcategoryだという事が分かりますね。
タクソノミー:ニュースカテゴリー(news_cat)に属している記事だった場合は、以下のようになるわけですね。
Array
(
[0] => news_cat
)
この配列結果を元に$term = get_the_terms( $post, $taxonomy[0] );でターム情報を変数に格納してます(使用部分は後ほど)。
アーカイブページ対応
この記事冒頭にも記載してますがget_the_archive_title()で基本的に対応してます。この関数のおかげで、アーカイブページの条件分岐がゴソッと減りました。
if( is_archive() ){
$results .=
'
<li class="l-breadcrumbs-list__item l-breadcrumbs-list__item--current">
'.get_the_archive_title().'
</li>
';
}
ただ、get_the_archive_title()で出力されるタイトルに若干調整が必要になります。追って説明します。
投稿対応
ターム情報の生成の説明で定義した変数が、ここで活用されます。
if( $term ){
$results .=
'
<li class="l-breadcrumbs-list__item">
<a href="'.get_term_link( $term[0], $taxonomy[0] ).'">
'.$term[0]->name.'
</a>
</li>
';
}
ターム情報があった場合、ターム一覧へのリンク付きテキストが出力されるようにしてあります。それに続いて、投稿のタイトルが出力されるという流れですね。
コード全文は以下のようになります。
else if( is_single() ){
if( $term ){
$results .=
'
<li class="l-breadcrumbs-list__item">
<a href="'.get_term_link( $term[0], $taxonomy[0] ).'">
'.$term[0]->name.'
</a>
</li>
';
}
$results .=
'
<li class="l-breadcrumbs-list__item l-breadcrumbs-list__item--current">
'.get_the_title( $post ).'
</li>
';
}
固定ページ対応
親ページがある場合、階層出力に対応させる必要があります。コードで言うと以下の部分ですね。
if( $post->post_parent != 0 ){
$ancestors = array_reverse( $post->ancestors );
foreach( $ancestors as $ancestor ){
$results .=
'
<li class="l-breadcrumbs-list__item">
<a href="'.get_permalink( $ancestor ).'">
'.get_the_title( $ancestor ).'
</a>
</li>';
}
}
配列を逆に並び替えさせ、階層出力に対応しています。
コード全文は以下ですね。
else if( is_page() ){
// 親ページがある場合祖先から階層出力
if( $post->post_parent != 0 ){
$ancestors = array_reverse( $post->ancestors );
foreach( $ancestors as $ancestor ){
$results .=
'
<li class="l-breadcrumbs-list__item">
<a href="'.get_permalink( $ancestor ).'">
'.get_the_title( $ancestor ).'
</a>
</li>';
}
}
$results .=
'
<li class="l-breadcrumbs-list__item l-breadcrumbs-list__item--current">
'.get_the_title( $post ).'
</li>
';
}
404対応
404の時に「404 Not Found」と出力させているだけですね。。
else if( is_404() ){
$results .=
'
<li class="l-breadcrumbs-list__item l-breadcrumbs-list__item--current">
404 Not Found
</li>
';
}
検索結果ページ対応
get_search_query()で検索パラメータを取得し「“◯◯”の検索結果」と出力させています。
else if( is_search() ){
$results .=
'
<li class="l-breadcrumbs-list__item l-breadcrumbs-list__item--current">
'.'"'.get_search_query().'"の検索結果
</li>
';
}
後は出力のみ
後は、こうして追加され完成された変数$resultsを出力するのみです。
$results .= '</ol>'; // 出力 echo $results;
アーカイブタイトルのカスタマイズ
先程から何度も登場しているget_the_archive_title()関数ですが、こちらデフォルトのままの出力内容だと、ちょっと使い勝手が悪いのです。例えば、「未分類」というカテゴリーのアーカイブタイトルだった場合…
「カテゴリー: 未分類」という出力内容になります。何が言いたいかというと…「カテゴリー:」って要らなくないですか?というお話なんです。
フィルターフックが用意されているので、ここは別途関数で以下のようにカスタマイズ対応しましょう。
function custom_archive_title( $title ){
if( is_category() ){
$title = single_cat_title( '', false );
}
else if( is_tag() ){
$title = single_tag_title( '', false );
}
else if( is_post_type_archive() ){
$title = post_type_archive_title( '', false );
}
else if( is_tax() ){
$title = single_term_title( '', false );
}
else if( is_month() ){
$title = get_query_var( 'year' ).'年'.get_query_var( 'monthnum' ).'月';
}
else if( is_author() ){
$title = get_the_author();
}
return $title;
}
add_filter( 'get_the_archive_title', 'custom_archive_title' );
カテゴリーアーカイブの場合「カテゴリー:」削除といったように、それぞれの条件に応じて対応させている形ですね。
上記はあくまで一例ですので、自分好みにカスタマイズする場合の参考にでもなれれば嬉しいです。
関数を実行させる
<?php the_breadcrumbs(); ?>
はい…出力させたい箇所に上記コードを挿入するだけです。
※関数内でechoさせているので、実行時echoは不要です。
区切り文字や「ホーム」という表記を管理画面から変更できるようにしたりとカスタマイズすれば、プラグイン化もできちゃいますね!

コメントする