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

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

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

例えば、

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

などです。

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

固定ページの作成

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

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

ワードプレスの権限

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

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

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

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

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

// /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をコピーしました