wordpressで、rel="category tag"が、html5でvalidじゃないと怒られる件とその対処
怒られちゃいました
W3C が提供している、構文チェックサービス「Markup Validation Service」を使ってこのサイトをhtml5でチェックしてみたら、次のようなエラーがたくさん出てきました。
Bad value category tag for attribute rel on element a: The string category is not a registered keyword or absolute URL. Whitespace in path component. Use %20 in place of spaces.
rel属性がとれるキーワードに、「category」なんてものはないですよ、と怒ってるみたい。
怒られた原因をもう少し追求してみる
そもそも、relってどんな値がとれるか、調べてみました。仕様書を見たら書いてますね。
ここを見ると、tagという値はあるけど、確かにcategoryはありません。
それで怒っていたのか―、と思ったのですが、ふと、なぜにこんな厳しくなったんだろう、と疑問がわいてきました。html5以前で、relの値で怒られたことなんて記憶にありません。
そこで、実験的にDoctypeを、xhtml 1.0 や html 4.01などでチェックしてみます。すると、relのところでは怒られません(もちろん、他の場所でいっぱい怒られますがw)。
そこで、html 4.01ではこのrelはどんな値がとれるか、調べてみました。これも仕様書を見に行きます。relは、リンクタイプを値にとることができ、その一覧が下に掲載されています。
ここを見ると、tagもないし、categoryもありません。当然ですね。この2つはブログが流行り出してからできたものなので。
では、なぜ怒られないのでしょう。実は上で挙げた値一覧の下側に、次のようにかかれています。
Authors may wish to define additional link types not described in this specification. If they do so, they should use a profile to cite the conventions used to define the link types.
つまり、一覧にのっていない値を使いたいときは、プロファイルってのを使ってね、ってことみたいです。ここでは、あんまりプロファイルを深追いしませんが、一応ユーザーが値を拡張して使用することはできるみたいです。
本来はプロファイルが使われていない状態で、relを拡張してはいけないのかもしれません。が、html4やxhtmlでは定義されていない値を使っても、構文チェックはスルーされるみたいですね。
では、html5ではどうかかれているのかを見てみます。これも、値一覧の、かなり下の方に次のように書かれています。
4.12.5.14 Other link types Extensions to the predefined set of link types may be registered in the microformats wiki existing-rel-values page.
どうやら、独自の値を使いたければ、microformats wiki に登録するように変わったみたいです。
さらに下の部分で、こうも書かれています。
Types defined as extensions in the microformats wiki existing-rel-values page with the status "proposed" or "ratified" may be used with the rel attribute on link, a, and area elements in accordance to the "Effect on..." field.
html5より前は、独自にプロファイルを作って定義していましたが、html5では、使いたい人がmicroformats wikiに値や意味を登録し、それを拡張としてみんなが使えるようにする、というやり方に変わったみたいですね(採用されるかどうかはチェックが入ります)。
で、その一覧がどこにあるかというと、HTML5 link type extensions にあります。随時更新されているようです。
あれ、一覧にcategoryがあるぞ。。。笑
怒られないように対処してみる
構文チェッカーで、エラーの部分をよくよく見返してみると、次のように書かれています。
Syntax of link type valid for <a> and <area>: A whitespace-separated list of link types listed as allowed on <a> and <area> in the HTML specification or listed as an allowed on <a> and <area> on the Microformats wiki without duplicate keywords in the list. You can register link types on the Microformats wiki yourself.
もとの一覧にも、上で挙げたmicroformats wikiにもない値を使うなら、microformats wikiに自分で登録してね、ということです。
が、HTML5 link type extensions には、すでにcategoryが登録されているというオチ。
で、そもそも、validatorっていつ基準のデータで検査してるんだろうと調べてみたら、最新のバージョンは1.3で、リリースされた日は2012年3月とのこと。
で、microformats wikiに、relの値一覧にcategoryが登録された日を見てみると、2012年7月。
これか!これなのか!
そういうわけで、categoryはすでにrelのとれる値として登録されているんだけれど、validatorへの反映がまだ、ということです。そもそも、html5のチェックは、experimental、つまり、実験段階なので、仕方ないですね。
ということで、最終的な結論としては、今の段階でvalidにしたければ、wordpressが吐き出すrelからcategoryを取り除くという処理をしないといけません。
ま、やりかたとしては、the_categoryが吐き出すテキストを置換するという、とてもシンプルなものです。
下の内容をそのままfunctions.phpに放り込めば解決です。
function replace_rel( $text ) { $text = str_replace('rel="category tag"', 'rel="tag"', $text); $text = str_replace('rel="category"', '', $text); return $text; } add_filter( 'the_category', 'replace_rel' );
これで、rel関連のエラーはなくなりました!
validatorがcategoryにも対応したら、この部分を削除すればOKです。
関連するページ
最後に、関連するページを列挙しておきます。誰かの何かの参考になれば。
- Markup Validation Service
- W3Cが提供している、構文チェッカー。そもそもの発端はこれ。
- HTML5の仕様書
- aタグ、rel属性、リンクタイプなどを調べました。
- rel属性について
- rel属性について、html5とその前とで変わった点が書かれいています。Yahoo知恵袋での回答。かなり丁寧。
- HTML メタ情報プロファイル
- 本文中に出てきたプロファイルについて、深追いしているページ
- microformats wiki existing-rel-values page
- html5で、拡張として定義されているrelの一覧
- WordPress rel=”category” validation
- wordpressがはき出すテキストのrel属性をいじって、validにする方法。英語のページです。
- WordPressのカテゴリーリストからrel属性をカットする
- 上とほぼ同じ内容ですが、日本語です。いくつかのサイトでここを参照してたので挙げておきます。