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

「テキスト」モードと「ビジュアル」モードを行き来すると投稿内容の一部が消える - バージョンアップ時は気をつけないとね

説明

仕事がらサイトの引っ越し作業のお手伝いをすることがあるのですが、今回は引っ越しにあわせて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のアップデートをまめに行っていれば今回のような事態にはならないでしょう(なぜなら、アップデート時に遭遇し、その時点で解決しなければならないので)。いくつかのバージョンを飛び越えてアップデートするときは複数の不具合に遭遇する確率が上がるので、注意が必要ですね。

関連

  • add_filter - フィルター関数を追加する

お勧めコンテンツ

the_post_navigation(2014年12月24日 登録)

void the_post_navigation( [ array $args = array() ] )
投稿ページ向けのナビゲーションを表示する。

wp_get_post_terms(2011年6月2日 登録)

mixed wp_get_post_terms( [ int $post_id = 0 [ , string $taxonomy = 'post_tag' [ , array $args = array() ] ] ] )
投稿記事のタクソノミー情報を取得する。

get_post_types(2013年12月19日 登録)

array get_post_types( [ array $args = array() [ , string $output = 'names' [ , string $operator = 'and' ] ] ] )
投稿タイプ情報を列挙する。

wp_kses_allowed_html(2013年12月26日 登録)

array wp_kses_allowed_html( [ string $context = '' ] )
有効なHTMLタグ情報を取得する。

delete_post_meta_by_key(2014年3月17日 登録)

bool delete_post_meta_by_key( string $post_meta_key )
カスタムフィールドの値を一括削除する。

最終更新日時 : 2015-03-21 21:24