前の記事「表示タイプを(ほぼ)全部判別する条件分岐」の続き。
条件分岐に沿い、パンくずの内容を書き足したものをメモ。
カスタム投稿タイプ周りに関しては、プラグインと比べちゃいけないレベルでス。
2019年2月15日更新
構造化テストでエラーだらだったのでタグ周りを更新。
2019年2月19日更新
「position」周りの処理が間違っていたので修正。
ソース
<?php $blog_title = 'ブログ'; ?>
<span property="itemListElement" typeof="ListItem">
<a property="item" typeof="WebPage" href="<?php echo home_url(); ?>/"><span property="name">トップ</span></a>
<meta property="position" content="1">
</span>
<?php /* -------------------- 固定ページ -------------------- */ ?>
<?php if( is_page() ){
if( $post -> post_parent != 0 ){
$ancestors = array_reverse( $post-> ancestors );
$i = 2;
foreach( $ancestors as $ancestor ){
?>
<span property="itemListElement" typeof="ListItem">
<a property="item" typeof="WebPage" href="<?php echo get_permalink( $ancestor ); ?>"><span property="name"><?php echo get_the_title( $ancestor ); ?></span></a>
<meta property="position" content="<?php echo $i; ?>">
</span>
<?php
$i++;
}
}
?>
<span class="breadcrumbs-item current-item">現在のページ</span>
<?php /* -------------------- ブログトップ -------------------- */ ?>
<?php }elseif( is_home() ){ ?>
<span class="breadcrumbs-item current-item">
<?php echo $blog_title; ?>
</span>
<?php /* -------------------- タクソノミ -------------------- */ ?>
<?php }elseif( is_tax() ){ ?>
<?php $taxonomy = get_taxonomy( $taxonomy ); ?>
<span property="itemListElement" typeof="ListItem">
<a property="item" typeof="WebPage" href="<?php echo get_post_type_archive_link( get_post_type_object( get_post_type() )->name ); ?>"><span property="name"><?php echo esc_html( get_post_type_object( get_post_type() )->label ); ?></span></a>
<meta property="position" content="2">
</span>
<span class="breadcrumbs-item current-item"><?php single_term_title(); ?></span>
<?php /* -------------------- カスタム投稿アーカイブ -------------------- */ ?>
<?php }elseif( is_post_type_archive() ){ ?>
<?php if( is_date() ): ?>
<span property="itemListElement" typeof="ListItem">
<a property="item" typeof="WebPage" href="<?php echo get_post_type_archive_link( get_post_type_object(get_post_type() )->name ); ?>"><span property="name"><?php echo esc_html( get_post_type_object( get_post_type() )->label ); ?></span></a>
<meta property="position" content="2">
</span>
<span class="breadcrumbs-item current-item">"<?php echo esc_html( get_post_type_object( get_post_type() )->label ); ?>"アーカイブ</span>
<?php else: ?>
<span class="breadcrumbs-item current-item"><?php echo esc_html( get_post_type_object( get_post_type() )->label ); ?></span>
<?php endif; ?>
<?php /* -------------------- カテゴリ -------------------- */ ?>
<?php }elseif( is_category() ){ ?>
<span property="itemListElement" typeof="ListItem">
<a property="item" typeof="WebPage" href="<?php echo get_post_type_archive_link( 'post' ); ?>"><span property="name"><?php echo $blog_title; ?></span></a>
<meta property="position" content="2">
</span>
<?php
$cat = get_queried_object();
if($cat -> parent != 0){
$ancestors = array_reverse(get_ancestors( $cat -> cat_ID, 'category' ) );
$i = 3;
foreach( $ancestors as $ancestor ){
?>
<span property="itemListElement" typeof="ListItem">
<a property="item" typeof="WebPage" href="<?php echo get_category_link( $ancestor ); ?>"><span property="name"><?php echo get_cat_name( $ancestor ); ?></span></a>
<meta property="position" content="<?php echo $i; ?>">
</span>
<?php
$i++;
}
}
?>
<span class="breadcrumbs-item current-item"><?php echo $cat -> cat_name; ?></span>
<?php /* -------------------- タグ -------------------- */ ?>
<?php }elseif( is_tag() ){ ?>
<span property="itemListElement" typeof="ListItem">
<a property="item" typeof="WebPage" href="<?php echo get_post_type_archive_link( 'post' ); ?>"><span property="name"><?php echo $blog_title; ?></span></a>
<meta property="position" content="2">
</span>
<span class="breadcrumbs-item current-item">タグ : <?php single_tag_title(); ?></span>
<?php /* -------------------- 著者 -------------------- */ ?>
<?php }elseif( is_author() ){ ?>
<span property="itemListElement" typeof="ListItem">
<a property="item" typeof="WebPage" href="<?php echo get_post_type_archive_link( 'post' ); ?>"><span property="name"><?php echo $blog_title; ?></span></a>
<meta property="position" content="2">
</span>
<span class="breadcrumbs-item current-item">投稿者:<?php the_author_meta( 'display_name', get_query_var( 'author' ) ); ?></span>
<?php /* -------------------- アーカイブ -------------------- */ ?>
<?php }elseif( is_archive() ){ ?>
<?php if(is_day()): ?>
<span property="itemListElement" typeof="ListItem">
<a property="item" typeof="WebPage" href="<?php echo get_post_type_archive_link( 'post' ); ?>"><span property="name"><?php echo $blog_title; ?></span></a>
<meta property="position" content="2">
</span>
<span property="itemListElement" typeof="ListItem">
<a property="item" typeof="WebPage" href="<?php echo get_year_link( get_query_var( 'year' ) ); ?>"><span property="name"><?php echo get_query_var( 'year' ); ?>年</span></a>
<meta property="position" content="3">
</span>
<span property="itemListElement" typeof="ListItem">
<a property="item" typeof="WebPage" href="<?php echo get_month_link( get_query_var( 'year' ), get_query_var( 'monthnum') ); ?>"><span property="name"><?php echo get_query_var( 'monthnum' ); ?>月</span></a>
<meta property="position" content="4">
</span>
<span class="breadcrumbs-item current-item"><?php echo get_query_var( 'day' ); ?>日</span>
<?php elseif( is_month() ): ?>
<span property="itemListElement" typeof="ListItem">
<a property="item" typeof="WebPage" href="<?php echo get_post_type_archive_link( 'post' ); ?>"><span property="name"><?php echo $blog_title; ?></span></a>
<meta property="position" content="2">
</span>
<span property="itemListElement" typeof="ListItem">
<a property="item" typeof="WebPage" href="<?php echo get_year_link(get_query_var( 'year' ) ); ?>"><span property="name"><?php echo get_query_var( 'year' ); ?>年</span></a>
<meta property="position" content="3">
</span>
<span class="breadcrumbs-item current-item"><?php echo get_query_var( 'monthnum' ); ?>月</span>
<?php elseif( is_year() ):?>
<span property="itemListElement" typeof="ListItem">
<a property="item" typeof="WebPage" href="<?php echo get_post_type_archive_link( 'post' ); ?>"><span property="name"><?php echo $blog_title; ?></span></a>
<meta property="position" content="2">
</span>
<span class="breadcrumbs-item current-item"><?php echo get_query_var( 'year' ); ?>年</span>
<?php else: ?>
<span class="breadcrumbs-item current-item"><?php bloginfo( 'name' ) ; ?><?php echo $blog_title; ?></span>
<?php endif; ?>
<?php /* -------------------- アタッチメント -------------------- */ ?>
<?php }elseif( is_attachment() ){ ?>
<span class="breadcrumbs-item current-item"><?php echo $post -> post_title; ?></span>
<?php /* -------------------- シングル -------------------- */ ?>
<?php }elseif( is_single() ){ ?>
<?php /* -------------------- ブログ シングル -------------------- */ ?>
<?php if( get_post_type() == 'post' ){ ?>
<span property="itemListElement" typeof="ListItem">
<a property="item" typeof="WebPage" href="<?php echo get_post_type_archive_link( 'post' ); ?>"><span property="name"><?php echo $blog_title; ?></span></a>
<meta property="position" content="2">
</span>
<?php
$categories = get_the_category( $post->ID );
$cat = $categories[0];
if( $cat -> parent != 0 ){
$ancestors = array_reverse( get_ancestors( $cat -> cat_ID, 'category' ) );
$i = 3;
foreach( $ancestors as $ancestor ){
?>
<span property="itemListElement" typeof="ListItem">
<a property="item" typeof="WebPage" href="<?php echo get_category_link( $ancestor ); ?>"><span property="name"><?php echo get_cat_name( $ancestor ); ?></span></a>
<meta property="position" content="<?php echo $i; ?>">
</span>
<?php
$i++;
}
}
?>
<span property="itemListElement" typeof="ListItem">
<a property="item" typeof="WebPage" href="<?php echo get_category_link( $cat -> cat_ID ); ?>"><span property="name"><?php echo $cat-> cat_name; ?></span></a>
<meta property="position" content="<?php echo $i; ?>">
</span>
<span class="breadcrumbs-item current-item">現在のページ</span>
<?php /* -------------------- カスタム投稿 シングル -------------------- */ ?>
<?php }else{ ?>
<span property="itemListElement" typeof="ListItem">
<a property="item" typeof="WebPage" href="<?php echo home_url( '/' ); ?><?php echo esc_html( get_post_type_object( get_post_type() )->name ); ?>"><span property="name"><?php echo esc_html( get_post_type_object( get_post_type() )->label ); ?></span></a>
<meta property="position" content="2">
</span>
<span property="itemListElement" typeof="ListItem">
<?php
$taxonomies = get_post_taxonomies();
foreach( $taxonomies as $taxonomy1 ){
if( $taxonomy1 === reset( $taxonomies ) ){
$taxonomy = $taxonomy1;
}
}
$term = array_pop(get_the_terms( $post->ID,$taxonomy ) );
$term_parent = $term->parent;
if( !$term_parent == 0 ){
$term = array_shift( get_the_terms( $post->ID, $taxonomy ) );
}
?>
<a property="item" typeof="WebPage" href="<?php echo get_term_link( $term->slug, $taxonomy ); ?>"><span property="name"><?php echo esc_html( $term->name ); ?></span></a>
<meta property="position" content="3">
</span>
<span class="breadcrumbs-item current-item">現在のページ</span>
<?php } ?>
<?php /* -------------------- 404 -------------------- */ ?>
<?php }elseif( is_404() ){ ?>
<span class="breadcrumbs-item current-item">404 Not found</span>
<?php /* -------------------- 検索結果 -------------------- */ ?>
<?php }elseif( is_search() ){ ?>
<span class="breadcrumbs-item current-item">"<?php the_search_query(); ?>"の検索結果</span>
<?php }else{ ?>
<?php /* -------------------- 例外 -------------------- */ ?>
<span class="breadcrumbs-item current-item">そのほかのページ</span>
<?php } ?>
「post」の名称はサイトごとに変わると思うので、1行目の「$blog_title」に代入。
CSS
ここは何でもよいので、ベーシックなことだけ。
.breadcrumbs.built-in > span {
quotes: "" "\003E";
quotes: "" "\25B8";
}
.breadcrumbs.built-in > span:before {
content: open-quote;
}
.breadcrumbs.built-in > span:after {
content: close-quote;
margin: 0 0.1rem 0 0.4rem;
}
.breadcrumbs.built-in > span:last-of-type:after {
content: none;
}
制約
タイトル通り簡素で、難しいorめんどくさい処理はすべてパスしています。
タイトルは無し
「現在のページ」の代わりに「the_title()」などで投稿タイトルやページ名はだせます。
が、運用上際限なく長いタイトルがつくことも日常的に起こるので「現在のページ」としています。
the_excerpt()の要領で長さ制限もできると思いますが、大変なのでパス。
アーカイブのページングには非対応。
ページ送りをしても、「2ページ目」「3ページ目」等はでません。
タームの階層構造は無視
直上のタームだけ取得します。
また、複数のタクソノミーに属していても、最初のタクソノミーの下として扱います。
カスタム投稿タイプの時系列アーカイブは激しく省略
「投稿タイプ名 > アーカイブ」とだけ出します。ここの処理、ちゃんとやるの大変。
参考記事
こちらの記事を参考にさせていただきました。(8割がたコピペです)