マルチサイトでパンくずリスト(構造化データBreadcrumb:マークアップ:data-vocabulary.org)
ワードプレスのマルチサイトで、googleなどの検索エンジンに認識されるパンくずリストのコード作成例です。個別投稿記事(single.php)、カテゴリーページ、子サイトトップページで表示されます。ただし、親サイトのトップページと固定ページ(page.php)では属するカテゴリーがないため、表示されません。当サイトでは現在、このコードで動いています。
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
#breadcrumbs{ |
margin:0; |
color:#777; |
font-size:13px; |
} |
div#breadcrumbs div { |
display: inline; |
} |
#breadcrumbs span.sp{ |
margin:0 7px; |
color:#ff8000; |
} |
#breadcrumbs a{ |
text-decoration:none; |
color: #777; |
color:#0000ff; |
} |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
37 |
38 |
39 |
40 |
41 |
42 |
43 |
44 |
45 |
46 |
47 |
48 |
49 |
50 |
51 |
52 |
53 |
54 |
55 |
56 |
57 |
58 |
59 |
60 |
61 |
62 |
63 |
64 |
65 |
66 |
// カテゴリからIDとタイトルを取得 |
$category = get_the_category(); |
$cat_id = $category[0]->cat_ID; |
$cat_name = $category[0]->cat_name; |
// リストで使う各タイトルとタグを設定 |
$home = 'ホーム'; |
$bloginfo_name = get_bloginfo('name'); |
$cat_title='<span class="sp">></span><a href="'.esc_url(get_category_link($cat_id)).'" itemprop="url"><span itemprop="title">'.$cat_name.'</span></a>'; |
$post_title='<span class="sp">></span><span>'.mb_substr(get_the_title(), 0, 10, 'utf-8').'・・・</span>'; |
$category_title='<span class="sp">></span>'.$cat_name; |
// リストで使う各URLを設定 |
$category_url=(is_ssl() ? 'https://' : 'http://').$_SERVER["HTTP_HOST"].$_SERVER["REQUEST_URI"]; |
$network_url = network_home_url(); |
$home_url = esc_url(home_url( '/' )); |
// 親サイトと子サイトを条件分岐 |
if(is_main_site()){ |
// 親サイトのトップページを除外 |
if(!is_home()){ |
$content = <<<EOT |
<div id="breadcrumbs"> |
<div itemtype="http://data-vocabulary.org/Breadcrumb" itemscope=""> |
<a href="{$home_url}" itemprop="url"><span itemprop="title">{$home}</span></a> |
</div> |
EOT; |
} |
}else{ // ここから子サイトの処理 |
$content = <<<EOT |
<div id="breadcrumbs"> |
<div itemtype="http://data-vocabulary.org/Breadcrumb" itemscope=""> |
<a href="{$network_url}" itemprop="url"><span itemprop="title">{$home}</span></a> |
<span class="sp">></span> |
</div> |
<div itemtype="http://data-vocabulary.org/Breadcrumb" itemscope=""> |
<a href="{$home_url}" itemprop="url"><span itemprop="title">{$bloginfo_name}</span></a> |
</div> |
EOT; |
} |
// single pageの処理 |
if(is_single()){ |
echo $content; |
echo <<<EOT |
<div itemtype="http://data-vocabulary.org/Breadcrumb" itemscope="">{$cat_title}</div> |
{$post_title} |
</div> |
<!-- #breadcrumb --> |
EOT; |
} |
// categoryの処理 |
if(is_category()){ |
echo $content; |
echo <<<EOT |
<div itemtype="http://data-vocabulary.org/Breadcrumb" itemscope=""> |
<a href="{$category_url}" itemprop="url"><span itemprop="title">{$category_title}</span></a> |
</div> |
</div> |
<!-- #breadcrumb --> |
EOT; |
} |
// 親サイトのhome以外の子サイトのhomeの処理 |
if(is_home()&&!is_main_site()){ |
echo $content; |
echo <<<EOT |
</div> |
<!-- #breadcrumb --> |
EOT; |
} |
ワードプレスのマルチサイトでのパンくずリスト
3行目から5行目にかけてはWordPressのテンプレート関数からカテゴリーの情報を引き出しています。4行目は投稿ID、5行目はカテゴリーのタイトルを取得しています。7行目から11行目にかけては、リストで横並びに「>」で区切られて表示される文字列の設定です。実際の投稿記事では「ホーム」「子サイトトップページ」「カテゴリ名」「投稿記事タイトル」の順番で表示され、カテゴリーページでは、「ホーム」「子サイトトップページ」「カテゴリ名」、子サイトのトップページでは「ホーム」「子サイトトップページ」という順番で表示されます。
10行目では、「mb_substr」関数を使って、個別記事タイトルの文字を10文字に制限し、その後方に「・・・」と付け加えています。「mb_substr」は、「mb_substr(文字列, 開始位置, 取得する最大文字数, 文字コード)」の書式で、半角も全角も一文字として処理されます。似たようなものでは、「substr」と「mb_strimwidth」という関数もあります。「substr」の書式は「substr(文字列, 開始位置, 取得する最大文字数)」、「mb_strimwidth」の書式は「mb_strimwidth(文字列, 開始位置, 取得する最大文字数, 追加文字, 文字コード)」です。いずれも半角は一文字、全角は二文字として処理されます。
13行目はif文を省略した三項演算子を使って、httpsかhttpかを見分けて代入しています。この演算子の書式は、「条件式 ? 値1 : 値2;」です。条件式からtrueが渡されると値1を返し、falseが渡されると値2を返します。そのため、条件式はtrueかfalseを返す式でないと動作しません。is_ssl()は、SLLであればturueを返し、そうでない場合はfalseが返されます。
また、「$category_url=(is_ssl() ? 'https://' : 'http://').$_SERVER["HTTP_HOST"].$_SERVER["REQUEST_URI"];」を使わなくても「$category_url=(empty($_SERVER["HTTPS"]) ? "http://" : "https://").$_SERVER["HTTP_HOST"].$_SERVER["REQUEST_URI"];」の書式で動作します。「empty()」は変数が空であるかどうかを検査する関数であり、空であれば「true」となり、「条件式 ? 値1 : 値2;」の内、値1を返します。この「empty($_SERVER["HTTPS"])」は、「 !isset($_SERVER["HTTPS"])」としても同じことを意味し、更に「($_SERVER["HTTPS"] == false)」としても同じ結果が得られます。
「$category_url」は、カテゴリーページのURLを取得するために使っており、ワードプレスで用意されている「get_permalink()」を使ってもカテゴリーページにおいてはループ中に最初に呼び出されたURLが返されます。そのため、上記のような書式で取得しています。
17行目の「is_main_site()」は、親サイトか子サイトかを調べるテンプレート関数です。この条件分岐の中で更に親サイトのトップページのみを「!is_home()」で除外しています。
40行目は、「is_single()」によって投稿記事のみに限定しています。50行目では、「is_category()」を使って、カテゴリーページのみに限定し、61行目では、各ブログの中で親サイトのみ除外し、その他の子サイトでは表示されるようにしています。つまり、各ブログのトップページは「is_home()」で許可し、「&&演算子」に続く否定の「!is_main_site()」によって親サイトは除外されています。