ソーシャルボタンを XHTML の環境に Valid な状態で設置する。ちょっとインチキだが,XHTML に対応していないソーシャルボタンに対しては,パーセントエンコードして Valid にした後,デコードしてボタンを表示させることにする。どの記事でも同じコードで済むように書くことにする。
重い腰を上げ,ようやくブログにソーシャルボタンを設置することにした。このブログの現在のマークアップ環境は「-//W3C//DTD XHTML+RDFa 1.1//EN」である (nlog(n): OGP 対応と XHTML+RDFa 1.1 への移行)。このブログは Movable Type を使って構築されているが,今回のソーシャルボタンの設置法は,Movable Type である必要はない。
↑
今回導入するボタン (画像です。クリックできません)。
ソーシャルボタンを導入する際の条件を次のように決めておく。
W3C で Valid であるというお墨付きをもらうことが必須である。HTML-lint の満点は諦めることにする。実際,HTML-lint は,現時点 (htmllint.cgi 1.28 / htmllint.pm 3.58) では XHTML + RDFa 1.0 までしか対応していないため, XHTML + RDFa 1.1 である時点でどうやっても満点は取れないのである。ただし, XHTML + RDFa 1.1 以外の問題がまったくない状態にはしておきたい。
ソーシャルボタンを設置することで期待される効果は次のようなものである。
実際は,ソーシャルボタンをつけることで,リンクやツイートの数が表示されるだけである。だが,その数に「0」が並ぶことは想像に難くないのであって,それを見ることで精神の崩壊が起こる可能性もあるわけである。「やってらんねー」とか言ってアルコール摂取量が増えたとしたら,それはすべてソーシャルボタンのせいなのである。今まで目を背けていたことが,常に見えてしまうという事態が発生するからである。
ソーシャルボタンをつけると,そのボタンを押せば,リンクをソーシャルサービスに投稿するアクションが起こるようになる。もしボタンがついていなければ,利用者はソーシャルサービスにサインインしてからブログを見に来なければならない。しかし,ボタンがついていることで,投稿のアクションを起こした後でサインインすればいいという逆の流れが可能になるのである。このような,流れを逆転することで便利になるという仕組みは,Movable Type に出合った頃にも出合って驚いたことがある。Movable Type 用のブックマークレットがそうだった (nlog(n): ブックマークレットとは?)。
ソーシャルボタンには,「ソーシャル」というだけあって,他人とのつながりも期待できる。例えば,誰がツイートしたのか,誰がはてなブックマークをつけたのかが分かる。そうすれば,このブログを通じて知らない人たちが知り合うというきっかけにもなる。そうやって知り合うことは万が一にもないだろうが,可能性としてはゼロではない。Facebook の場合は誰が「いいね」しているのか分からない。ソーシャルに対する考え方が違うためである。
ソーシャルボタンは,各ソーシャルサービスが公式の導入方法を公開している (ソーシャルボタンの設置方法まとめ - NAVER まとめ)。ソーシャルサービスが提供する方法の他に,それらをまとめて設置するための jQuery プラグインを導入する方法もある (Pinterest/Google+1/Twitter/facebookいいね/facebook Share/mixiチェック/mixiイイネ/GREEいいね/Evernote/はてブのボタンを超カンタンに作れる jQuery.socialbutton プラグインを作ったよ | アイトランス株式会社)。
ソーシャルボタンは,各個別記事に設置し,まとめて複数の記事が表示されるアーカイブには設置しないことにする。ソーシャルボタンを呼び出す際に,URL やタイトルが必要な場合があるが,それらは JavaScript の document.URL や document.title で与えてやることにする。そうすれば,どの記事に対しても同一のソースで書くことができ,しかも Movable Type 以外にも適用することができる (人気ソーシャルボタン(facebookいいね・tweetボタン・はてぶ・googleプラス)を1ソースで設置する : code14)。
そして,最も重要なことは,最初の条件にあげたように The W3C Markup Validation Service に合格することである。実は,今まで導入をためらってきたのは,ソーシャルボタンを導入することで XHTML として正しくなくなってしまうからだったのである。しかし,無理矢理にでも XHTML Valid にする方法があることが分かった。ソーシャルボタン導入のための背中を押してくれたのは 減点されないソーシャルブックマークボタン | ナメサメカリンチョ の記事である。
(グーグル プラスワン) ボタン表示用のコードは HTML 5 の文法のコードとそうでないコードがあります。そうでない方がデフォルトです。HTML 5 ではない方のコードでボタンを設置すると Another HTML-lint gateway で減点されることはありませんが、W3C の XHTML 認定 には合格しません。HTML 5 の文法のコードだと減点される上に合格しません。これは根本的な問題なので twitter ボタンのように改変することもできません。こうなったらゴリ押しです。
仕組みとしては次のようになる。
エンコードには Unescape Encoder/Decoder を使う。デコードもできるので,とても便利。
スクリプト内は CDATA で囲むという提案があるが (Google Plus One Button Won’t Validate Strict XHTML « Too Much White Space),HTML コメントの方がまだましらしいし (XHTML文書におけるJavaScriptの使用上の注意点),コメントにしたとしても HTML-lint の評価が思わしくないので,何もしないことにした。
その他,細かいことではあるが,ボタン表示用のタグには明示的に何のボタンであるかを入れていくことにする。例えば,グーグルプラスワンボタンであれば,公式のコードは
だが,
のように書くことにする。理由の一つとしては,タグの間が空だと HTML-lint に指摘されるからである。どうせボタンによって上書きされるので,何が書いてあっても構わないのである。また,もしソーシャルサーバがダウンしているときにでも,それが何のボタンであるかが分かるという利点もある。タグの間に幅ゼロの文字を入れたい場合は「‌」と書けば HTML-lint には問題を指摘されない。
導入するボタンは上にバルーンで数が表示されるボックス型で統一することにする。
公式サイトにアクセスし (Twitter / Twitterボタン),コードを取得する。ボックス型にするには,さっとマニュアルに目を通すと「data-count="vertical" を追加する」とあるが,XHTML の「a」タグには「data-count」属性は存在しないのでまずい。そこで,マニュアルをもっとよく読むと,https://twitter.com/share のクエリ文字列として「count=vertical」を指定すればよいと書いてあるのでそうする (Tweet Button | Twitter Developers)。
ボタンを表示したい部分には次の HTML コードを書く。
body 閉じタグの前に次の JavaScript コードを書く。公式サイトからコピペするだけで OK だが,script タグには type="text/javascript" を追加しておくことを忘れずに。
はてなブックマークボタンは,2011年の公開当初は,利用者の行動情報を取得する版が使われていたが,問題があったために行動情報を取得しないものに差し替えられた (はてなブックマークボタンから収集した行動情報の第三者提供をやめます - はてなの日記 - 機能変更、お知らせなど)。ソーシャルボタン用のコードは はてなブックマークボタンの作成・設置について - はてなブックマーク から取得できる。例えば次のようなものである。
「アドレス」には URL を,「タイトル」には記事のタイトルを入れる。これには JavaScript の機能を使って document.URL, document.title を document.write することにする。しかし,script タグの中には a タグや img タグを入れることができない。しかも,a タグには data-hatena-bookmark-title 属性や data-hatena-bookmark-layout 属性はない。そこで,HTML のコード部分をパーセントエンコードして,document.write する際に unescape するというワザを使う。コードの可読性は極端に悪くなり,「あんた何いってんの」状態になるが,Valid 獲得を捨てるわけにはいかない。訳が分からなくて変態的なコードになっても Valid を通すというのが男である。
Unescape Encoder/Decoder を使って,アドレスとタイトル以外を細切れにしてエンコードし,それをつなぎ合わせる。最終的にボタン表示したい部分には次のように書くことになる。
心なしか吐き気をもよおすコードが出来上がったが,以上である。body 閉じタグの前には次のコードを置く。
XHTML では,はてなブックマークの非同期オプションである async 属性は許されないので削除する。このブログの文字コードは EUC-JP であるが,スクリプトの文字コード指定は charset="utf-8" となっている。これはスクリプトのソースがあるサーバの文字コードである。
Google プラスワンボタンも公式サイトからコードを入手する (+1 ボタン - Google+ Platform ― Google Developers)。ボタン表示をしたい部分に設置したいのは次のコードであるが,
data-size 属性は許されないので,次のようにする。はてなブックマークができてしまえば,こんなのは何ともない。
body 閉じタグの前に置くコードは公式サイトのコピペで OK。
これも XHTML としてはダメなので,代わりに次のように書く。
body 閉じタグの前は次を。
Facebook も公式サイトからコードを取得する (Like Button - Facebook Developers)。提供されるコードには HTML 5, XFBML, IFRAME の3種類がある。XFBML は独自すぎるし,IFRAME は XHTML では使えない。そこで,HTML 5 用のコードを使う。
HTML 5 のコードはそのまま XHTML では使えないので,これも同様にパック詰め。
Facebook の場合,appID を取得して,自分の Facebook ページと関連付けると Facebook のニュースフィードに表示されたり,Facebook インサイトが使えるよいうになるなどいいことがあるらしいが (FacebookのOGPに fb:admins と fb:app_id の設定は必要?htmlタグのxmlnsは? | Cappee Design),私は Facebook ページとブログは切り離しておきたいので,appID の記述はしていない。appID がなくても Debugger - Facebook Developers で警告表示されない。
body 閉じタグの前には次を。
Facebook は <div id="fb-root"></div> が謎。幅ゼロの文字 ‌ を入れて HTML-lint の警告をパスする。
並べ方,すなわち見た目も重要である。このブログでは,以上のボタン表示コードを,
の形式で XHTML ソース内には書いておき,CSS では次のように指定している。
できあがりはこの記事の冒頭の通りである。そして,すべてのブログ記事に適用したところ,北風が心を吹き抜けた。あまりにもゼロが並んでいるのは印象が悪過ぎである。客の入っていない店が入りづらいのと同じだ。「信用できないから誰も来ていない」みたいな。
「すべては現状を受け入れることから始まる」
って言われてもねぇ (泣)
2013年11月28日追記:
Delicious ブックマークボタンを追加しました (nlog(n): Delicious の縦型ソーシャルボタンを自力で作る)。
Master Archive Index
Total Entry Count: 1957