ふだんパンくずリストを設置するときはBreadcrumb NavXTをつかっていますが、カスタム投稿タイプのときいろいろ自由に設定したくて、ためしにfunctions.php式くずリスト設置をしてみました。
結論から言って、逆にめんどくさい部分もあったわけですが……
コードはこちらのページより
https://increment-log.com/wordpress-breadcrumb-function/
functions.php
/* パンくずリスト */ function breadcrumbs( $args = array() ){ global $post; $str =''; $defaults = array( 'id' => "breadcrumbs", 'class' => "clearfix", 'home' => "ホーム", 'search' => "で検索した結果", 'tag' => "タグ", 'author' => "投稿者", 'notfound' => "404 Not found", 'separator' => ' > ' ); $args = wp_parse_args( $args, $defaults ); extract( $args, EXTR_SKIP ); if( is_home() ) { echo '<div id="'. $id .'" class="' . $class.'" >'.'<ul><li>'. $home .'</li></ul></div>'; } if( !is_home() && !is_admin() ){ $str.='<div id="'. $id .'" class="' . $class.'" >'; $str.='<ul>'; $str.='<li class="breadcrumb_top"><a href="'. home_url() .'/"><span>'. $home .'</span></a>'.$separator.'</li>'; $my_taxonomy = get_query_var( 'taxonomy' ); $cpt = get_query_var( 'post_type' ); if( $my_taxonomy && is_tax( $my_taxonomy ) ) { $my_tax = get_queried_object(); $post_types = get_taxonomy( $my_taxonomy )->object_type; $cpt = $post_types[0]; $str.='<li><a href="' .get_post_type_archive_link( $cpt ).'"><span>'. get_post_type_object( $cpt )->label.'</span></a>'.$separator.'</li>'; if( $my_tax -> parent != 0 ) { $ancestors = array_reverse( get_ancestors( $my_tax -> term_id, $my_tax->taxonomy ) ); foreach( $ancestors as $ancestor ){ $str.='<li><a href="'. get_term_link( $ancestor, $my_tax->taxonomy ) .'"><span>'. get_term( $ancestor, $my_tax->taxonomy )->name .'</span></a>'.$separator.'</li>'; } } $str.='<li>'. $my_tax -> name . '</li>'; }elseif( is_category() ) { $cat = get_queried_object(); if( $cat -> parent != 0 ){ $ancestors = array_reverse( get_ancestors( $cat -> cat_ID, 'category' )); foreach( $ancestors as $ancestor ){ $str.='<li><a href="'. get_category_link( $ancestor ) .'"><span>'. get_cat_name( $ancestor ) .'</span></a>'.$separator.'</li>'; } } $str.='<li>'. $cat -> name . '</li>'; }elseif( is_post_type_archive() ) { $cpt = get_query_var( 'post_type' ); $str.='<li>'. get_post_type_object( $cpt )->label . '</li>'; }elseif( $cpt && is_singular( $cpt ) ){ $taxes = get_object_taxonomies( $cpt ); $mytax = $taxes[0]; $str.='<li><a href="' .get_post_type_archive_link( $cpt ).'"><span>'. get_post_type_object( $cpt )->label.'</span></a>'.$separator.'</li>'; $taxes = get_the_terms( $post->ID, $mytax ); $tax = get_youngest_tax( $taxes, $mytax ); if( $tax -> parent != 0 ){ $ancestors = array_reverse( get_ancestors( $tax -> term_id, $mytax ) ); foreach( $ancestors as $ancestor ){ $str.='<li><a href="'. get_term_link( $ancestor, $mytax ).'"><span>'. get_term( $ancestor, $mytax )->name . '</span></a>'.$separator.'</li>'; } } $str.='<li><a href="'. get_term_link( $tax, $mytax ).'"><span>'. $tax -> name . '</span></a>'.$separator.'</li>'; $str.='<li>'. $post -> post_title .'</li>'; }elseif( is_single() ){ $categories = get_the_category( $post->ID ); $cat = get_youngest_cat( $categories ); if( $cat -> parent != 0 ){ $ancestors = array_reverse( get_ancestors( $cat -> cat_ID, 'category' ) ); foreach( $ancestors as $ancestor ){ $str.='<li><a href="'. get_category_link( $ancestor ).'"><span>'. get_cat_name( $ancestor ). '</span></a>'.$separator.'</li>'; } } $str.='<li><a href="'. get_category_link( $cat -> term_id ). '"><span>'. $cat-> cat_name . '</span></a>'.$separator.'</li>'; $str.='<li>'. $post -> post_title .'</li>'; }elseif( is_page() ){ if( $post -> post_parent != 0 ){ $ancestors = array_reverse( get_post_ancestors( $post->ID ) ); foreach( $ancestors as $ancestor ){ $str.='<li><a href="'. get_permalink( $ancestor ).'"><span>'. get_the_title( $ancestor ) .'</span></a>'.$separator.'</li>'; } } $str.= '<li>'. $post -> post_title .'</li>'; }elseif( is_date() ){ if( get_query_var( 'day' ) != 0){ $str.='<li><a href="'. get_year_link(get_query_var('year')). '"><span>' . get_query_var( 'year' ). '年</span></a>'.$separator.'</li>'; $str.='<li><a href="'. get_month_link(get_query_var( 'year' ), get_query_var( 'monthnum' ) ). '"><span>'. get_query_var( 'monthnum' ) .'月</span></a>'.$separator.'</li>'; $str.='<li>'. get_query_var('day'). '日</li>'; }elseif( get_query_var('monthnum' ) != 0){ $str.='<li><a href="'. get_year_link( get_query_var('year') ) .'"><span>'. get_query_var( 'year' ) .'年</span></a>'.$separator.'</li>'; $str.='<li>'. get_query_var( 'monthnum' ). '月</li>'; }else { $str.='<li>'. get_query_var( 'year' ) .'年</li>'; } }elseif( is_search() ) { $str.='<li>「'. get_search_query() .'」'. $search .'</li>'; }elseif( is_author() ){ $str .='<li>'. $author .' : '. get_the_author_meta('display_name', get_query_var( 'author' )).'</li>'; }elseif( is_tag() ){ $str.='<li>'. $tag .' : '. single_tag_title( '' , false ). '</li>'; }elseif( is_attachment() ){ $str.= '<li>'. $post -> post_title .'</li>'; }elseif( is_404() ){ $str.='<li>'.$notfound.'</li>'; }else{ $str.='<li>'. wp_title( '', true ) .'</li>'; } $str.='</ul>'; $str.='</div>'; } echo $str; } function get_youngest_cat( $categories ){ global $post; if(count( $categories ) == 1 ){ $youngest = $categories[0]; }else{ $count = 0; foreach( $categories as $category ){ $children = get_term_children( $category -> term_id, 'category' ); if($children){ if ( $count < count( $children ) ){ $count = count( $children ); $lot_children = $children; foreach( $lot_children as $child ){ if( in_category( $child, $post -> ID ) ){ $youngest = get_category( $child ); } } } }else{ $youngest = $category; } } } return $youngest; } function get_youngest_tax( $taxes, $mytaxonomy ){ global $post; if( count( $taxes ) == 1 ){ $youngest = $taxes[ key( $taxes )]; }else{ $count = 0; foreach( $taxes as $tax ){ $children = get_term_children( $tax -> term_id, $mytaxonomy ); if($children){ if ( $count < count($children) ){ $count = count($children); $lot_children = $children; foreach($lot_children as $child){ if( is_object_in_term( $post -> ID, $mytaxonomy ) ){ $youngest = get_term($child, $mytaxonomy); } } } }else{ $youngest = $tax; } } } return $youngest; }
テンプレ側
<?php breadcrumbs(); ?>
あるていどphpの勝手が分かってきた身にはいい!と思ったんですが、これを使うと、タクソノミーなしのカスタム投稿タイプ記事のときにパンくずにエラーが出ます。
タクソノミーを取ってくる途中で、タクソノミーねぇじゃねえか!と切れられる感じ。
とはいえカスタム投稿タイプではタクソノミーを使わないことも多いので、エラーを出しているわけにはいきません……
そこで、タクソノミー箇所にエラー出てしまったら、エラー箇所の手前に「if( empty($tax) ){}」分岐をかけてあげると、タクソノミーがないときはエラーが出るか所をスキップしてくれるのでいい感じですよ。
これならページごとに複雑怪奇なパンくずを出力せざるを得ないときも活用できるのでお勧めです。
コメント