閉じる

【PHP】WordPressのパンくずリストを自作する方法|プラグインなしで実装するコード例

WordPressでWebサイトを構築する際、ユーザーの利便性向上やSEO対策として欠かせない要素の一つがパンくずリストです。

多くの場合はプラグインを利用して実装されますが、実はPHPを用いて自作することで、サイトの軽量化や自由度の高いデザインを実現できます。

この記事では、WordPressのテーマファイルに直接記述して、プラグインなしでパンくずリストを実装する具体的なコードと手順を詳しく紹介します。

WordPressでパンくずリストを自作するメリット

パンくずリストをプラグインを使わずに自作することには、いくつかの大きなメリットがあります。

まず、サイトの表示速度を高速に保つことができる点が挙げられます。

プラグインを導入すると、不要なスクリプトやスタイルシートが読み込まれることが多く、サーバーの負荷を増やす原因になります。

自作であれば、必要な機能だけを最小限のコードで実装できるため、パフォーマンスへの影響を最小限に抑えられます。

また、HTML構造を完全にコントロールできるため、独自のCSSクラスを付与したり、特殊なレイアウトに対応させたりすることが容易です。

さらに、プラグインの更新停止による脆弱性のリスクや、WordPress本体との互換性問題を心配する必要がなくなるのも大きな利点です。

パンくずリストを自作するための基本設計

パンくずリストを実装する前に、どのような階層構造をプログラムで判別すべきか整理しておく必要があります。

WordPressには様々な投稿タイプやアーカイブページが存在するため、それぞれの条件分岐を適切に行うことが重要です。

ページの種類表示される階層の例
投稿ページホーム > カテゴリ名 > 記事タイトル
固定ページホーム > 親ページ名 > 子ページ名
カテゴリ一覧ホーム > カテゴリ名
タグ一覧ホーム > タグ名
検索結果ホーム > 「キーワード」の検索結果

このように、表示中のページがどの条件に当てはまるかをis_single()is_page()といったテンプレートタグで判定していきます。

functions.phpに記述するパンくずリスト生成コード

それでは、実際にパンくずリストを生成するための関数を作成しましょう。

以下のコードを、お使いのテーマのfunctions.phpに追記してください。

PHP
/**
 * 自作パンくずリスト生成関数
 */
function my_breadcrumb() {
    // ホームのテキスト
    $home = 'ホーム';

    // 最上位の階層(ホーム)へのリンク
    echo '<ol class="breadcrumb-list" itemscope itemtype="https://schema.org/BreadcrumbList">';
    echo '<li itemprop="itemListElement" itemscope itemtype="https://schema.org/ListItem">';
    echo '<a href="' . esc_url(home_url()) . '" itemprop="item"><span itemprop="name">' . $home . '</span></a>';
    echo '<meta itemprop="position" content="1" />';
    echo '</li>';

    if (is_category()) {
        // カテゴリページの場合
        $cat = get_queried_object();
        if ($cat->parent != 0) {
            $ancestors = array_reverse(get_ancestors($cat->cat_ID, 'category'));
            $pos = 2;
            foreach ($ancestors as $ancestor) {
                echo '<li itemprop="itemListElement" itemscope itemtype="https://schema.org/ListItem">';
                echo '<a href="' . get_category_link($ancestor) . '" itemprop="item"><span itemprop="name">' . get_cat_name($ancestor) . '</span></a>';
                echo '<meta itemprop="position" content="' . $pos . '" />';
                echo '</li>';
                $pos++;
            }
        }
        echo '<li>' . $cat->name . '</li>';

    } elseif (is_single()) {
        // 投稿ページの場合
        $cat = get_the_category();
        if (isset($cat[0])) {
            $cat = $cat[0];
            $ancestors = array_reverse(get_ancestors($cat->cat_ID, 'category'));
            $pos = 2;
            foreach ($ancestors as $ancestor) {
                echo '<li itemprop="itemListElement" itemscope itemtype="https://schema.org/ListItem">';
                echo '<a href="' . get_category_link($ancestor) . '" itemprop="item"><span itemprop="name">' . get_cat_name($ancestor) . '</span></a>';
                echo '<meta itemprop="position" content="' . $pos . '" />';
                echo '</li>';
                $pos++;
            }
            echo '<li itemprop="itemListElement" itemscope itemtype="https://schema.org/ListItem">';
            echo '<a href="' . get_category_link($cat->term_id) . '" itemprop="item"><span itemprop="name">' . $cat->cat_name . '</span></a>';
            echo '<meta itemprop="position" content="' . $pos . '" />';
            echo '</li>';
        }
        echo '<li>' . get_the_title() . '</li>';

    } elseif (is_page()) {
        // 固定ページの場合
        global $post;
        if ($post->post_parent != 0) {
            $ancestors = array_reverse(get_post_ancestors($post->ID));
            $pos = 2;
            foreach ($ancestors as $ancestor) {
                echo '<li itemprop="itemListElement" itemscope itemtype="https://schema.org/ListItem">';
                echo '<a href="' . get_permalink($ancestor) . '" itemprop="item"><span itemprop="name">' . get_the_title($ancestor) . '</span></a>';
                echo '<meta itemprop="position" content="' . $pos . '" />';
                echo '</li>';
                $pos++;
            }
        }
        echo '<li>' . get_the_title() . '</li>';

    } elseif (is_tag()) {
        // タグページの場合
        echo '<li>タグ: ' . single_tag_title('', false) . '</li>';

    } elseif (is_search()) {
        // 検索結果ページの場合
        echo '<li>検索結果: ' . get_search_query() . '</li>';

    } elseif (is_404()) {
        // 404ページの場合
        echo '<li>ページが見つかりません</li>';
    }

    echo '</ol>';
}

コードの解説:構造化データへの対応

上記のコードでは、Googleなどの検索エンジンが正しく階層を理解できるように「Schema.org」に準拠した構造化データ(JSON-LD/Microdata)を組み込んでいます。

itemprop="itemListElement"itemtype="https://schema.org/ListItem"という属性を付与することで、検索結果にパンくずリストが表示されやすくなります。

特にmeta itemprop="position"は、リスト内での位置を数値で示すために必要不可欠な要素です。

SEO効果を最大化するためには、単なるリンクの羅列ではなく、この構造化データのマークアップが非常に重要となります。

パンくずリストをテンプレートに表示させる方法

関数を定義したら、次はパンくずリストを表示させたい場所にコードを挿入します。

一般的には、header.phpの最下部や、各テンプレートファイル(single.php, page.phpなど)のコンテンツエリア上部に記述します。

PHP
<div class="breadcrumb-container">
    <?php
    if (function_exists('my_breadcrumb')) {
        my_breadcrumb();
    }
    ?>
</div>

このように記述することで、ページが表示された際に自動的に適切な階層構造が出力されます。

実行結果
<!-- カテゴリ「ニュース」に属する記事の場合の出力例 -->
<ol class="breadcrumb-list" itemscope itemtype="https://schema.org/BreadcrumbList">
  <li itemprop="itemListElement" itemscope itemtype="https://schema.org/ListItem">
    <a href="https://example.com/" itemprop="item"><span itemprop="name">ホーム</span></a>
    <meta itemprop="position" content="1" />
  </li>
  <li itemprop="itemListElement" itemscope itemtype="https://schema.org/ListItem">
    <a href="https://example.com/category/news/" itemprop="item"><span itemprop="name">ニュース</span></a>
    <meta itemprop="position" content="2" />
  </li>
  <li>最新記事のタイトル</li>
</ol>

パンくずリストのCSSデザイン調整

HTMLが出力されたら、サイトのデザインに合わせてCSSでスタイリングを行いましょう。

横並びにするための基本的なCSSコードを以下に紹介します。

CSS
.breadcrumb-list {
    display: flex;
    flex-wrap: wrap;
    list-style: none;
    padding: 0;
    margin: 20px 0;
    font-size: 14px;
}

.breadcrumb-list li {
    display: flex;
    align-items: center;
}

/* 区切り文字の指定 */
.breadcrumb-list li:not(:last-child)::after {
    content: ">";
    margin: 0 10px;
    color: #999;
}

.breadcrumb-list li a {
    color: #0073aa;
    text-decoration: none;
}

.breadcrumb-list li a:hover {
    text-decoration: underline;
}

.breadcrumb-list li:last-child {
    color: #333;
    font-weight: bold;
}

このように設定することで、一般的な「ホーム > カテゴリ > 記事名」という形式で美しく表示されます。

モバイル端末での閲覧を考慮し、flex-wrap: wrap;を指定しておくことで、長いタイトルでも崩れずに折り返されます。

カスタム投稿タイプへの対応

もしサイト内でカスタム投稿タイプを使用している場合は、それに応じた分岐も追加する必要があります。

is_post_type_archive('news')のような条件式を使うことで、特定の投稿タイプ専用のパンくずを表示させることができます。

自作コードの利点は、こうした複雑な条件分岐も自由自在に追加できる柔軟性にあります。

独自のタクソノミー(カスタム分類)を使用している場合も、get_the_terms()関数を組み合わせることで、正しい親階層を取得することが可能です。

まとめ

WordPressのパンくずリストをプラグインなしで自作する方法について、実装手順と具体的なコードを解説しました。

PHPを用いて自作することで、サイトの軽量化だけでなく、SEOに強い構造化データの適切な出力も可能になります。

一見すると複雑に感じるかもしれませんが、基本となる条件分岐のパターンさえ把握してしまえば、どのようなサイト構成にも柔軟に対応できます。

今回紹介したコードをベースに、ご自身のサイトに合わせてデザインや階層をカスタマイズしてみてください。

余計なプラグインを減らすことは、長期的なメンテナンス性の向上にも大きく寄与します。

ぜひこの記事を参考に、より高速で検索エンジンにフレンドリーなサイト運営を目指しましょう。

URLをコピーしました!