投稿内容のid属性などを保存するための対策

投稿内容のid属性などを保存するための対策 - 3.4にアップデートして、投稿内容のid属性などが保存できなくなったら

説明

WordPress 3.4にアップデートしたとある環境で投稿記事を保存すると、divタグなどのid属性がクリアされて保存するようになった(id属性が保存できなくなった)。ここでは、その対策方法の1つを紹介しておく。
投稿を保存すると、divタグのid属性がごっそり抜けおちた

今回の症状は、投稿内容を入力し、「公開」または「更新」ボタンを押した際に、投稿記事内のdivタグのid属性がなくなるというものである。自分の場合、偶然にも同じような症状を経験しており、ツボはわかっていたのでさっそく調査してみた。

id属性を取り除くのは、投稿情報を保存する wp_insert_post 関数で呼び出される sanitize_post 関数である。この関数の中では投稿情報に不適切な文字が含まれていないか調べ、不適切な情報を除外しており、今回の例ではid属性が不適切な情報とみなされたため、削除されたことになる。もう少し内部までトレースしていくと、実際に取り除いているのはcontent_save_preフィルターに登録された wp_filter_post_kses 関数だということがわかった。

これらのことを踏まえた対処方は、自テーマのfunctions.phpにて、admin_initアクションを登録し、その中でcontent_save_preフィルターから wp_filter_post_kses 関数を除外することになる $allowedposttags['div'] 配列に'id'を追加する。

add_action( 'admin_init', 'your_admin_init' );
if ( ! function_exists( 'your_admin_init' ) ) {
	function your_admin_init() {
		remove_filter('content_save_pre', 'wp_filter_post_kses');
		global $allowedposttags;
		$allowedposttags['div']['id'] = true;
	}
}

すでにadmin_initアクションを使っている場合は、その関数内に青字のremove_filter2行を追加するだけでいい。なお、この対処方法は、自社運営サイトで発生した症状の対処方法であり、同様の症状であっってもこの対応では対処できない可能性がある。その点についてはご了承していただきたい。

関連

  • add_action - アクション関数を追加する
  • remove_filter - WordPressタグに登録されているフィルターを削除する

お勧めコンテンツ

is_single(2009年11月12日 登録)

bool is_single( [ mixed $post = '' ] )
要求されているページが、投稿か調べる。

wp_send_json(2012年12月12日 登録)

void wp_send_json( mixed $response, int $status_code = null )
AjaxリクエストのレスポンスとしてJSON情報を返す。

is_archive(2009年11月29日 登録)

bool is_archive( )
要求されているページが、アーカイブページか調べる。アーカイブページは、カテゴリーアーカイブページ、タグアーカイブページ、日付アーカイブページ(年別、月別、日別)に区別され、is_archiveはいずれのアーカイブページにもマッチする。

the_modified_date(2009年11月12日 登録)

void the_modified_date( [ string $d = '' ] )
パラメータ$dで指定したフォーマットで投稿データの更新日時を表示する。

add_dashboard_page(2011年5月31日 登録)

mixed add_dashboard_page( string $page_title, string $menu_title, mixed string $capability, string $menu_slug [ , mixed $function = '' ] )
ダッシュボードメニューにサブメニューを登録する。

最終更新日時 : 2012-06-15 21:04