WordPressのタグをurlエンコード
スポンサーリンクWordPressで運用しているサイトからAddClipsを外し、手製のコードでSBMにポストするリンクをつけたらAnother HTML-lintの得点が激減した。
deliciousとtwitterにポストさせるときに、2バイト文字が含まれるのが原因だった。Another HTML-lintで必ず90点以上になるようにしていたので、エラーレベル9とかを見て頭がくらくらした。
こんなもんURLエンコードですぐだろと思ったので、URLとエントリタイトルをurlencode()で変換することに。
例えばdeliciousにポストさせるコードはこう。
<a href="http://delicious.com/post?url=http://example.com&title=タイトル"> deliciousに登録する </a>
このサイトでは日本語URLを使っているので、WordPressタグで出力するURLとタイトルをエンコードしなければならない。なので下のようにした。
<a href="http://delicious.com/post?url=<?php echo urlencode( the_permalink() ) ?>&title=<?php urlencode( the_title() ) ?>"> del.icio.usに登録する </a>
ところがなぜかタイトルがURLエンコードされない。URLはちゃんとエンコードされている。
どーゆーこったと調べると、なんのことはない、the_permalink()とthe_title()で出力までやってくれるんですね。
なので、
<?php echo urlencode( the_permalink() ); ?>
とやっても、urlencode()とechoは効いていないのでした。
それにthe_permalink()で出力されるURLは、初めからちゃんとURLエンコードされていた。当たり前か。
それに対しthe_title()はURLエンコードされずに出力されるので、&title=以下の部分が2バイト文字のまま出力され、Another HTML-lintの点数を押し下げていたのでした。
なのでthe_title()だけを値として受けとればいい。
で、調べてみたところ、the_title()には引数を3つ設定できたのでした。
第一引数がタイトルの手前に表示させる文字列。
<h1><?php the_title("before:");?></h1>
こーなる。
<h1>before:タイトル</h1>
第二引数がタイトルの後ろに表示させる文字列
<h1><?php the_title( "" , ":after" );?></h1>
こーなる。
<h1>タイトル:after</h1>
で、第三引数をfaultにすると値として受け取ることができるようになる。
<?php $a = the_title("","",0); $a = urlencode( $a ); echo $a; ?>
%E3%82%BF%E3%82%A4%E3%83%88%E3%83%AB
これでようやく記事名をURLエンコードできたのでした。
最終的にはこういう感じ。
<a href="http://delicious.com/post?url=<?php urlencode( the_permalink() ) ?>&title=<?php echo urlencode( the_title( "" , "" , 0 ) ) ?>"> deliciousに登録する </a>
大したことではないんだろうけど、理由に気づかなくてものすごく時間がかかってしまった。いやあ勉強になった。