WordPressでunfiltered_html権限の付与でHTMLエスケープを回避

WordPressをマルチサイトで運用しており、サイトごとにプロフィールを変えるため、1サイト1ユーザーを管理者の権限で作成して、別々のユーザーで投稿などをしていた。

しかし、TwitterやData URIによる画像の埋め込みなど行うと、なぜかプレビューや公開後に表示されない。同じ内容を特権管理ユーザーでプレビュー・投稿すると何も問題がない。

調べてうまく解決できたの対策を記す。WordPress 5.8.4で確認した。

調べたところ、ユーザーの権限にunfiltered_htmlがあり、これが付与されていないと、投稿時にHTMLがエスケープ処理されてしまうらしい。

unfileterd_htmlの権限が付与されるのは、特権管理者 (Super Admin) とシングルサイトの場合のみ管理者 (Administrator) と編集者 (Editor) のみとなる (Roles and Capabilities – WordPress.org Forums)。

マルチサイトの場合、特権管理者しかこの権限が付与されない。付与するにはfuncitons.phpなどで権限を付与する必要がある。

具体的な方法は以下を参考にした。

情報源

上記サイトを参考に、「管理者 (administrator)」と「編集者 (editor)」の権限にunfiltered_htmlの権限を付与するプラグインが以下となる。

add_cap_unfiltered_html_mu.php
<?php
//////////////////////////////////////////////////////////////////////////////
/// \file      add_cap_unfiltered_html_mu.php
/// \author    SENOO, Ken
/// \copyright CC0
/// \url       https://senooken.jp/post/2022/07/19/
//////////////////////////////////////////////////////////////////////////////
add_filter('map_meta_cap', 'add_cap_unfiltered_html_mu', 1, 3);
/**
 * Add unfiltered_html capability to editor and administrator on multisite.
 *
 * @wp-hook map_meta_cap
 */
function add_cap_unfiltered_html_mu($caps, $cap, $user_id) {
    if ($cap === 'unfiltered_html'
    && (user_can($user_id, 'editor') || user_can($user_id, 'administrator'))
    ) {
        $caps = array('unfiltered_html');
    }
    return $caps;
}

念のためGitHubでも公開している。

シングルサイトでは、add_cap()で権限を付与できるのだが、マルチサイトでは有効にならないため、方法が異なっている。おそらく、マルチサイトの書き方でシングルサイトもカバーできると予想するが、検証はできていない。

上記内容をテーマごとのfunctions.phpに記載してもいいのだが、マルチサイト全体で適用したいので、上記ファイルをwp-content/mu-plugins/に配置する。

これでマルチサイト全体で、管理者権限のユーザーにunfiltered_htmlが適用され、画像やTwitterの埋め込みコードを問題なく投稿できる。

なお、これを実現するプラグイン「Unfiltered MU – WordPress plugin | WordPress.org」が公開されているので、これをインストールして使ったほうがいいかもしれない。こちらのプラグインも、管理者と編集者にunfileterd_htmlの権限を付与してくれる。

コメントを残す

メールアドレスが公開されることはありません。