[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()を使うようなシチュエーションですと、外部からの投稿を受け付ける際などに使っている場合もあるかと思います。こうしたケースにおいて、ここで書いた方法でサニタイズを避ける場合は、別の方法で入力値を検証する必要がありますのでご注意ください。
スポンサーリンク
WordPressカテゴリーの投稿
- [WordPress] 記事が更新された回数を取得する
- [WordPress] ダッシュボードのウィジェットを表示オプションを使わずに非表示化する
- [WordPress] 関連記事をカテゴリーに基づきアイキャッチ画像つきで表示
- [WordPress] バックアッププラグインの特徴と機能比較
- [WordPress] タグ版wp_list_categories
- [WordPress] have_comments()がFALSEを返しコメントが表示されない現象
- [WordPress] 個別記事ページでカテゴリーを表示するときの目的別の方法
- [PHP] 文字長がnバイト以下になるまで末尾の文字を1字づつカット
- [WordPress] カテゴリー・タグ・カスタムタクソノミーを外部から登録・編集する
- [WordPress] カスタムフィールドで一つのキーに複数の値を保存