Broken Link Checker でコメント欄のURLにエラーが出る

Broken Link Checker  はWordPressでリンク切れチェックをしてくれるプラグインで、あちこちで活用させていただいているのですが、コメント欄に入れてもらったURLにリンク切れのエラーが時々出てきて、その内容が ん? 

だったので、調べました。

エラー:400 Bad Request の理由

コメント欄にコメントしてくれた訪問者が入力したURLにエラーがでてました。
そのURLはコメントをいれたページそのもののURL。

どうやら、コメントを入れてくれた方が、コメントを入れてくれたページのURLそのものをコピペで入れてくれたらしい。
そのWordPressサイトは日本語のスラッグを入れていたので、URIとしては結構長めになってまして、たとえばこんなかんじ。

http://hogeho.com/event/%E3%81%9F%E3%81%AE%E3%81%97%E3%81%84%E3%82%A4%E3%83%99%E3%83%B3%E3%83%88%E3%82%92%E3%81%9D%E3%81%AE%E3%81%86%E3%81%A1%E3%82%84%E3%82%8B%E3%81%AE%E3%81%A7%E3%82%88%E3%82%8D%E3%81%97%E3%81%8F%E3%81%AD/

で、日本語で表現すると、
hogeho.com/event/たのしいイベントをそのうちやるのでよろしくね/

みたいになるのですが、スラッグは全角なら22文字まで入るようになっていました。
それをめいっぱい使ったら、「たのしいイベントをそのうちやるのでよろしくね」となって、URIは223文字になってたということです。

で、ですね。この223文字のURIをコメント欄のURLにいれるとどうなるかというと、なんと勝手に200文字に縮められてしまうわけです。
最後の23文字を勝手に消してしまうのですから、そりゃリンク切れになりますよ。。

これはWordPressのバグか?

と初めは疑ったのですが、 しらべてみるうちに、WordPressのデータベースをみて答えがわかりました。

コメント欄の内容は、wp_commentsテーブルに格納されるのですが、
URLは、comment_author_urlカラムに格納され、その種別はvarchar(200)。

半角で200文字しか格納できないわけですね。
ほかのURLはというと、varchar(255)となっているので、255文字まで格納できるようになっています。
なのに、なんで wp_comments の comment_author_url が200文字までなのか、なぞです。

じゃ、このカラム comment_author_url をvarchar(255)に変えてしまったらいいんじゃね?と安直に思ったのですが、まぁまてよ。と調べてみたところ、そうもいかないようです。

というのも、wp_commentsはトラックバックにも使われてて、他のWordPressのサイトにURLを通知した時、200文字以上のURLだと受け取り側のWordPressで comment_author_url に格納できずにトラックバックのURLがリンク切れということになってしまいます。
つまり、送り側の comment_author_url  を255文字に変更しても、受け取り側のWordPressで200文字に勝手に縮められてしまうので、トラックバックでの問題が残ってしまう。ということです。

相手側のデータベースをいじることはできませんからね。
なので、根本的な解決方法は、スラッグを入れるときに、全体のURLが200文字を超えないように気をつける。ということになります。
人力ですけど。 (追記:editable_slugというフックを使えば、自動で制限もできしそう)

対策:スラッグの文字数を制限する

http://hogeho.com/event/たのしいイベントをそのうちやるのでよろしくね/

というURIなら、http://hogeho.com/event/で24文字となります。
コメントのURLは200文字までなので、残り176文字。

日本語でパーマリンクを設定した場合、全角一文字に半角9文字を使うのと、URIの最後に/がつくので、 (176-1)÷9≒19文字 ということで、日本語でスラッグをいれるときは19文字まで。とすれば、リンク切れは起きない。
はず。

ということは、「たのしいイベントをそのうちやるのでよろしく」は22文字なので、あらため、

http://hogeho.com/event/たのしいイベントそのうちやるのよろしく/

とすればOK。
そもそも、日本語のスラッグつけなければいいんですけどね。
でも、適切な日本語URLは、クリック率は上がると思うので。
あと、コメントを許可したり、トラックバックを使わないようなサイトでは気にしなくてもOK。

タイトルとURLをコピーしました