【WordPress】管理者以外のユーザーでiframeタグを入力すると保存時に削除される
※本ページのリンクにはプロモーションが含まれています。
こんにちは、Ryohei(@ityryohei)です!
本記事では、WordPressで管理者以外のユーザーで投稿の本文やテキストエリアにiframeタグを入力すると保存時に削除される場合の対処法をご紹介しています。
管理者以外のユーザーでiframeタグで動画を埋め込みたいんだけど、保存すると消えてしまう…。どうすればiframeタグを保存できるのかな?
上記の疑問にお答えします。
では、解説していきます。管理者以外でiframeタグが削除される原因
WordPressのフォーラムを読み漁った結果、管理者以外のユーザーが投稿の本文等でiframe
タグを使用すると、wp-includes/kses.php
に記述されているkses_init()
の影響でiframe
タグが取り除かれることがわかりました。 kses_init()
は、入力フィールドを保存する際に適用されるフィルターで、内容としてはunfiltered_htmlという権限を持っていないユーザーに下記のフィルターを適用しますよ、というものです。
//wp-includes/kses.php function kses_init_filters() { // Normal filtering. add_filter( 'title_save_pre', 'wp_filter_kses' ); // Comment filtering. if ( current_user_can( 'unfiltered_html' ) ) { add_filter( 'pre_comment_content', 'wp_filter_post_kses' ); } else { add_filter( 'pre_comment_content', 'wp_filter_kses' ); } // Post filtering. add_filter( 'content_save_pre', 'wp_filter_post_kses' ); add_filter( 'excerpt_save_pre', 'wp_filter_post_kses' ); add_filter( 'content_filtered_save_pre', 'wp_filter_post_kses' ); }
上記関数は、WordPressが予め許可したHTMLの要素と属性以外を取り除く(無害化する)働きをするフィルターです。iframe
タグはデフォルトでは管理者以外のユーザーに使用する権限が与えられていません。そのため管理者以外のユーザーが入力フィールドに保存すると、上記フィルターによりiframe
タグが取り除かれる、というわけです。
色々と調べた結果、管理者以外のユーザーでiframe
タグを使用する場合は、下記のどちらかの対応が必要になります。
- 管理者以外のユーザーが
iframe
タグを使用できるようにホワイトリストに追加する - 指定した権限グループに
unfiltered_html
権限を追加してフィルターを無効にする
どちらもfunctions.php
に追加する方法になります。次項で詳しい設定方法をご紹介します。
iframeタグをフィルターのホワイトリストに追加する
管理者以外のユーザーがiframe
タグを使用できるように、iframe
タグをフィルターのホワイトリストに追加します。この方法は、iframe
タグや特定のHTMLタグのみをホワイトリストに追加したい場合に有効です。グローバル変数の$allowedposttags
に要素名の配列を追加し、値にHTMLタグで使用する属性を追加します。
下記はiframe
タグをホワイトリストに追加するサンプルです。実装の際に参考にしていただければ幸いです。
//wp-content/themes/theme-name/functions.php function my_content_save_pre($content){ global $allowedposttags; $allowedposttags['iframe'] = array( 'src'=>array() , 'title'=>array(), 'width'=>array(), 'height'=>array() , 'id' => array () , 'class' => array () , 'allow'=>array(), 'frameborder' => array() , 'scrolling'=>array(), 'marginheight'=>array(), 'marginwidth'=>array(), ); return $content; } add_filter('content_save_pre', 'my_content_save_pre');
以上でフィルターのホワイトリストにiframe
タグを追加し、管理者以外のユーザーでも保存ができるようになります。
権限グループにunfiltered_html権限を追加してフィルターを無効にする
もう一つは特定の権限グループにunfiltered_html
権限を追加する方法です。nfiltered_html
の権限を追加することで、HTMLタグを無効にするフィルターが適用されなくなります。便利な反面、追加した権限グループは投稿等でHTMLタグがすべて使用できるようになるため、取扱いにご注意ください。
権限グループにunfiltered_html
権限を追加する場合は下記のように記述します。get_role()
の引数に指定した権限グループにadd_cap('unfiltered_html')
で権限を追加します。
//wp-content/themes/theme-name/functions.php function my_add_caps(){ //寄稿者 $role = get_role('contributor'); $role->add_cap('unfiltered_html'); //投稿者 $role = get_role('author'); $role->add_cap('unfiltered_html'); } add_action('admin_init', 'my_add_caps');
以上で特定の権限グループにunfiltered_html
権限を追加し、HTMLタグが保存できるようになります。
最後に
WordPressでは、各権限グループのアクセス権を詳細に設定することができます。基本的に権限関連は実績のあるプラグインに任せてしまった方が運用面で楽だと思いますが、本記事のように限定的な権限のコントロールであれば自前でフックを用意するのも良いかもしれませんね。
以上、WordPressで管理者以外のユーザーでiframeタグを入力すると保存時に削除される場合の対処法のご紹介でした!