WordPress : URLの & が #038; に変換されてしまう

WordPress

WordPressでは & を含むURLを見つけると、& を #038; に変換します。

これはHTMLの数値文字参照と呼ばれるもので仕様通りの正しい動作です。ブラウザは #038; を & として解釈するので、リンクとしては正しく動作します。

ここでは上記を踏まえた上で「URLにそのまま & を使いたい」という場合の解決方法を提示します。

すべての方法に何らかの制限があります。きちんと理解した上で実行してください。

方法1 : remove_filterを適用する

テーマ内の functions.php に以下の行を追加することで、各種文字列変換を抑止します。

この方法は & 以外の各種文字列変換も停止してしまうので、推奨できる方法ではありません。

remove_filter('the_content', 'wptexturize');	//	wptexturizeによる文字列変換をしない
remove_filter('the_content', 'convert_chars');	//	convert_charsによる文字列変換をしない

WordPressの自動変換機能の停止の仕方いろいろ(& → & 変換など) : WordPressをインストールしてみた [参考]
Function Reference/wptexturize « WordPress Codex
Function Reference/convert chars « WordPress Codex

方法2 : wp-includes/formatting.php を改造する

wp-includes/formatting.php に含まれる以下の行をコメントアウトすることで&の変換を抑止します。

この修正は手順を間違えるとWordPressが動作しなくなります。PHPプログラミングに馴染みのない場合、修正は推奨しません。

184行目付近、wptexturize関数内

// Replace each & with & unless it already looks like an entity.
$curl = preg_replace('/&([^#])(?![a-zA-Z1-4]{1,8};)/', '&$1', $curl);

1283行目付近、convert_chars関数内

// Converts lone & characters into & (a.k.a. &)
$content = preg_replace('/&([^#])(?![a-z1-4]{1,8};)/i', '&$1', $content);

formatting.php in tags/3.9/src/wp-includes – WordPress Trac [参考]

方法3 : 逆変換を行う

テーマ内の functions.php に以下の行を追加することで、#038;を&に再変換します。

function my_replace_amp($content) {
	return str_replace('&', '&', $content);
}
 
add_filter('the_content', 'my_replace_amp');

WordPressの自動変換機能の停止の仕方いろいろ(& → & 変換など) : WordPressをインストールしてみた [参考]

方法4 : 変換を抑止するプラグインを利用する

指定した範囲内の変換を抑止するプラグインが配布されているので、該当するプラグインを利用します。

たとえば「WP-No-Format」と言うプラグインを使うと、指定範囲内の文字列変換が抑止されます。

<!-- noformat on -->
I won't get formatted. // この部分はそのまま表示される
<!-- noformat off -->

WP-No-Format WordPress Plugin (Prevent HTML Code Formatting/Modification) | NeoEGM.com