Wordpressのカスタマイズで記事のタイトルをURLエンコードしようとしたところ、タイトルに「&」が含まれる記事がうまくエンコードされない事案に悩まされました。
紆余曲折の末、HTMLエンコードされた文字列をURLエンコードしようとしていたのが良くなかったということが分かりました
HTMLエンコードとURLエンコード
フロント側ではHTMLエンコードとURLエンコードをよく使うかと思います。
ここで、両者の違いを再確認してみましょう
HTMLエンコード
HTMLで特殊文字をブラウザで出力する場合に使われるエンコードです。
&●●;のような出力結果になります。
URLエンコード
URLのパラメータなどに2バイト文字や特殊記号が含まれる場合に使われるエンコードです。
%●●のような出力結果になります。
「Love&Peace」というタイトルの記事でget_the_title();を呼び出すと…
get_the_title();は管理画面で入力した記事のタイトルがそのまま返ってくるという認識だったので、当然Love&Peaceが出力される思っていまいた。
しかし、実際はHTMLエンコードされるのでLove&Peaceが正解です。
つまり、Love&PeaceをURLエンコードした結果が欲しかったのに、Love&PeaceをURLエンコードしようとしていたのが原因でした。
たどり着いた解決策はこれ!
echo urlencode(html_entity_decode(get_the_title()));
今回エンコードしたいのはLove&PeaceではなくLove&Peaceなので、URLエンコードする前に&を&にする必要がありました。
このコードでやっていることは以下のようなことです。
1.html_entity_decodeを使ってHTMLエンコードされた文字列を一旦デコードする(&⇒&)
2.urlencodeを使って1.をURLエンコードをする(&⇒%26)
