[WordPress] wp_insert_post()でhtmlタグが除去されるのを防ぐ

公開

スポンサーリンク

WordPressで独自に投稿を行う際に使うwp_insert_post()に、htmlタグを含む投稿をポストすると、必要なhtmlタグが除去されてしまう場合があります。WordPressはwp-includes/kses.phpで強力なテキストのサニタイズを行っており、なかなか外部からコントロールできません。

このたびhtml5のcanvasタグが含まれたテキストをwp_insert_post()経由で投稿する必要があったのですが、canvasが削除されてしまい四苦八苦しました。ちょうど良いフックがないか探したのですがなかなか見つからず途方に暮れていたのですが、ようやく見つかったのでメモしておきます。

remove_filter('content_save_pre', 'wp_filter_post_kses');
$post_id = wp_insert_post( $post );

投稿がセーブされる前のタイミングで、remove_filter('content_save_pre', 'wp_filter_post_kses')を実行し、サニタイズが行われないようにすればpost_contentからhtmlタグが除去されません。

remove_filter('content_save_pre', 'wp_filter_post_kses');
$post_id = wp_update_post( $post );

更新時にhtmlタグが除去されないようにするなら、wp_update_post()の前に行います。

このフィルターの他に、kses_remove_filters()を実行するやり方もあるのですが、この関数は内部で複数のremove_filterを行っています。本文だけでなく、タイトルや抜粋欄のサニタイズも行われなくなってしまいます。サニタイズの回避はセキュリティ上はあまりよくないことなので、必要最小限にしておきたいところです。なので、本文のサニタイズを回避したいだけであれば、kses_remove_filters()は使わない方が良いでしょう。

なお、投稿本文ではなく、抜粋のサニタイズを回避したい場合は以下のコードを使います。

//抜粋のサニタイズを回避
remove_filter('excerpt_save_pre', 'wp_filter_post_kses');

サニタイズの回避はセキュリティの問題を引き起こす可能性があります。特に、wp_insert_post()を使うようなシチュエーションですと、外部からの投稿を受け付ける際などに使っている場合もあるかと思います。こうしたケースにおいて、ここで書いた方法でサニタイズを避ける場合は、別の方法で入力値を検証する必要がありますのでご注意ください。

スポンサーリンク


Comment


  1. ななし : 投稿日:2015年3月17日 4:12 AM

    ちょうど同じような現象が発生して困っていました。
    見事解決しました!ありがとうございます。
    私の場合はobjectタグだったのですが、ずっと悩んでました・・・!