schema.orgで営業時間を表現するためのopeningHoursというプロパティがあります。LocalBusinessやRestaurantにとって非常に重要な情報であるためしっかりマークアップしたいところです。
schema.org のマークアップ例
openingHours
のマークアップの方法は、schema.orgの該当項目を見てみると
と説明されていて、ざっくり訳すと
営業時間は1週間の範囲の中から指定することができます。営業日は曜日を表す2文字の組み合わせ(Mo
,
Tu
, We
, Th
, Fr
,
Sa
,
Su
)をカンマ区切りで指定し、時間は24時間表記で開始時間-終了時間
の形式で指定します。
火曜日と木曜日の午後4時から午後8時までの営業時間をマークアップした例は下記の通り
<time itemprop="openingHours" datetime="Tu,Th 16:00-20:00">Tuesdays and Thursdays 4-8pm</time>
time要素を使ってdatetime属性に値を記述しています。営業時間に限らずschema.orgでは、時間に関するプロパティのマークアップはtime要素とdatatime属性を推奨しているみたいですね。
time
要素的にどうよ
ただ、先ほどの記述例に倣ってマークアップすると、HTML5のtime
要素の仕様に反してしまいます。
エラー画面からリンクされている
time
要素のシンタックスを参照すると、schema.orgの例にあるような、1週間の繰り返しのうち何曜日と何曜日、という指定はありません。
datetime
属性のシンタックスでは、Weeksで特定の週を(例:2015年の34週目)、Durationsではある期間を示すことが可能ですが、繰り返しを意味するシンタックスはありません。
よって、schema.org
の例ではシンタックスエラーになります。datetime
の値はシンタックスエラーの場合にマシンリーダブルではなくなるのでよろしくないと考えました。
よろしい、ならばdata
要素だ
schema.orgのopeningHours
の取りうる値はマシンリーダブルな形式なので、そのまま画面に表示すると、人間には分かりにくい表現となります。よってspan
要素内のテキストをopeningHours
の値にするマークアップは避けたい...
[1]
どうしたものかと調べていると、同じ境遇の方にStack Overflowで出会いました。
Stack
Overflowの回答者は、time
の代わりにdata
を使いなよということで、
という例をあげていました。なるほど要素的にはtime
のように、value
属性を見てくれるはず、と早速
data
でマークアップしてみました。
(※そもそもtime
は一旦仕様から外れかけてdata
に統合されそうでしたね)
ところがStructured Data Testing
Toolで検証したところ、value
属性の値ではなく要素内のテキストが読まれていました。
Micorodata周りの仕様を見ても、data
のvalue
で大丈夫なはずなんだけどなー。うーん。
最後は万能 meta
要素
ということで、最後はMicrodataの困ったときのspan
or
meta
ってことでmeta
を使ってみます。
<div itemscope itemtype="https://schema.org/LocalBusiness">
<dl>
<dt>営業時間</dt>
<dd>
毎日元気に営業中!!!!!!!!!!
<meta itemprop="openingHours" content="Mo-Su" />
</dd>
</dl>
</div>
Structured Data Testing
Toolで検証すると、当たり前ですがcontent
の値が使われてます。
まとめ
ということで、
-
time
要素 -
data
要素 -
meta
要素
の3つを使ってマークアップして検証してみましたが、time
要素は、datetime
属性のシンタックスに当てはまらない。data
要素は、value
属性の値が拾われない。ということで、今のところはmeta
要素で行こうかなと思っています。
ただ、data
要素の値が拾われているか拾われていないかは、Testing
Tool上のことですので、Microdataの仕様にある例に倣ってdata
を使用するのも良いと思います。
time
要素のdatetime
属性のフォーマットが拡充されればopeningHours
をマークアップするのには一番良さそうですが、それはそれで別問題のような気がしますしね。