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ってどんな値がとれるか、調べてみました。仕様書を見たら書いてますね。

html5でrelがとれる値一覧

ここを見ると、tagという値はあるけど、確かにcategoryはありません。

それで怒っていたのか―、と思ったのですが、ふと、なぜにこんな厳しくなったんだろう、と疑問がわいてきました。html5以前で、relの値で怒られたことなんて記憶にありません。

そこで、実験的にDoctypeを、xhtml 1.0 や html 4.01などでチェックしてみます。すると、relのところでは怒られません(もちろん、他の場所でいっぱい怒られますがw)。

そこで、html 4.01ではこのrelはどんな値がとれるか、調べてみました。これも仕様書を見に行きます。relは、リンクタイプを値にとることができ、その一覧が下に掲載されています。

html4.01で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属性をカットする
上とほぼ同じ内容ですが、日本語です。いくつかのサイトでここを参照してたので挙げておきます。
前の記事:
[css]折り返しリボンの作り方を解説するよ
次の記事:
ココナラで出品した商品が初めて売れた記念に、ココナラのコレカラを勝手に考えるよ。