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タグの内容を出力するショートコードを定義する形で対応しました。せっかく調べたのでブログにメモしておきます。

Leave a Comment

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.