テーマカスタマイズ

プラグインを使わずに記事詳細ページのパンくずをJSON-LDで構造化

2018.01.09

パンくず

Wordpress記事詳細ページのパンくずをJSON-LDで構造化してみました。検索結果にパンくずを反映させるためです。検索でのランディングは記事詳細ページが大半ですので記事詳細ページにのみ導入です。

パンくず構造構造化の導入方法

functions.phpの設定

パンくずを生成する仕組はfunctions.phpに記述します。カスタム投稿タイプにも対応しています。

  function bcStructure(){
  global $post;
  $my_taxonomy = get_query_var('taxonomy');
  $cpt = get_query_var('post_type');
  $str ='';
  $str.= '<script type="application/ld+json">{"@context": "http://schema.org","@type": "BreadcrumbList","itemListElement":[';

  if (get_post_type() === 'post' && is_single()) {
  $categories = get_the_category($post->ID);
  $cat = get_youngest_cat($categories);
  $count = 1;
  if($cat -> parent != 0){
      $ancestors = array_reverse(get_ancestors( $cat -> cat_ID, 'category' ));

      foreach($ancestors as $ancestor){
          $str.= '{"@type": "ListItem","position": '.$count.',"item":{';
          $str.= '"@id":"'.get_category_link($ancestor).'","name":"'. get_cat_name($ancestor).'"}},';
          $count++;
      }
  }
  $str.= '{"@type": "ListItem","position": '.$count.',"item":{';
  $str.= '"@id":"'. get_category_link($cat -> term_id). '","name":"'. $cat-> cat_name . '"}},';
  $count++;
  $str.= '{"@type": "ListItem","position": '.$count.',"item":{';
  $str.= '"@id":"' . get_permalink($post -> post_id)  . '","name":"' . $post -> post_title  .'"}}' ;

  }elseif($cpt && is_singular($cpt)){
      $taxes = get_object_taxonomies( $cpt  );
      $mytax = $taxes[0];

  $count = 1;
  $str.= '{"@type": "ListItem","position": '.$count.',"item":{';
  $str.= '"@id":"'.get_post_type_archive_link($cpt).'","name":"'. get_post_type_object($cpt)->label.'"}},';
  $count++;

  $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.= '{"@type": "ListItem","position": '.$count.',"item":{';
              $str.= '"@id":"'. get_term_link($ancestor, $mytax).'","name":"'. get_term($ancestor, $mytax)->name . '"}},';
              $count++;
          }
      }
  $str.= '{"@type": "ListItem","position": '.$count.',"item":{';
  $str.= '"@id":"'. get_term_link($tax, $mytax).'","name":"'. $tax -> name .'"}},';
  $count++;
  $str.= '{"@type": "ListItem","position": '.$count.',"item":{';
  $str.= '"@id":"' . get_permalink($post -> post_id)  . '","name":"' . $post -> post_title  .'"}}' ;
  }

  $str.= ']}</script>';
     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;
}

footer.phpの設定

パンくずの構造化データ自体はどこに記述されていても構わないので、footer.phpの下の方に以下を記述して呼び出しています。

  <?php if (is_single()): ?>
   <?php bcStructure(); //パンクズ構造化 ?>
  <?php endif; ?>

パンくず構造化の効果

パンくずの構造化データは検索結果にリッチスニペットを表示させるだけでなく、クローラーに正しくページを評価してもらうための補足的な役割を担います。ランキングには直接左右するわけではありませんがSEOの内部対策の一環でもあるわけですね。

リッチスニペットによるパンくず構造化のユーザーエクスペリエンスがいかなるものかは、自身で検証を行っていないのでなんともですが、検索内容と関連性の高いキーワードがリッチスニペットに表示されていれば目に止まりますし、関連性の高いコンテンツを扱っているサイトなんだと想像がつきます。こういった一つ一つの積み重ねがクリック率改善につながったりしますので、大事なのだと思います。

WEBSITE DESIGN REQUEST

ホームページ制作依頼について

W・D・Sでホームページ制作をご希望の方はお気軽にご相談ください。
制作内容、ご予算、納期をお知らせいただくとスムーズです。

ホームページ制作を相談する