【WordPress】パンくずリストをプラグインを使わないで表示する

【WordPress】パンくずリストをプラグインを使わないで表示する

WordPressサイト制作で必ずと言っていいほどfunctions.phpに張り付けるやつ!
いつもサイトを制作するたびに検索しているので、時間短縮のためにここにメモ。
参考サイトのソースをベースに自分なりに調整しました。

【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;
}

【表示したいところにコピペ(header.phpなどに)】

<?php breadcrumbs(); ?>

【出力例】

<div id="breadcrumbs" class="clearfix">
    <ul>
        <li class="breadcrumb_top"><a href="https://web-dragon.com/"><span>ホーム</span></a>&nbsp; &gt; &nbsp;</li>
        <li>アバウト</li>
    </ul>
</div>

【参考サイト】WordPressにパンくずナビをプラグインなしで。子カテゴリや構造化データも出力する