schema.orgで営業時間を表現するためのopeningHoursというプロパティがあります。LocalBusinessやRestaurantにとって非常に重要な情報であるためしっかりマークアップしたいところです。
schema.org のマークアップ例
openingHours
のマークアップの方法は、schema.orgの該当項目を見てみると
The opening hours for a business. Opening hours can be specified as a weekly time range, starting with days, then times per day. Multiple days can be listed with commas ',' separating each day. Day or time ranges are specified using a hyphen '-'.
- Days are specified using the following two-letter combinations:Mo
,Tu
,We
,Th
,Fr
,Sa
,Su
.
- Times are specified using 24:00 time. For example, 3pm is specified as15:00
.
と説明されていて、ざっくり訳すと
営業時間は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
を使いなよということで、
<div itemscope itemtype="https://schema.org/LocalBusiness"> <p>Office Hours:</p> <p><data itemprop="openingHours" value="Mo-Fr 09:00-19:00">Monday-Friday: 9:00 am to 7:00 pm</data></p> <p><data itemprop="openingHours" value="Sa 10:00-17:00">Saturdays: 10:00 am to 5:00 pm</data></p> <p><data itemprop="openingHours" value="Su 11:00-16:00">Sundays: 11:00 am to 4:00 pm</data></p> </div>
という例をあげていました。なるほど要素的には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
をマークアップするのには一番良さそうですが、それはそれで別問題のような気がしますしね。