[Ha-Basic] About structured data using json-LD (Breadcrumbs)

続【ha-Basic】json-LDを使った構造化データについて(パンくずリスト編)

公開日:2019年6月4日 制作備忘録
Knowledge Base Wordpress ha-Basic テーマ
☆☆ この機能は【ha-Basic】テーマ バージョン1.1で実装(対応)済みです ☆☆
少し前に紹介したページ内容のjson-LDを使った構造化データ出力がやっとこさ実装でき、しばらくしてsiteコマンドでサイト内のページがどのように表示されるのかを確認したところ、当然ながらクロールされて再登録がかかった記事はパンくずリストがなくなっていてちょっと寂しい感じがするので、出力できるようにしました。

ページ内容のjson-LDを使った構造化データ出力については

を参照ください。

・・・といっても本当に何をどうしていいのか?何を出力すればいいのか??階層はどうやって表現するのか?などあまり情報がありませんでしたし、何よりサイトにある情報から自動で出力するという仕組みになるとどんどんハードルが上がってしまうので、以下のサイトを参考(ほとんどそのまま)にさせていただきました。

WordPressでパンくずリストの構造化データ出力について参考にさせていただいたサイト:

きちんとGoogleの結果に反映されるかの検証は必要ですが、問題がなければ【ha-Basic】テーマの次期バージョン1.1で実装予定です。

【ha-Basic】1.0でパンくずリストの構造化データを自動出力させるには

残念ながら今のところほとんどダウンロードされていませんので【ha-Basic】テーマで使われる方はいないと思いますが、1.0へ追加する方法を紹介しておきます。

パソコンでテキストエディタを開き、以下のコードをコピーしてください

<?php if(is_front_page()): ?>
<?php elseif(is_single()): ?>
<script type="application/ld+json">
{ "@context":"http://schema.org",
  "@type": "BreadcrumbList",
  "itemListElement":
  [
    {"@type": "ListItem","position": 1,"item":{"@id": "<?php echo home_url(); ?>","name": "ホーム"}},
<?php
//パンくずの階層用
$i=1;
//カテゴリーに関する情報を取得
$categories = get_the_category($post->ID);
$cat = $categories[0];
//先祖のカテゴリーがあれば(0でなければ)分岐
if($cat -> parent != 0){
    //先祖のカテゴリーを配列で取得
    $ancestors = array_reverse(get_ancestors( $cat -> cat_ID, 'category' ));
    //$ancestorsの配列から一つ一つ$ancestorに取り出してなくなるまでくりかえす
    foreach($ancestors as $ancestor){
        $i++;
        echo '    {"@type": "ListItem","position": '.$i.',"item":{"@id": "'. get_category_link($ancestor).'","name": "'. get_cat_name($ancestor). '"}},'.PHP_EOL;
    }
}
//属していてる直接のカテゴリーの情報を出力
$i++;
echo '    {"@type": "ListItem","position": '.$i.',"item":{"@id": "'. get_category_link($cat -> term_id). '","name": "'. $cat-> cat_name . '"}},'.PHP_EOL;
//表示されている投稿ページの情報を出力
$i++;
echo '    {"@type": "ListItem","position": '.$i.',"item":{"@id": "'. esc_url(get_permalink()). '","name": "'. esc_html(get_the_title()) . '"}}'.PHP_EOL;
?>
  ]
}
</script>
<?php elseif(is_page()): ?>
<script type="application/ld+json">
{ "@context":"http://schema.org",
  "@type": "BreadcrumbList",
  "itemListElement":
  [
    {"@type": "ListItem","position": 1,"item":{"@id": "<?php echo home_url(); ?>","name": "ホーム"}},
<?php
//ベージごとに必要な情報のベースを取得。先祖の有無判断に利用。
$obj = get_queried_object();
$i=1;
//先祖の固定ページがあれば(0でなければ)分岐
if($obj -> post_parent != 0){
    //先祖の固定ページを配列で取得
    $pageAncestors = array_reverse( $post -> ancestors );
    //$ancestorsの配列から一つ一つ$ancestorに取り出してなくなるまでくりかえす
    foreach ($pageAncestors as $pageAncestor) {
        $i++;
        echo '    {"@type": "ListItem","position": '.$i.',"item":{"@id": "'. esc_url(get_permalink($pageAncestor)).'","name": "'. esc_html(get_the_title($pageAncestor)). '"}},'.PHP_EOL;
    }
}
//表示されている固定ページの情報を出力
$i++;
echo '    {"@type": "ListItem","position": '.$i.',"item":{"@id": "'. esc_url(get_permalink()). '","name": "'. esc_html(get_the_title()) . '"}}'.PHP_EOL;
?>
  ]
}
</script>
<?php elseif(is_category()): ?>
<script type="application/ld+json">
{ "@context":"http://schema.org",
  "@type": "BreadcrumbList",
  "itemListElement":
  [
    {"@type": "ListItem","position": 1,"item":{"@id": "<?php echo home_url(); ?>","name": "ホーム"}},
<?php
//パンくずの階層用
$i=1;
//カテゴリーに関する情報を取得
$categories = get_the_category($post->ID);
$cat = $categories[0];
//カテゴリーアーカイブのタイトルを取得
$cattitle = get_the_archive_title();
//先祖のカテゴリーがあれば(0でなければ)分岐
if($cat -> parent != 0){
    //先祖のカテゴリーを配列で取得
    $ancestors = array_reverse(get_ancestors( $cat -> cat_ID, 'category' ));
    //$ancestorsの配列から一つ一つ$ancestorに取り出してなくなるまでくりかえす
    foreach($ancestors as $ancestor){
        $i++;
        echo '    {"@type": "ListItem","position": '.$i.',"item":{"@id": "'. get_category_link($ancestor).'","name": "'. get_cat_name($ancestor). '"}},'.PHP_EOL;
    }
}
//表示されているカテゴリーの情報を出力
$i++;
echo '    {"@type": "ListItem","position": '.$i.',"item":{"@id": "'. get_category_link($cat -> term_id). '","name": "'. $cattitle . '"}}'.PHP_EOL;
?>
  ]
}
</script>
<?php elseif(is_tag()): ?>
<script type="application/ld+json">
{ "@context":"http://schema.org",
  "@type": "BreadcrumbList",
  "itemListElement":
  [
    {"@type": "ListItem","position": 1,"item":{"@id": "<?php echo home_url(); ?>","name": "ホーム"}},
<?php
$tagName = single_tag_title('', false);
$tag = get_term_by('name', $tagName, 'post_tag');
$link = get_tag_link($tag->term_id);
echo '    {"@type": "ListItem","position": 2,"item":{"@id": "'. esc_url($link). '","name": "'. esc_html($tagName) . '"}}'.PHP_EOL;
?>
  ]
}
</script>
<?php elseif(is_author()): ?>
<script type="application/ld+json">
{ "@context":"http://schema.org",
  "@type": "BreadcrumbList",
  "itemListElement":
  [
    {"@type": "ListItem","position": 1,"item":{"@id": "<?php echo home_url(); ?>","name": "ホーム"}},
<?php
//執筆者のIDを取得
$userId = get_query_var('author');
//執筆者の名前を取得
$authorName = get_the_author_meta( 'display_name', $userId );
echo '    {"@type": "ListItem","position": 2,"item":{"@id": "'. esc_url(get_author_posts_url($userId)). '","name": "'. esc_html($authorName) . '"}}'.PHP_EOL;
?>
  ]
}
</script>
<?php elseif(is_date()): ?>
<script type="application/ld+json">
{ "@context":"http://schema.org",
  "@type": "BreadcrumbList",
  "itemListElement":
  [
    {"@type": "ListItem","position": 1,"item":{"@id": "<?php echo home_url(); ?>","name": "ホーム"}},
<?php
//年月日を取得
$y = get_query_var('year');
$m = get_query_var('monthnum');
$d = get_query_var('day');
//年月日のアーカイブのリンクを取得
$linkY = get_year_link($y);
$linkM = get_month_link($y,$m);
$linkD = get_month_link($y,$m,$d);
if(is_day()){
    echo '    {"@type": "ListItem","position": 2,"item":{"@id": "'. esc_url($linkY).'","name": "'. esc_html($y).'年"}},'.PHP_EOL;
    echo '    {"@type": "ListItem","position": 3,"item":{"@id": "'. esc_url($linkM).'","name": "'. esc_html($m).'月"}},'.PHP_EOL;
    echo '    {"@type": "ListItem","position": 4,"item":{"@id": "'. esc_url($linkD).'","name": "'. esc_html($d). '日"}}'.PHP_EOL;
} elseif(is_month()){
    echo '    {"@type": "ListItem","position": 2,"item":{"@id": "'. esc_url($linkY).'","name": "'. esc_html($y).'年"}},'.PHP_EOL;
    echo '    {"@type": "ListItem","position": 3,"item":{"@id": "'. esc_url($linkM).'","name": "'. esc_html($m).'月"}}'.PHP_EOL;
} elseif(is_year()) {
    echo '    {"@type": "ListItem","position": 2,"item":{"@id": "'. esc_url($linkY).'","name": "'. esc_html($y).'年"}}'.PHP_EOL;
}
?>
  ]
}
</script>
<?php elseif(is_search()): ?>
<script type="application/ld+json">
{ "@context":"http://schema.org",
  "@type": "BreadcrumbList",
  "itemListElement":
  [
    {"@type": "ListItem","position": 1,"item":{"@id": "<?php echo home_url(); ?>","name": "ホーム"}},
<?php
echo '    {"@type": "ListItem","position": 2,"item":{"@id": "'. esc_url(get_search_link()). '","name": "「'. esc_html(get_search_query()) . '」で検索した結果"}}'.PHP_EOL;
?>
  ]
}
</script>
<?php elseif(is_attachment()): ?>
<script type="application/ld+json">
{ "@context":"http://schema.org",
  "@type": "BreadcrumbList",
  "itemListElement":
  [
    {"@type": "ListItem","position": 1,"item":{"@id": "<?php echo home_url(); ?>","name": "ホーム"}},
<?php
//パンくずの階層用
$i=1;
//ベージごとに必要な情報のベースを取得。先祖の有無判断に利用。
$obj = get_queried_object();
//先祖の挿入元のページがあれば(0でなければ)分岐
if($obj -> parent != 0){
    $i++;
    echo '    {"@type": "ListItem","position": '.$i.',"item":{"@id": "'. esc_url(get_permalink($pageAncestor)).'","name": "'. esc_html(get_the_title($pageAncestor)). '"}},'.PHP_EOL;
}
//表示されている固定ページの情報を出力
$i++;
echo '    {"@type": "ListItem","position": '.$i.',"item":{"@id": "'. esc_url(get_permalink()). '","name": "'. esc_html(get_the_title()) . '"}}'.PHP_EOL;
?>
  ]
}
</script>
<?php endif; ?>
【注意】コードをコピーして使用する前に必ずお読みください

この記事内にコードが記載されている場合、コードはそのままコピー(いわゆるコピペ)してお使いいただいても構いませんが、以下の件にご留意ください。

使用については自己責任でお願いします

コードの確認は私の管理するサイト、またはテスト環境で問題が起こらなかったものですので、お使いの環境での動作等を保証するものではありません。

万が一このコードを使用してサイトに重篤なトラブルが生じても当サイト、当サイト管理者は一切責任を負いません

コードの変換エラーなどにより動作しない場合、更新エラーが出る場合があります

コードをそのままコピーしても問題なく使えるよう文字列変換を行った上で掲載しておりますが、希に変換できていない場合があり、コードエラーとなることがあります

その場合には以下の方法で修正を行ってみてください

  1. コードの中に全角の記号が入っていませんか?
  2. 半角にすることで解消できます
  3. コードの中に全角の空白(スペース)がありませんか?
  4. 半角にすることで解決できます
  5. コードは合っているはずなのに更新できないときは
  6. 特にエラーの出た行内に日本語での文字列が入っている場合には全角での文字列があるということでエラーになる場合があり、Wordpressのエディタチェックではこれを「’」や「)」など閉じ子のエラーとして認識され更新できないことがあります。エラーとして返される行の先頭に空白がある場合には空白をなくすことできちんと認識され更新されるようになることが多いです。
  7. 「何かが間違っています...」と表示され、更新できないときは
  8. このエラーは本当に何がエラーなのかをWordpressのチェックが判断できない場合に発生します。解決策としてはその画面を開き直すことなのですが、その際希に元のコードがすべて削除されてしまう場合がありますので、今表示されているコードを一旦どこかへコピーしてからページの再読み込みをするようにしてやり直します。
    ※このエラーは不明なエラーなので予期せぬ動きをする可能性がありますので特に慎重な対処が必要です
これらのエラー対処については以下のページが参考になるかも知れません

コードを転載する場合には

ご自身のサイトで当ページで紹介しているコードを転載される場合には当ページへのリンクを入れていただきますようお願いいたします

コピーしたら「UTF-8(BOMなし)」のPHPファイルとして保存し、テーマディレクトリへアップロードしてください

テーマ編集を開き、「header.php」の「</head>」の手前に以下のコードを追加してください。

<?php get_template_part('schema_breadcrumb');//ぱんくずリストの構造化コード?>

適用させる処置としては以上で完了です。

※トップページはパンくずリストの構造化データは必要ないので出力されないようにしています。


今回は【ha-Basic】テーマへ適用する方法として紹介しましたが、特に独自の条件などはありませんので別のテーマでも使用可能かと思います。
※その際は別の方法で構造化データが出力されていないかを確認してから使ってくださいね。

だんだんパンくずリストが反映されるようになってきた

パンくずリストの構造化データを追加して数日、siteコマンドで確認すると確かに日々徐々にパンくずリストが結果へ表示されるようになってきました。クローラーっていつ訪問してるの?と疑問に思っていましたが、結構頻繁に来て、その時の状況を反映するようになっているんですね。

ひまあーと(管理人)
  • 記事の作者: ひまあーと(管理人)

  • ☆最後までお読みいただきありがとうございました。記事作者のひまあーとです。
    ☆Wordpressでサイトをカスタマイズしていく上で有用な情報を配信しつつ、「ココナラ」でサイトカスタマイズのお手伝い、不具合の修復、サイト引っ越し代行などをさせていただいております。
    ☆Wordpressネタが多いですが、趣味の「園芸」「卓球」などの情報や日々の出来事などもどんどん増やしていきますのでよろしくお願いいたします。


いつでもご相談・サイトカスタマイズの依頼を受け付けています

Wordpressのカスタマイズ、不具合解消のご相談はすべてココナラのダイレクトメッセージからお受けしております。まずはこちらのバナーからお気軽にお問い合わせください。

※一度もココナラを使ったことがない方はココナラへの無料登録が必要です。こちらから登録後、上のリンクをクリックする、またはココナラトップページから「ひまあーと」を検索してお問い合わせください。


【スポンサーリンク】


記事の拡散にご協力をお願いします

閲覧いただきありがとうございました。役に立つ情報でしたら是非SNSでシェアをお願いします

関連情報