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

この記事を書いた人

Ryohei

Webエンジニア / ブロガー

福岡のWeb制作会社に務めるWebエンジニアです。エンジニア歴は10年程で、好きな言語はPHPとJavaScriptです。本サイトは私がインプットしたWebに関する知識を整理し、共有することを目的に2015年から運営しています。Webに関するご相談があれば気軽にお問い合わせください。