プラグインは使わない!WordPressサイトに高品質なパンくずナビをコピペで設置する方法
  • プラグインは使わない!WordPressサイトに高品質なパンくずナビをコピペで設置する方法
  • 記事公開:2016/01/18
  • 最終更新:-------------

プラグインは使わない!WordPressサイトに高品質なパンくずナビをコピペで設置する方法

プラグインを使わずにWordPressサイトに高品質なパンくずナビをコピペで設置する方法をご紹介します。設置はコピペだけで実装可能です。興味のある方は3分間だけコンテンツを確認してみてください。

この記事は約 30 分で読めます。

当サイトのパンくずナビのコードをご紹介します。

このサイトで実際に導入しているパンくずナビのコードをご紹介します。
functions.phpにコピペするだけでパンくずナビを設置できます。

functions.phpに以下のコードをコピペしてください。

/* パンくずナビ */
function get_breadcrumb_list($include_category = 1, $include_tag = 1, $include_taxonomy = 1)
{
// ベースパンくず(サイト名など)
$base_breadcrumb = '<li itemscope itemtype="http://data-vocabulary.org/Breadcrumb"><a href="'.get_home_url().'" itemprop="url"><span itemprop="title">HOME</span></a></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="url"><span itemprop="title">'.esc_html($category->name).'</span></a>';
}
// 値が指定されていないか1以外だったら、URLにカテゴリーのタクソノミーを含めないで変数に格納する。
else
{
$category_list .= '<a href="'.$top_url.esc_html($category->slug).'/" itemprop="url"><span itemprop="title">'.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="url"><span itemprop="title">'.esc_html($tag->name).'</span></a>';
}
// 値が指定されていないか1以外だったら、URLにタグのタクソノミーを含めないで変数に格納する。
else
{
$tag_list .= '<a href="'.$top_url.esc_html($tag->slug).'/" itemprop="url"><span itemprop="title">'.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="url"><span itemprop="title">'.esc_html($term->name).'</span></a>';
}
// 値が指定されていないか1以外だったらURLにタクソノミーを含めないで変数に格納する。
else
{
$term_list .= '<a href="'.$top_url.esc_html($term->slug).'/" itemprop="url"><span itemprop="title">'.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 itemscope itemtype="http://data-vocabulary.org/Breadcrumb">'.esc_html(get_post_type_object( get_post_type() )->label).'の記事一覧('.$page.'ページ目)</li>';
}
// ページ数が1の場合は(○ページ目)はなしで格納する
else
{
$breadcrumb_lists .= '<li itemscope itemtype="http://data-vocabulary.org/Breadcrumb">'.esc_html(get_post_type_object( get_post_type() )->label).'の記事一覧</li>';
}
}
// カスタム投稿タイプ以外のアーカイブの場合
elseif(is_archive())
{
// 年アーカイブの場合
if(is_year())
{
// ページ数が1より大きい場合(○ページ目)を追加して格納する
if($page > 1)
{
$breadcrumb_lists .= '<li itemscope itemtype="http://data-vocabulary.org/Breadcrumb">'.esc_html(get_the_time("Y年")).'の記事一覧('.$page.'ページ目)</li>';
}
// ページ数が1の場合は(○ページ目)はなしで格納する
else
{
$breadcrumb_lists .= '<li itemscope itemtype="http://data-vocabulary.org/Breadcrumb">'.esc_html(get_the_time("Y年")).'の記事一覧</li>';
}
}
// 月アーカイブの場合
elseif(is_month())
{
// ページ数が1より大きい場合(○ページ目)を追加して格納する
if($page > 1)
{
$breadcrumb_lists .= '<li itemscope itemtype="http://data-vocabulary.org/Breadcrumb">'.esc_html(get_the_time("Y年m月")).'の記事一覧('.$page.'ページ目)</li>';
}
// ページ数が1の場合は(○ページ目)はなしで格納する
else
{
$breadcrumb_lists .= '<li itemscope itemtype="http://data-vocabulary.org/Breadcrumb">'.esc_html(get_the_time("Y年m月")).'の記事一覧</li>';
}
}
// 日アーカイブの場合
elseif(is_day())
{
// ページ数が1より大きい場合(○ページ目)を追加して格納する
if($page > 1)
{
$breadcrumb_lists .= '<li itemscope itemtype="http://data-vocabulary.org/Breadcrumb">'.esc_html(get_the_time("Y年m月d日")).'の記事一覧('.$page.'ページ目)</li>';
}
// ページ数が1の場合は(○ページ目)はなしで格納する
else
{
$breadcrumb_lists .= '<li itemscope itemtype="http://data-vocabulary.org/Breadcrumb">'.esc_html(get_the_time("Y年m月d日")).'の記事一覧</li>';
}
}
// カテゴリの場合
elseif(is_category())
{
// ページ数が1より大きい場合(○ページ目)を追加して格納する
if($page > 1)
{
$breadcrumb_lists .= '<li itemscope itemtype="http://data-vocabulary.org/Breadcrumb">'.esc_html(single_cat_title('',false)).'の記事一覧('.$page.'ページ目)</li>';
}
// ページ数が1の場合は(○ページ目)はなしで格納する
else
{
$breadcrumb_lists .= '<li itemscope itemtype="http://data-vocabulary.org/Breadcrumb">'.esc_html(single_cat_title('',false)).'の記事一覧</li>';
}
}
// タグの場合
elseif(is_tag())
{
// ページ数が1より大きい場合(○ページ目)を追加して格納する
if($page > 1)
{
$breadcrumb_lists .= '<li itemscope itemtype="http://data-vocabulary.org/Breadcrumb">'.esc_html(single_tag_title('',false)).'の記事一覧('.$page.'ページ目)</li>';
}
// ページ数が1の場合は(○ページ目)はなしで格納する
else
{
$breadcrumb_lists .= '<li itemscope itemtype="http://data-vocabulary.org/Breadcrumb">'.esc_html(single_tag_title('',false)).'の記事一覧</li>';
}
}
// タクソノミー(カスタム分類)の場合
elseif(is_tax())
{
// ページ数が1より大きい場合(○ページ目)を追加して格納する
if($page > 1)
{
$breadcrumb_lists .= '<li itemscope itemtype="http://data-vocabulary.org/Breadcrumb">'.esc_html(single_term_title('',false)).'の記事一覧('.$page.'ページ目)</li>';
}
// ページ数が1の場合は(○ページ目)はなしで格納する
else
{
$breadcrumb_lists .= '<li itemscope itemtype="http://data-vocabulary.org/Breadcrumb">'.esc_html(single_term_title('',false)).'の記事一覧</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))
{
$breadcrumb_lists .= '<li itemscope itemtype="http://data-vocabulary.org/Breadcrumb">'.$category_list.'</li>';
}

// 2ページ目以降の場合
if($page > 1)
{
// カスタムフィールドに値があったらその値を格納する
if(!empty($seo_title))
{
$breadcrumb_lists .= '<li itemscope itemtype="http://data-vocabulary.org/Breadcrumb">'.$seo_title.'</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 itemscope itemtype="http://data-vocabulary.org/Breadcrumb">'.esc_html(get_the_title()).'【'.$split_title.'】</li>';
}
// それ以外は(○ページ目)を加える
else
{
$breadcrumb_lists .= '<li itemscope itemtype="http://data-vocabulary.org/Breadcrumb">'.esc_html(get_the_title()).'('.$page.'ページ目)</li>';
}
}
}
// 1ページ目の場合
else
{
// カスタムフィールドに値があったらその値を格納する
if(!empty($seo_title))
{
$breadcrumb_lists .= '<li itemscope itemtype="http://data-vocabulary.org/Breadcrumb">'.$seo_title.'</li>';
}
// カスタムフィールドに値がなかった場合
else
{
$breadcrumb_lists .= '<li itemscope itemtype="http://data-vocabulary.org/Breadcrumb">'.esc_html(get_the_title()).'</li>';
}
}
}
// カスタム投稿の場合
else
{
// タームがある場合のみ追加
if(!empty($term_list))
{
$breadcrumb_lists .= '<li itemscope itemtype="http://data-vocabulary.org/Breadcrumb">'.$term_list.'</li>';
}
$breadcrumb_lists .= '<li itemscope itemtype="http://data-vocabulary.org/Breadcrumb">'.esc_html(get_the_title()).'</li>';
}
}
// 固定ページ
elseif(is_page())
{
$breadcrumb_lists .= '<li itemscope itemtype="http://data-vocabulary.org/Breadcrumb">'.esc_html(get_the_title()).'</li>';
}
// 検索結果
elseif(is_search())
{
// ページ数が1より大きい場合(○ページ目)を追加して格納する
if($page > 1)
{
$breadcrumb_lists .= '<li itemscope itemtype="http://data-vocabulary.org/Breadcrumb">「'.esc_html(get_search_query()).'」で検索した結果('.$page.'ページ目)</li>';
}
// ページ数が1の場合は(○ページ目)はなしで格納する
else
{
$breadcrumb_lists .= '<li itemscope itemtype="http://data-vocabulary.org/Breadcrumb">「'.esc_html(get_search_query()).'」で検索した結果</li>';
}
}
// 404ページの場合
elseif(is_404())
{
$breadcrumb_lists .= '<li itemscope itemtype="http://data-vocabulary.org/Breadcrumb">お探しのページは見つかりませんでした</li>';
}
else
{
$breadcrumb_lists = $base_breadcrumb;
}
// パンくずリスト成形
if(!empty($breadcrumb_lists))
{
$breadcrumb_lists = '<ul>'.$breadcrumb_lists.'</ul>';
}
return $breadcrumb_lists;
}

上記のコードは、「WordPressでプラグインを使わずにパンくずリストを実装する」で紹介されているコードをGoogleリッチスニペットに対応させたものです。

functions.phpに上記のコードをコピペしたら、パンくずナビを表示させたい箇所に以下のコードをコピペしましょう。

<?php echo get_breadcrumb_list(); ?>

これでパンくずが表示されます。

当サイトでは装飾の関係上、以下のように記述しています。

<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サイトに高品質なパンくずナビをコピペで設置する方法をご紹介しました。

もうプラグインを使う必要はありません。
コピペだけで高品質なパンくずナビを実装することができます。

プラグインを減らしたい方は試してみてください。

この記事が気に入ったら【いいね】しよう!

Wordpressサイトのカスタマイズで
お困りではありませんか?

あなたのWordpressサイトを、ご希望に沿ってカスタマイズいたします。
次に該当する方は、お気軽にご相談下さい。

  • Wordpressサイトをカスタマイズしたいが、やり方が分からないで困っている。カスタマイズの知識が豊富な人に任せたい。
  • Wordpressサイトをカスタマイズしたいが、自分でカスタマイズする暇がない。カスタマイズが得意な人に丸投げしたい。
  • Wordpressサイトをカスタマイズしてみたが、上手くカスタマイズできなかった。カスタマイズ経験が豊富な人に任せたい。
  • Wordpressサイトをカスタマイズしてみたら、バグが発生して困っている。正常に動作するように正しくカスタマイズしてほしい。

一つでも該当する方は、以下のリンクからチェックしてみてください。

詳細を確認する

著者:とあるWEBディレクター

岡山在住のWebディレクターです。Wordpressを使ったWEBサイト制作を中心に7年間ほど活動させていただいています。

Wordpress関連の記事でお役に立てれば幸いです。

【関連記事】あなたが興味のありそうな関連記事をご紹介します。

  • 2017-07-18

    WordPressで画像に自動的に追加されるクラス名を変更する

    WordPressで画像に自動的に追加されるクラス名を変更する方法をご紹介します。画像タグに自動挿入されるクラスを丸ごとオリジナルのクラスに置き換えたい方は参考にしてください。カスタマイズはコピペだけで行えます。 記事を読む

  • 2017-05-01

    WordPressのログインユーザーかどうかで条件分岐させる方法

    Wordpressのログインユーザーかどうかで条件分岐させる方法をご紹介します。ログインユーザーにだけコンテンツを表示させたり、一般訪問者と表示させるコンテンツを切り替えたりすることができます。4分だけこの記事を読んでみてください。 記事を読む

  • 2015-04-11

    一括削除!不要になったカスタムフィールド名を削除するならDeleteCustomFieldsで決まり!

    不要になったカスタムフィールドの変数をプラグインのDeleteCustomFieldsで削除する方法をご紹介しています。不要なカスタムフィールドが増えて困っている方は参考にしてください。5分程度でカスタムフィールドをスッキリとさせることができます。 記事を読む

  • 2015-02-09

    WordPressのログイン画面に任意のメッセージを表示させる方法

    WordPressのログイン画面に任意のメッセージを表示させる方法をご紹介します。ログイン画面にメッセージを表示させたい片は、参考にしてください。 記事を読む

  • 2017-08-12

    既存サイトをWordPress化する6つのメリットと2つのデメリットをまとめてみました

    既存サイトをWordpress化するサービスを運営していると、既存サイトをWordpress化するメリットってなんですか?と聞かれることが多々あります。そこで、既存サイトをWordpress化するメリットをまとめてみました。 記事を読む

コメントを残す


(必須)

CAPTCHA