2026年5月21日
2026年5月21日
WordPressでBreadcrumbスキーマを実装してパンくずリストを検索結果に表示する方法
WordPress でパンくずリストの構造化データ(BreadcrumbList)を実装するには、SEO プラグインのパンくず機能を有効にしてテーマに表示させる方法と、子テーマで表示用の HTML と JSON-LD を同じデータから出力する方法があります。どちらの場合も大切なのは、ページに見えているパンくずと構造化データの内容を一致させ、テーマ・プラグインによる二重出力を避けることです。この記事では、検索結果でのパンくず表示の現状、実装前の確認、プラグインと自作コードそれぞれの手順、テスト方法を説明します。
検索結果でのパンくず表示の現状
BreadcrumbList の構造化データを正しく設定すると、Google 検索の結果で URL の代わりに「サイト名 › カテゴリ › …」のような階層が表示されることがあります。ページがサイトのどこに位置するかが検索した人に伝わりやすくなるのが利点です。
ただし、Google は 2025年1月に、モバイルの検索結果ではパンくずを表示せず、ドメインのみを表示する形に変更したと発表しています。デスクトップの検索結果では引き続きパンくずが表示される場合があり、BreadcrumbList の構造化データ自体も Google のサポート対象として残っています(2026年10月現在)。表示の仕方は今後も変わる可能性があるため、最新の状況は Search Central のパンくずリストのページで確認してください。
また、構造化データを入れても、検索結果にパンくずが表示されるかどうかは Google の判断です。実装は「表示される条件を整える」作業であり、表示や順位を約束するものではありません。
実装前に確認すること
最初に、今のサイトがすでにパンくずを出力していないかを確かめます。多くの国産テーマや有料テーマは、パンくずリストの表示と構造化データの出力を標準で備えています。そこに SEO プラグインのパンくずを追加すると、BreadcrumbList が2つ出力され、内容が食い違うこともあります。
確認は次の手順で行います。
- 記事ページをブラウザで開き、ページのソースを表示して
BreadcrumbListを検索する - 見つかった数と、それぞれがテーマ由来かプラグイン由来かを確かめる(前後のコメントや script タグのクラス名が手がかりになります)
- 画面上に表示されているパンくずが何か所あるか、どの階層を表示しているかをメモする
テーマがすでに適切に出力しているなら、新たな実装は不要です。テーマとプラグインの両方が出している場合は、どちらか一方を止めます。テーマ側の機能を止める場合は、テーマの設定画面に切り替え項目があるかを先に確認し、ない場合は子テーマで対応します。
方法1:SEO プラグインのパンくず機能を使う
Yoast SEO の場合
Yoast SEO には、パンくずリストの表示機能があります。設定画面でパンくずを有効にし(項目の場所はバージョンによって異なります)、区切り文字やホームの表記を決めたうえで、テーマのテンプレートに表示用の関数を追加します。
<?php
// 子テーマの single.php などで、本文の上にパンくずを表示する
if ( function_exists( 'yoast_breadcrumb' ) ) {
yoast_breadcrumb( '<nav class="breadcrumbs" aria-label="パンくずリスト">', '</nav>' );
}
?>
function_exists() で囲んでいるのは、プラグインを無効化したときにサイトが致命的エラーで止まるのを防ぐためです。Yoast SEO は、パンくずの階層をサイト全体の構造化データの一部としても出力するため、画面の表示と構造化データが同じ設定から作られます。ブロックテーマを使っている場合は、Yoast SEO が提供するパンくずのブロックをテンプレートに配置する方法もあります。
Rank Math の場合
Rank Math も、一般設定の中でパンくずを有効にでき、テンプレートには次の関数で表示します。
<?php
if ( function_exists( 'rank_math_the_breadcrumbs' ) ) {
rank_math_the_breadcrumbs();
}
?>
Rank Math でも、パンくず機能を有効にすると BreadcrumbList の構造化データが出力されます。いずれのプラグインも、投稿で表示するカテゴリ(主カテゴリ)を投稿編集画面で選べるため、複数カテゴリに属する記事でも階層を揃えられます。設定項目の名称や場所はバージョンアップで変わることがあるので、各プラグインのヘルプも確認してください。
方法2:子テーマで HTML と JSON-LD を同じデータから出力する
プラグインを使わない場合は、パンくずの項目を1つの関数で組み立て、それを表示用 HTML と JSON-LD の両方に使います。データの出どころを1つにすることで、表示と構造化データのずれを防ぎます。作業前にバックアップを取り、子テーマの functions.php に追加してください。
<?php
// パンくずの項目を配列で返す(投稿・固定ページ・カテゴリーアーカイブに対応)
function mytheme_breadcrumb_items() {
$items = array(
array( 'name' => 'ホーム', 'url' => home_url( '/' ) ),
);
if ( is_singular( 'post' ) ) {
$post_id = get_queried_object_id();
$cats = get_the_category( $post_id );
if ( $cats ) {
$cat = $cats[0];
foreach ( array_reverse( get_ancestors( $cat->term_id, 'category' ) ) as $ancestor_id ) {
$ancestor = get_term( $ancestor_id, 'category' );
$link = $ancestor instanceof WP_Term ? get_term_link( $ancestor ) : '';
if ( $link && ! is_wp_error( $link ) ) {
$items[] = array( 'name' => $ancestor->name, 'url' => $link );
}
}
$link = get_term_link( $cat );
if ( ! is_wp_error( $link ) ) {
$items[] = array( 'name' => $cat->name, 'url' => $link );
}
}
$items[] = array( 'name' => get_the_title( $post_id ), 'url' => get_permalink( $post_id ) );
} elseif ( is_page() && ! is_front_page() ) {
$post_id = get_queried_object_id();
foreach ( array_reverse( get_post_ancestors( $post_id ) ) as $ancestor_id ) {
$items[] = array( 'name' => get_the_title( $ancestor_id ), 'url' => get_permalink( $ancestor_id ) );
}
$items[] = array( 'name' => get_the_title( $post_id ), 'url' => get_permalink( $post_id ) );
} elseif ( is_category() ) {
$term = get_queried_object();
foreach ( array_reverse( get_ancestors( $term->term_id, 'category' ) ) as $ancestor_id ) {
$ancestor = get_term( $ancestor_id, 'category' );
$link = $ancestor instanceof WP_Term ? get_term_link( $ancestor ) : '';
if ( $link && ! is_wp_error( $link ) ) {
$items[] = array( 'name' => $ancestor->name, 'url' => $link );
}
}
$link = get_term_link( $term );
if ( ! is_wp_error( $link ) ) {
$items[] = array( 'name' => $term->name, 'url' => $link );
}
}
return count( $items ) > 1 ? $items : array();
}
// 画面表示用の HTML
function mytheme_breadcrumb_html() {
$items = mytheme_breadcrumb_items();
if ( ! $items ) {
return '';
}
$last = count( $items ) - 1;
$html = '<nav class="breadcrumbs" aria-label="パンくずリスト"><ol>';
foreach ( $items as $i => $item ) {
if ( $i === $last ) {
$html .= '<li aria-current="page">' . esc_html( $item['name'] ) . '</li>';
} else {
$html .= '<li><a href="' . esc_url( $item['url'] ) . '">' . esc_html( $item['name'] ) . '</a></li>';
}
}
return $html . '</ol></nav>';
}
add_shortcode( 'mytheme_breadcrumb', 'mytheme_breadcrumb_html' );
// 構造化データ(JSON-LD)
add_action( 'wp_head', function () {
$items = mytheme_breadcrumb_items();
if ( ! $items ) {
return;
}
$list = array();
foreach ( $items as $i => $item ) {
$list[] = array(
'@type' => 'ListItem',
'position' => $i + 1,
'name' => wp_strip_all_tags( $item['name'] ),
'item' => $item['url'],
);
}
$data = array(
'@context' => 'https://schema.org',
'@type' => 'BreadcrumbList',
'itemListElement' => $list,
);
echo '<script type="application/ld+json">' . wp_json_encode( $data, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES | JSON_HEX_TAG ) . "</script>\n";
} );
表示させたい場所には、クラシックテーマなら子テーマのテンプレートに <?php echo mytheme_breadcrumb_html(); ?> を書きます(関数の中でエスケープ済みです)。ブロックテーマなら、サイトエディターでテンプレートにショートコードブロックを置き、[mytheme_breadcrumb] と入力します。
コードの考え方を補足します。
positionは1から始まる連番にします。Google の説明でも、ホームから現在のページへ順に並べることが求められています- 投稿が複数カテゴリに属する場合、このコードは最初のカテゴリを使います。どのカテゴリを表示するかを制御したいなら、SEO プラグインの主カテゴリ機能を使うほうが管理しやすくなります
- タグアーカイブや検索結果ページなどは対象外にしています。必要なら同じ形で条件分岐を追加します
- テーマやプラグインが別の BreadcrumbList を出している状態でこのコードを入れると二重出力になるため、前述の確認を先に済ませてください
テストと公開後の確認
実装したら、記事ページ、固定ページ、カテゴリーページのそれぞれを、Google の「リッチリザルト テスト」で確認します。パンくずリストが検出され、エラーがないことを確かめます。あわせてページのソースで BreadcrumbList が1つだけであること、画面のパンくずと JSON-LD の階層・名前が一致していることを見ます。
公開後は、Search Console の拡張機能まわりにあるパンくずリストのレポート(表示される場合)で、エラーや警告の件数を定期的に確認します。レポートの名称や場所は変わることがあります。エラーが出たら、レポートから該当 URL を開き、URL 検査ツールで実際に取得された HTML を確認するのが近道です。修正を検索結果に反映させるには再クロールが必要なので、すぐには変わらない点も覚えておいてください。
まとめ
- BreadcrumbList の構造化データは現在もサポートされているが、2025年1月以降、モバイルの検索結果ではパンくずが表示されずドメインのみになっている
- 実装前にページのソースで既存の BreadcrumbList を確認し、テーマとプラグインの二重出力を避ける
- SEO プラグインを使う場合は、パンくず機能を有効にして
function_exists()で囲んだ関数をテンプレートに追加する - 自作する場合は、表示用 HTML と JSON-LD を同じデータから作り、内容のずれを防ぐ
- リッチリザルト テストとソースで確認し、公開後は Search Console のレポートでエラーを見守る