【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タグを入力すると保存時に削除される場合の対処法のご紹介でした!

Adobe Creative Cloudのコンプリートプランを特別価格で手に入れよう!

Adobe Creative Cloud(Adobe CC)はAdobe社が提供するクリエイター向けのサービスです。WEB制作の幅を広げる「Photoshop・Illustrator・XD」Youtuberや動画クリエイターの編集作業に欠かせない「Premiere Pro・After Effects」など全20以上のアプリが提供されており、幅広いプランが用意されています。

コンプリートプランはAdobe CCの全20以上のアプリが使用できるプランです。多くのアプリが使用できるため定価で購入すると年間7万円以上するプランですが、デジタルハリウッドのAdobeマスター講座では「基礎動画教材+Adobe CC コンプリートプラン(12ヵ月)」がセットになって39,980円(税込)で利用できます。定価より安価にAdobe Creative Cloudのライセンスを購入でき、以降のライセンス更新も可能。動画教材で基礎スキルを習得できるので、入門する方にも便利な講座です。詳しくは下記のリンクからチェックしてみてくださいね。

Adobeマスター講座はこちら

おすすめの書籍