今回はプラグインを使わず、高品質なパンくずナビを実装する方法をご紹介します。
WordPressのサイトにパンくずナビを設置しようとする場合、プラグインを使うことが多いかと思います。例えば、【Breadcrumb NavXT】がパッと思いつくのではないでしょうか?
私も【Breadcrumb NavXT】を使っていた時期がありました。
でも、今は使っていません。
とある案件でプラグインを使わずパンくずナビを実装してからは、プラグインを使うことはなくなりました。
パンくずナビは、プラグインを使わなくても簡単なコピペだけで実装可能です。
プラグインを使わずパンくずナビを実装したい方は、続きをご覧ください。
プラグインを使わずパンくずナビを実装する方法
プラグインを使わずパンくずナビを実装する方法をご紹介します。
実際にこのサイトでもこれから紹介する方法でパンくずナビを実装しています。
- functions.phpにコードを追記する。
- パンくずナビを設置する。
- CSSでデザインを整える。
詳しく見ていきましょう。
手順1:functions.phpにコードを追記する
functions.phpに以下のコードをコピペしてください。
以下のコードは、2024/06/02にアップデートいたしました。
function get_breadcrumb_list($include_category = 1, $include_tag = 1, $include_taxonomy = 1)
{
// ベースパンくず(サイト名など)
$base_breadcrumb = '<li itemprop="itemListElement" itemscope itemtype="http://schema.org/ListItem"><i class="fas fa-home"></i> <a href="'.get_home_url().'" itemprop="item"><span itemprop="name">HOME</span></a><meta itemprop="position" content="1" /></li>';
$top_url = get_home_url(null,'/');
// ループ外対応
global $query_string;
global $post;
query_posts($query_string);
if (have_posts()) : while(have_posts()) : the_post();
endwhile; endif;
// クエリリセットする
wp_reset_query();
// ページ数を取得(ページ数(0の場合は1ページ目なので1に変更する))
if(get_query_var('paged') == 0): $page = 1; else: $page = get_query_var('paged') ; endif;
// 投稿・固定ページかつアタッチメントページ以外の場合
if(is_singular() && !is_attachment())
{
// 記事についているカテゴリを全て取得する
$categories = get_the_category();
// カテゴリがある場合に実行する
if(!empty($categories))
{
$category_count = count($categories);
$loop = 1;
$category_list = '';
foreach($categories as $category)
{
// 値が1だったら、URLにカテゴリーのタクソノミーを含めて変数に格納する。
if($include_category === 1)
{
$category_list .= '<a href="'.$top_url.esc_html($category->taxonomy).'/'.esc_html($category->slug).'/" itemprop="item"><span itemprop="name">'.esc_html($category->name).'</span></a>';
}
// 値が指定されていないか1以外だったら、URLにカテゴリーのタクソノミーを含めないで変数に格納する。
else
{
$category_list .= '<a href="'.$top_url.esc_html($category->slug).'/" itemprop="item"><span itemprop="name">'.esc_html($category->name).'</span></a>';
}
// ループの最後でない場合のみスラッシュ追加(複数カテゴリ対応)
if($loop != $category_count)
{
$category_list .= ' / ';
}
++$loop;
}
}
// カテゴリがない場合はNULLを格納する
else
{
$category_list = null;
}
// 記事についているタグを全て取得する
$tags = get_the_tags();
// タグがあれば実行する
if(!empty($tags))
{
$tags_count = count($tags);
$loop=1;
$tag_list = '';
foreach($tags as $tag)
{
// 値が1だったら、URLにタグのタクソノミーを含めて変数に格納する。
if($include_tag === 1)
{
$tag_list .= '<a href="'.$top_url.esc_html($tag->taxonomy).'/'.esc_html($tag->slug).'/" itemprop="item"><span itemprop="name">'.esc_html($tag->name).'</span></a>';
}
// 値が指定されていないか1以外だったら、URLにタグのタクソノミーを含めないで変数に格納する。
else
{
$tag_list .= '<a href="'.$top_url.esc_html($tag->slug).'/" itemprop="item"><span itemprop="name">'.esc_html($tag->name).'</span></a>';
}
// ループの最後でない場合のみスラッシュ追加(複数タグ対応)
if($loop !== $tags_count)
{
$tag_list .= ' / ';
}
++$loop;
}
}
// タグがない場合はNULLを格納する
else
{
$tag_list = null;
}
// タクソノミーを全て取得する
$taxonomies = get_the_taxonomies();
// タクソノミーがある場合に実行する
if(!empty($taxonomies))
{
$term_list = '';
$taxonomies_count = count($taxonomies);
$taxonomies_loop = 1;
foreach(array_keys($taxonomies) as $key)
{
// タームを取得
$terms = get_the_terms($post->ID, $key);
$terms_count = count($terms);
$loop = 1;
foreach($terms as $term)
{
// 値が1だったら、URLにタクソノミーを含めて変数に格納する。
if($include_taxonomy === 1)
{
$term_list .= '<a href="'.$top_url.esc_html($term->taxonomy).'/'.esc_html($term->slug).'/" itemprop="item"><span itemprop="name">'.esc_html($term->name).'</span></a>';
}
// 値が指定されていないか1以外だったらURLにタクソノミーを含めないで変数に格納する。
else
{
$term_list .= '<a href="'.$top_url.esc_html($term->slug).'/" itemprop="item"><span itemprop="name">'.esc_html($term->name).'</span></a>';
}
// ループの最後でない場合のみスラッシュ追加(複数ターム対応)
if($loop != $terms_count)
{
$term_list .= ' / ';
}
++$loop;
}
// ループの最後でない場合のみスラッシュ追加(複数タクソノミー対応)
if($taxonomies_loop != $taxonomies_count)
{
$term_list .= ' / ';
}
++$taxonomies_loop;
}
}
// タクソノミーがない場合はNULLを格納する
else
{
$term_list = null;
}
}
// 基本パンくずリストを変数に格納する。
$breadcrumb_lists = $base_breadcrumb;
// ホームの場合
if(is_home())
{
}
// カスタム投稿タイプアーカイブの場合
elseif(is_post_type_archive())
{
// ページ数が1より大きい場合(○ページ目)を追加して格納する
if($page > 1)
{
$breadcrumb_lists .= '<li itemprop="itemListElement" itemscope itemtype="http://schema.org/ListItem"><span itemprop="name">'.esc_html(get_post_type_object( get_post_type() )->label).'の記事一覧('.$page.'ページ目)</span><meta itemprop="position" content="2" /></li>';
}
// ページ数が1の場合は(○ページ目)はなしで格納する
else
{
$breadcrumb_lists .= '<li itemprop="itemListElement" itemscope itemtype="http://schema.org/ListItem"><span itemprop="name">'.esc_html(get_post_type_object( get_post_type() )->label).'の記事一覧</span><meta itemprop="position" content="2" /></li>';
}
}
// カスタム投稿タイプ以外のアーカイブの場合
elseif(is_archive())
{
// 年アーカイブの場合
if(is_year())
{
// ページ数が1より大きい場合(○ページ目)を追加して格納する
if($page > 1)
{
$breadcrumb_lists .= '<li itemprop="itemListElement" itemscope itemtype="http://schema.org/ListItem"><span itemprop="name">'.esc_html(get_the_time("Y年")).'の記事一覧('.$page.'ページ目)</span><meta itemprop="position" content="2" /></li>';
}
// ページ数が1の場合は(○ページ目)はなしで格納する
else
{
$breadcrumb_lists .= '<li itemprop="itemListElement" itemscope itemtype="http://schema.org/ListItem"><span itemprop="name">'.esc_html(get_the_time("Y年")).'の記事一覧</span><meta itemprop="position" content="2" /></li>';
}
}
// 月アーカイブの場合
elseif(is_month())
{
// ページ数が1より大きい場合(○ページ目)を追加して格納する
if($page > 1)
{
$breadcrumb_lists .= '<li itemprop="itemListElement" itemscope itemtype="http://schema.org/ListItem"><span itemprop="name">'.esc_html(get_the_time("Y年m月")).'の記事一覧('.$page.'ページ目)</span><meta itemprop="position" content="2" /></li>';
}
// ページ数が1の場合は(○ページ目)はなしで格納する
else
{
$breadcrumb_lists .= '<li itemprop="itemListElement" itemscope itemtype="http://schema.org/ListItem"><span itemprop="name">'.esc_html(get_the_time("Y年m月")).'の記事一覧</span><meta itemprop="position" content="2" /></li>';
}
}
// 日アーカイブの場合
elseif(is_day())
{
// ページ数が1より大きい場合(○ページ目)を追加して格納する
if($page > 1)
{
$breadcrumb_lists .= '<li itemprop="itemListElement" itemscope itemtype="http://schema.org/ListItem"><span itemprop="name">'.esc_html(get_the_time("Y年m月d日")).'の記事一覧('.$page.'ページ目)</span><meta itemprop="position" content="2" /></li>';
}
// ページ数が1の場合は(○ページ目)はなしで格納する
else
{
$breadcrumb_lists .= '<li itemprop="itemListElement" itemscope itemtype="http://schema.org/ListItem"><span itemprop="name">'.esc_html(get_the_time("Y年m月d日")).'の記事一覧</span><meta itemprop="position" content="2" /></li>';
}
}
// カテゴリの場合
elseif(is_category())
{
// ページ数が1より大きい場合(○ページ目)を追加して格納する
if($page > 1)
{
$breadcrumb_lists .= '<li itemprop="itemListElement" itemscope itemtype="http://schema.org/ListItem"><span itemprop="name">'.esc_html(single_cat_title('',false)).'の記事一覧('.$page.'ページ目)</span><meta itemprop="position" content="2" /></li>';
}
// ページ数が1の場合は(○ページ目)はなしで格納する
else
{
$breadcrumb_lists .= '<li itemprop="itemListElement" itemscope itemtype="http://schema.org/ListItem"><span itemprop="name">'.esc_html(single_cat_title('',false)).'の記事一覧</span><meta itemprop="position" content="2" /></li>';
}
}
// タグの場合
elseif(is_tag())
{
// ページ数が1より大きい場合(○ページ目)を追加して格納する
if($page > 1)
{
$breadcrumb_lists .= '<li itemprop="itemListElement" itemscope itemtype="http://schema.org/ListItem"><span itemprop="name">'.esc_html(single_tag_title('',false)).'の記事一覧('.$page.'ページ目)</span><meta itemprop="position" content="2" /></li>';
}
// ページ数が1の場合は(○ページ目)はなしで格納する
else
{
$breadcrumb_lists .= '<li itemprop="itemListElement" itemscope itemtype="http://schema.org/ListItem"><span itemprop="name">'.esc_html(single_tag_title('',false)).'の記事一覧</span><meta itemprop="position" content="2" /></li>';
}
}
// タクソノミー(カスタム分類)の場合
elseif(is_tax())
{
// ページ数が1より大きい場合(○ページ目)を追加して格納する
if($page > 1)
{
$breadcrumb_lists .= '<li itemprop="itemListElement" itemscope itemtype="http://schema.org/ListItem"><span itemprop="name">'.esc_html(single_term_title('',false)).'の記事一覧('.$page.'ページ目)</span><meta itemprop="position" content="2" /></li>';
}
// ページ数が1の場合は(○ページ目)はなしで格納する
else
{
$breadcrumb_lists .= '<li itemprop="itemListElement" itemscope itemtype="http://schema.org/ListItem"><span itemprop="name">'.esc_html(single_term_title('',false)).'の記事一覧</span><meta itemprop="position" content="2" /></li>';
}
}
}
// 投稿ページ
elseif(is_single())
{
// ページ数を取得(ページ数(0の場合は1ページ目なので1に変更する))
if(get_query_var('page') == 0): $page = 1; else: $page = get_query_var('page') ; endif;
// 通常投稿の場合
if(get_post_type() === 'post')
{
// カスタムフィールドの値を取得
$seo_title = esc_html(get_post_meta($post->ID, 'seo_title', true));
// カテゴリがある場合のみ追加
if(!empty($category_list))
{
if(get_option('data_001') == 'off'){
$breadcrumb_lists .= '<li itemprop="itemListElement" itemscope itemtype="http://schema.org/ListItem"><i class="far fa-folder-open"></i> <span itemprop="name">'.$category_list.'</span><meta itemprop="position" content="2" /></li>';
}
}
// 2ページ目以降の場合
if($page > 1)
{
// カスタムフィールドに値があったらその値を格納する
if(!empty($seo_title))
{
$breadcrumb_lists .= '<li itemprop="itemListElement" itemscope itemtype="http://schema.org/ListItem"><span itemprop="name">'.$seo_title.'</span><meta itemprop="position" content="3" /></li>';
}
// カスタムフィールドに値がなかった場合
else
{
// ページが分割されている場合のタイトル取得
if(function_exists('get_current_split_string'))
{
$split_title = esc_html(get_current_split_string($page));
}
else
{
$split_title = null;
}
// ページが分割されている場合のタイトルがあった場合はそれを加える
if(!empty($split_title))
{
$breadcrumb_lists .= '<li itemprop="itemListElement" itemscope itemtype="http://schema.org/ListItem"><span itemprop="name">'.esc_html(get_the_title()).'【'.$split_title.'】</span><meta itemprop="position" content="3" /></li>';
}
// それ以外は(○ページ目)を加える
else
{
$breadcrumb_lists .= '<li itemprop="itemListElement" itemscope itemtype="http://schema.org/ListItem"><span itemprop="name">'.esc_html(get_the_title()).'('.$page.'ページ目)</span><meta itemprop="position" content="3" /></li>';
}
}
}
// 1ページ目の場合
else
{
// カスタムフィールドに値があったらその値を格納する
if(!empty($seo_title))
{
$breadcrumb_lists .= '<li itemprop="itemListElement" itemscope itemtype="http://schema.org/ListItem"><span itemprop="name">'.$seo_title.'</span><meta itemprop="position" content="3" /></li>';
}
// カスタムフィールドに値がなかった場合
else
{
$breadcrumb_lists .= '<li itemprop="itemListElement" itemscope itemtype="http://schema.org/ListItem"><span itemprop="name">'.esc_html(get_the_title()).'</span><meta itemprop="position" content="3" /></li>';
}
}
}
// カスタム投稿の場合
else
{
// カスタム投稿名を取得
$custom_title = esc_html(get_post_type_object(get_post_type())->label );
// カスタム投稿のスラッグ名を取得
$custom_name = esc_html(get_post_type_object(get_post_type())->name);
// タームがある場合のみ追加
if(!empty($term_list))
{
$breadcrumb_lists .= '<li itemprop="itemListElement" itemscope itemtype="http://schema.org/ListItem"><span itemprop="name">'.$term_list.'</span><meta itemprop="position" content="2" /></li>';
}
$breadcrumb_lists .= '<li itemprop="itemListElement" itemscope itemtype="http://schema.org/ListItem"><a href="'.get_home_url().'/'.$custom_name.'" itemprop="item"><span itemprop="name">'.$custom_title.'</span></a><meta itemprop="position" content="2" /></li><li itemprop="itemListElement" itemscope itemtype="http://schema.org/ListItem"><span itemprop="name">'.esc_html(get_the_title()).'</span><meta itemprop="position" content="3" /></li>';
}
}
// 固定ページ
elseif(is_page())
{
if(is_page() && $post->post_parent){//子ページなら
$parent_id = $post->post_parent;
$parent_title = get_post($parent_id)->post_title;
$parent_url = get_page_link($post->post_parent);
$breadcrumb_lists .= '<li itemprop="itemListElement" itemscope itemtype="http://schema.org/ListItem"><a href="'.$parent_url.'"><span itemprop="name">'.$parent_title.'</span></a><meta itemprop="position" content="2" /><li itemprop="itemListElement" itemscope itemtype="http://schema.org/ListItem"><span itemprop="name">'.esc_html(get_the_title()).'</span><meta itemprop="position" content="3" /></li>';
}
else{
$breadcrumb_lists .= '<li itemprop="itemListElement" itemscope itemtype="http://schema.org/ListItem"><span itemprop="name">'.esc_html(get_the_title()).'</span><meta itemprop="position" content="2" /></li>';
}
}
// 検索結果
elseif(is_search())
{
// ページ数が1より大きい場合(○ページ目)を追加して格納する
if($page > 1)
{
$breadcrumb_lists .= '<li itemprop="itemListElement" itemscope itemtype="http://schema.org/ListItem"><span itemprop="name">「'.esc_html(get_search_query()).'」で検索した結果('.$page.'ページ目)</span><meta itemprop="position" content="2" /></li>';
}
// ページ数が1の場合は(○ページ目)はなしで格納する
else
{
$breadcrumb_lists .= '<li itemprop="itemListElement" itemscope itemtype="http://schema.org/ListItem"><span itemprop="name">「'.esc_html(get_search_query()).'」で検索した結果</span><meta itemprop="position" content="2" /></li>';
}
}
// 404ページの場合
elseif(is_404())
{
$breadcrumb_lists .= '<li itemprop="itemListElement" itemscope itemtype="http://schema.org/ListItem"><span itemprop="name">お探しのページは見つかりませんでした</span><meta itemprop="position" content="2" /></li>';
}
else
{
$breadcrumb_lists = $base_breadcrumb;
}
// パンくずリスト成形
if(!empty($breadcrumb_lists))
{
$breadcrumb_lists = '<ol itemscope itemtype="http://schema.org/BreadcrumbList">'.$breadcrumb_lists.'</ol>';
}
return $breadcrumb_lists;
}
上記のコードは、「WordPressでプラグインを使わずにパンくずリストを実装する」で紹介されているコードをGoogleリッチスニペットに対応させたものです。
上記のコードは、サイトごとに修正する必要はありません。
そのままで、使用することができます。
手順2:パンくずナビを設置する
パンくずナビを設置したい箇所に以下のコードを記述してください。
<?php echo get_breadcrumb_list(); ?>
このコードを記述した箇所にパンくずナビが表示されます。
当サイトでは装飾の関係上、以下のように記述しています。
<div id="pan_out">
<div id="pan">
<?php echo get_breadcrumb_list(); ?>
</div>
</div>
コードを囲う要素は、自由に変更してかまいません。
手順3:CSSでデザインを整える
最後にCSSでパンくずナビのデザインを整えます。
ここでは、私のサイトで使っているCSSをそのままご紹介します。
当サイトでは、パンくずナビを以下のように設置しています。
<div id="pan_out">
<div id="pan">
<?php echo get_breadcrumb_list(); ?>
</div>
</div>
その上で、以下のようにCSSで装飾を行っています。
#pan_out {
width: 100%;
background: #ffffff;
margin-bottom: 50px;
border-bottom: 1px solid #dedede;
}
#pan {
width: 1100px;
margin: 0 auto;
padding: 0 10px;
box-sizing: border-box;
}
#pan ul {
list-style-type: none;
overflow: hidden;
}
#pan ul li {
height: 50px;
line-height: 50px;
float: left;
}
#pan ul li:before {
content: ">";
margin: 0 10px;
}
#pan ul li:first-child:before {
content: none;
}
装飾はサイトデザインに合わせて変更してください。
まとめ
WordPressサイトに高品質なパンくずナビをコピペで設置する方法をご紹介しました。
もうプラグインを使う必要はありません。
コピペだけで高品質なパンくずナビを実装することができます。
プラグインを減らしたい方は試してみてください。
コメントを残す