WordPressの寄稿者(Contributor)のコメント返信を許可のカスタマイズ及び管理者の承認待ちの実装

公開日: : 最終更新日:2016/07/19 カスタマイズ

WordPressの記事投稿だけの場合は寄稿者の設定だと思いますが、コメント返信はできないようになっているので、WordPressの寄稿者(Contributor)のコメント返信機能許可のカスタマイズ及び管理者の承認待ちの実装を行ってみました。

まぁ、投稿者でもいいのかもしれませんが。あと、上手い対応でないと思うのと、どこかで不具合が発生しそうな気もするので、参考にされる場合は自己責任でお願いします。

スポンサーリンク

WordPressコメント返信のみ許可する実装

寄稿者(contributor)のみadd_filterでコールバックを用意する

if( current_user_can('contributor') )
{
	add_filter( 'map_meta_cap', 'contributors_can_moderate_comments_callback', 10, 4 );
	add_filter( 'comment_row_actions', 'comment_row_actions_callback', 1, 2);
	// https://wordpress.org/support/topic/comment-moderation-issue-need-help
	add_filter( 'pre_comment_approved', 'pre_comment_approved_callback', 10, 2);
}

コメント承認時のコメントバックで強制的に承認待ちにする

// コメント承認時のコールバック
function pre_comment_approved_callback($approved, $commentdata)
{
	// 承認待ちにする
    $approved = 0; // $approved status 0,1, or 'spam'

	return $approved;
}

寄稿者のコメント返信を投稿した際に、管理者でコメントモデレーションとして承認のチェックを行いたいので、pre_comment_approvedでhook(フック)させて引数の$approvedを0にすることで、承認待ちにします。これで、いきなりコメントを表示させずに内容を精査してコメントの投稿を許可することができます。

管理画面コメント一覧でコメントリンクを表示する。権限を一時的に付加する

function contributors_can_moderate_comments_callback( $caps, $cap, $user_id, $args )
{
	// 返信ボタン押したときなどの非同期処理か
	if ( preg_match( "/admin\-ajax\.php/", $_SERVER["REQUEST_URI"]) )
	{
		$i = 0;
		if( preg_match( "/edit\-comments.+=approved/", $_SERVER['HTTP_REFERER']) )
		{
			// 返信ボタンを押してajaxによる非同期処理中も許可が必要(これがないと-1のエラー表示)
			$i = 1;
		}
	}
	elseif( preg_match( "/edit\-comments.+=approved/", $_SERVER["REQUEST_URI"]) )
	{
		// コメント一覧表示時の返信などのリンク表示許可するために
		$i = 1;
	}
	else {
		$i = 0;
	}

	if( $i )
	{
		if ( 'edit_post' == $cap ) {
			$post = get_post( $args[0] );
	        $post_type = get_post_type_object( $post->post_type );
	        $caps = array();
	        if ( $user_id == $post->post_author )
	            $caps[] = $post_type->cap->edit_posts;
	        else
	            $caps[] = $post_type->cap->edit_others_posts;

	    }
	}
	return $caps;
}

ここの処理は怪しいです。いろいろ不具合を抱えているかもしれません。edit-comments.phpのときにコメント一覧の各コメントの返信機能を許可し、リンク表示するのですが、この実装ですとコメント返信ボタンを押した際の非同期処理中にもこの権限の一時的な承認が必要のようです。

そのため、直前のリンク(HTTP_REFERER)がコメント一覧画面でajax.phpが処理を行っている間も実行できる形にしています。この対応を入れないと他の非同期処理するボタン(ajax.phpが利用されているところ)でも反応してしまうので、コメント一覧の返信ボタンに限定するためです。

ここに関しては、もっと簡単なWordPressのコメント権限の承認処理があるのかもしれないですが、検索しきれなかったです。

コメント関連リンクを表示・非表示を制御する

function comment_row_actions_callback($actions, $comment)
{
	if( current_user_can('contributor') )
	{
        $user_id = get_current_user_id();
//Array ( [unapprove] => 承認しない [reply] => 返信 [quickedit] => クイック編集 [edit] => 編集 [spam] => スパム [trash] => ゴミ箱へ移動 )
		// 返信だけ許可できないのか。もう少しうまいやり方は?
        // $comment->user_id, $user_id
		if( 0 == $comment->comment_approved )
		{	// 承認待ち(返信後に一時的に表示される
			unset($actions['reply']);	// 返信
		}
		unset($actions['approve']);		// 承認する
        unset($actions['unapprove']);	// 承認しない
		unset($actions['quickedit']);	// クィック編集
		unset($actions['edit']);		// 編集
		unset($actions['spam']);		// スパム登録
		unset($actions['trash']);		// ゴミ箱
	}
    return $actions;
}


comment_row_actionsのフックはコメント行の下の操作リンク(返信、クイック編集、編集)に適用されます。これがコールバックされた際に各コメント用のアクションを無効にすることが可能です。他の画面でも一部機能オフにしたい場合は同様の処理が可能かと思います。

コメント一覧の機能アクションは[unapprove] => 承認しない [reply] => 返信 [quickedit] => クイック編集 [edit] => 編集 [spam] => スパム [trash] => ゴミ箱へ移動と定義されているので、これらをunsetすることでコメント機能リンクの一部をオフにできます。(リンクを表示しない)

コメント返信ボタン押したあとにコメント承認一覧ページに一時的に、投稿した承認待ちのコメントが表示されますが返信が有効になった状態になるので、$comment->comment_approvedが承認待ちならunsetしてコメントの返信リンクを非表示ししています。

・PR

まとめ

現状は可能なかぎり機能制限をしたいために寄稿者にコメント返信だけの権限を一時的に付加してみました。少し試したかぎりは上手く機能しているように見えます。

もう少しいい方法があれば、こんな面倒なことをしなくていいんですけどね。投稿者の設定に変えたほうが楽なのかな?検索しても見つからないのは。

SPONSORED LINK
PR

おすすめの商品を紹介しています。

BUFFALO 高速モデル NAS(ネットワークHDD) 【iPhone5対応(WebAccess i)】 2TB LS-V2.0TLJ

父親が視聴している液晶ハイビジョンテレビL32-XP05のハードディスクがそろそろ悲鳴をあげているた

レビューを読む

新TOEICテスト 文法問題 でる1000問

久しぶりに解き直した新TOEICテスト文法問題でる1000問の結果が途中ながらひどすぎたので、音

レビューを読む

Hackers TOEFL ListeningハッカーズTOEFLのリスニング :3rd iBT Edition

勉強法としてTOEFLを知り尽くしているHACKERSの韓国本TOEFLを利用して大量の英文を聞いて

レビューを読む



当ブログの人気エントリ一覧。おすすめです

  コメント

0
入力フォームを隠す

Message

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA


 
PAGE TOP ↑