とても簡素なパンくずリストの作成、カスタム投稿タイプは50%カバー

ワードプレスのメモ

前の記事「表示タイプを(ほぼ)全部判別する条件分岐」の続き。

条件分岐に沿い、パンくずの内容を書き足したものをメモ。

カスタム投稿タイプ周りに関しては、プラグインと比べちゃいけないレベルでス。

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割がたコピペです)