WordPress 編集者権限でiframeタグが消される
WordPress で編集者権限のユーザで、投稿や固定ページの本文を編集すると、iframeタグが消える現象に遭遇しました。
ソースコードを見て確認したところ、unfiltered_html
という権限を持っていないユーザは、ホワイトリストに定義されたタグ以外は消されるというセキュリティ機能があるようでした。
「wordpress 編集者 iframe 消える」でググると、たくさんの解決方法を書いたページが見付かったんだけど、最適ではない解決方法に見えました。
ググって見付けた解決方法
wordpressでiframeが無効になる現象を解決する方法 (2012.02.02)
- functions.php に以下を追加する
<?php
// フィルタの登録
add_filter('content_save_pre','test_save_pre');
function test_save_pre($content){
global $allowedposttags;
// iframeとiframeで使える属性を指定する
$allowedposttags['iframe'] = array('class' => array () , 'src'=>array() , 'width'=>array(),
'height'=>array() , 'frameborder' => array() , 'scrolling'=>array(),'marginheight'=>array(),
'marginwidth'=>array());
return $content;
}
content_save_pre
フィルターで、グローバル変数 $allowedposttags
を編集するという解決方法でした。content_save_pre
フィルターの目的である $content
には作用しないでグローバル変数を更新しているのは、行儀が良いとは思えませんでした。
より適切な解決方法
もう少しソースコードを見たら、kses.php
に、今回の問題を解決するためのそのものずばりの、許可タグを定義しているホワイトリストのグローバル変数 $allowedposttags
を編集するためのフィルター (wp_kses_allowed_html
) が用意されていました。(2012年には無かったのかもしれません)
このフィルターを使って許可タグホワイトリストを編集するには、 functions.php
に以下を定義すれば良さそうです。
<?php
// 許可タグホワイトリストに、iframeを追加する。
add_filter('wp_kses_allowed_html', function($tags){
// iframeとiframeで使える属性を指定する
$tags['iframe'] = [
'class' => [],
'src' => [],
'width' => [],
'height' => [] ,
'frameborder' => [] ,
'scrolling' => [],
'marginheight' => [],
'marginwidth' => [],
];
return $tags;
});
実際に対応した内容
自分の要件的には、編集者に自由にiframeタグの要素を編集してもらえるようにすることではなく、既存のiframeタグが消されないようにすることだったので、上で書いた、「より適切な解決方法」も使わずに、既存のiframeタグの内容を出力するショートコードを定義する形で対応しました。せっかく調べたのでブログにメモしておきます。