「テキスト」モードと「ビジュアル」モードを行き来すると投稿内容の一部が消える

説明

仕事がらサイトの引っ越し作業のお手伝いをすることがあるのですが、今回は引っ越しにあわせてWordPressを「3.7.1」から最新版「4.1.1」にアップデートすることになりました。ここで紹介するのはこの案件で発生したトラブルの話です。

最初に遭遇したのは『投稿編集ページで「プレビュー」ボタンを押しても編集中の内容が表示されない』というもの。これは調べてみると、プラグイン「Custom Field Template」を使用していたのですが、バージョンがちょっと古い「2.1.8」でJavaScriptでエラーが発生していたことが原因でした。最新版「2.3」にアップデートして無事解決できました。

次に遭遇したのが『投稿編集ページで「テキスト」モードと「ビジュアル」モードを行き来すると投稿内容の一部が消える』というもの。まず「投稿内容のid属性などを保存するための対策」で取り上げた問題かなと思ったのですが、実際に消えたタグを確認した感じだとこれとは別の問題でした。

具体的な症状を確認するため、開発環境(WordPress 4.1.1)で投稿内容を数パターン試して検証してみました。

「テキスト」モードの投稿内容「ビジュアル」モードに変えて戻ってきた時の投稿内容変化
<div><form><select></select></form></div><div></div>あり
<form><select></select></form><form><select></select></form>なし
<div><select></select></div><div></div>あり
<div><select><option>a</option></select></div><div><select><option>a</option></select></div>なし
<div><select></select><button>submit</button></div><div><select></select><button>submit</button></div>なし
<div><form><select><option>a</option></select></form></div><div><form><select><option>a</option></select></form></div>なし
<div><form><select></select><button>submit</button></form></div><div><form><select></select><button>submit</button></form></div>なし

以上のことから、div要素の中に空のselect要素が含まれ、かつその他のフォーム要素がない場合、そのselect要素のほかに親のform要素も削除されてしまう感じです。今回引っ越ししたサイトには、この削除されるパターンを含んだ投稿が複数保存されており、何らかの対策を速やかに行わなければなりません。そんなわけで関連しそうなワードでググってみたところ、次(WordPressの「使い方全般」フォーラム)のページが見つかりました。

[解決済み] spanタグが削除される (7 件の投稿)」によると、投稿編集ページの初期化時において投稿内容についHTMLとして適切か調べて不適切な部分は削除される機能が働くことがわかりました。この機能を動作させないためには、次のコードをテーマ内のfunctions.phpに記載すればいいとなっています(コードはそのまま引用させていただきます)。

add_filter('tiny_mce_before_init', 'tinymce_init');
function tinymce_init( $init ) {
	$init['verify_html'] = false;
	return $init;
}

早速このコードを試したところ、無事解決できました(stranger-jpさん、ありがとう)。見つかったページではh3要素内のspan要素が消えるという症状ですが、本件と原因は同じようです。

総論、WordPressのアップデートをまめに行っていれば今回のような事態にはならないでしょう(なぜなら、アップデート時に遭遇し、その時点で解決しなければならないので)。いくつかのバージョンを飛び越えてアップデートするときは複数の不具合に遭遇する確率が上がるので、注意が必要ですね。


最終更新 : 2018年05月27日 10:46


お勧め

the_title(2018年5月27日 更新)

string the_title( [ string $before = '' [ , string $after = '' [ , bool $echo = true ] ] ] )
投稿情報のタイトルをパラメータ$echoがtrueならば表示する。$echoがfalseの場合は表示せず、取得する。

wp_check_for_changed_dates(2018年5月27日 更新)

void wp_check_for_changed_dates( int $post_id, WP_Post $post, WP_Post $post_before )
更新された公開済みの投稿情報の公開日を保存する。

is_robots(2011年10月31日 更新)

bool is_robots( )
ロボットリクエストなのか調べる。

show_admin_bar(2012年1月5日 更新)

void show_admin_bar( bool $show )
ツールバー(admin bar)を強制的に表示/非表示する。

get_attached_file(2015年4月28日 更新)

string get_attached_file( int $attachment_id [ , bool $unfiltered = false ] )
添付ファイルのパス名を取得する。