WordPressのPタグ、BRタグの自動整形に対処する

WordPressにはOffice並みのおせっかい機能、自動整形機能は邪魔である。何とか簡単に整理できないかと調べてみたが、あまり良い方法がない。しょうがないのでソース追いかけて調べてみた。

文字変換を止める

もっともまずいのがwptexturize。これは、クォート(引用符)、アポストロフィ、ダッシュ、省略記号などを変換してしまう。これは以下のところでフィルタとして設定されている。

wp-includes/default-filters.php: add_filter( $filter, 'wptexturize' );
wp-includes/default-filters.php: add_filter( $filter, 'wptexturize' );
wp-includes/default-filters.php: add_filter( $filter, 'wptexturize' );
wp-includes/default-filters.php:add_filter( 'the_title', 'wptexturize' );
wp-includes/default-filters.php:add_filter( 'the_content', 'wptexturize' );
wp-includes/default-filters.php:add_filter( 'the_excerpt', 'wptexturize' );
wp-includes/default-filters.php:add_filter( 'comment_text', 'wptexturize' );
wp-includes/default-filters.php:add_filter( 'list_cats', 'wptexturize' );

タイトル関連はそのままでもまぁ良いとして、 WordPressを使い始めるには、最低限the_contentのフィルタを削除しておきたい。

具体的には、テーマのfunctions.phpにて、remove_filterを使う。

remove_filter('the_title', 'wptexturize');
remove_filter('the_content', 'wptexturize');
remove_filter('the_excerpt', 'wptexturize');

これでダブルクォート入力した文字が勝手に変換されなくなる。コメントやカテゴリは変換されても困らないケースが多いので、そのままにしておくというのも手。

PタグやBRタグが壊されるのを止める

WordPressの標準の状態だと、pタグを自動的につけてくれるのは良いが、改行を削りすぎたり、逆にHTMLソースで投稿を入力した場合にPタグやBRタグが壊されてしまう。

これはwpautopというフィルタが動作しており、PHPとJSの両方で処理がなされている。いろいろネット上を調べてみると、どうもJS側の設定を理解しないまま説明している解説が多く、PHPのwpautopのフィルタだけを削除する設定を紹介する形で結果的に混乱してしまっているケースが多いようだ。

上記のwptexturizeと併せて、以下の設定をテーマのための関数 functions.phpに記述しておけば、Pタグの自動挿入は行われつつ、HTMLソースもほとんど壊されないで済むようになる。

// オートフォーマット関連の無効化
add_action('init', function() {
	remove_filter('the_title', 'wptexturize');
	remove_filter('the_content', 'wptexturize');
	remove_filter('the_excerpt', 'wptexturize');
	remove_filter('the_title', 'wpautop');
	remove_filter('the_content', 'wpautop');
	remove_filter('the_excerpt', 'wpautop');
	remove_filter('the_editor_content', 'wp_richedit_pre');
});

// オートフォーマット関連の無効化 TinyMCE
add_filter('tiny_mce_before_init', function($init) {
	$init['wpautop'] = false;
	$init['apply_source_formatting'] = ture;
	return $init;
});

タイトル文字用の文字置換を止める

タイトル部の文字については、さらにsanitize_title_with_dashesというフィルタも実行されている。タグの除去や小文字にしたりパーセントエンコードを直したりと、それなりに親切でもあるが、これも意図しない文字にされてしまうことが多いので、削除しておくのが無難である。

remove_filter('sanitize_title', 'sanitize_title_with_dashes');

ただし、これには問題があってフィルタ削除によって日本語のパーマリンクがきちんと機能しなくなる。正確にはこのフィルタを削除すると、パーマリンクをエンコードしてデータベースに格納しなくなり=日本語のままデータベースに記述してしまう問題があり、URLエンコードされた文字と生の日本語を比較することになって、固定ページ、投稿ページともに404となってしまう。

日本語URLを使わないと決めているときだけ利用するように注意。

どうしても日本語URLを使いたい場合は、フィルタを削除したうえで、エンコードフィルタを追加しておけば良い。

remove_filter('sanitize_title', 'sanitize_title_with_dashes');
add_filter('sanitize_title', function($title, $raw_title = '', $context = 'display') {
	if (seems_utf8($title)) {
		$title = utf8_uri_encode($title, 200);
	}
	return $title;
});