【WordPress】HTMLコンテンツを置換する

【WordPress】HTMLコンテンツを置換する WordPress

WordPressを会員制サイトなどのログイン前提の目的で使用していると、特定の権限を持つユーザーのみに表示したい情報が出てきます。

例えば、

  • メルマガを購入している会員に向けてお知らせを表示したい
  • 会員の価格プランによって、表示する内容を変更したい

などです。

今回は対象のページを固定ページで作成している前提で、その内容をWordPressの権限によって制御してみます。

固定ページの作成

固定ページで段落などの要素を選択すると右ペインの「ブロック」タブの一番下に「高度な設定」の中に「追加 CSS クラス」があります。ここに表示したいユーザの権限を入力しておくことで出力を制御できます。

以下の例ですと、ログインユーザの権限がadministrator、editorの場合は概要の要素のHTMLが出力され、それ以外の権限の場合、削除されます。

ワードプレスの権限

WordPressの権限は以下があります。

  • 管理者 – administrator
  • 編集者 – editor
  • 投稿者 – author
  • 寄稿者 – contributor
  • 購読者 – subscriber

今回はWordPressの権限を使用していますが、会員の価格プランなどでもカスタムフィールド等から取得できるものであれば、問題ありません。

アクションフィルターを実装

HTMLコンテンツを置換するアクションフィルターをfunctions.phpに実装することで実現できます。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
// /hoge/ページの時に置換を実行
if (strpos($_SERVER['REQUEST_URI'], '/hoge/')) {
    add_action('init', function () {
        ob_start();
    });
    add_action('shutdown', function () {
        $final = '';
        $levels = ob_get_level();
 
        for ($i = 0; $i < $levels; $i++) {
            $final .= ob_get_clean();
        }
        echo apply_filters('change_content_filter', $final);
    }, 0);
}
 
add_filter('change_content_filter', function ($content) {
 
    // ログインユーザの権限を取得
    if ( current_user_can( 'administrator' ) ) {
        $role = 'administrator';
    } elseif ( current_user_can( 'editor' ) ) {
        $role = 'editor';
    } elseif ( current_user_can( 'author' ) ) {
        $role = 'author';
    } elseif ( current_user_can( 'contributor' ) ) {
        $role = 'contributor';
    } elseif ( current_user_can( 'subscriber' ) ) {
        $role = 'subscriber';
    else {
        $role = 'not_login';
    }
    // ログインユーザの権限がCSSのクラスとして存在すればその箇所のHTMLを出力、しなければ削除
    $content = preg_replace("#<p (?=.*role-){1,}(?!.*role-$role).*\">(.*?)</p>#is", "", $content);
    return $content;
});
タイトルとURLをコピーしました