WP Advanced Commentでコメント欄に追加した項目をメール通知にも

Wordpressのコメント欄を自由にカスタマイズできる便利なプラグイン「WP Advanced Comment
(残念ながら無料プラグインの公開は2019年3月で終了していました。有料版はこちら



不要なフィールドを非表示にしたり、新しい項目を増やすこともできます。
カスタマイズした内容はコメント欄に表示させたり、管理画面で確認できますが、ただメールのコメント通知の文面は変わりません。
以前投稿した「コメント通知のメール本文を変更する」の方法を利用して追加した項目をメール通知にも挿入することにしました。

それがなかなか一筋縄ではいかなかったので、メモしておきます。
公開終了しているプラグインなのであまり需要はないかもしれませんが、アクションフックの順位について確認するいい機会になりましたので、参考になれば幸いです。


WP Advanced Commentで追加された項目は、commentmetaテーブルに保存されています。
meta_keyに設定画面のMeta_keyで設定した文字列、meta_valueにコメント欄で入力された値が入っています。

今回コメント欄に「来店日(raitenbi)」と「担当(tantou)」を追加したと仮定して、
function.phpにコメント通知のメール本文を変更する為のフィルター関数を追記します。

function custom_comment_moderation_text( $notify_message, $comment_id) {
 
	// コメント情報
	$comment = get_comment($comment_id);
	// コメントのあった投稿
	$post = get_post($comment->comment_post_ID);
	// 投稿元のドメイン名
	$comment_author_domain = @gethostbyaddr($comment->comment_author_IP);
	// ブログ名(サイト名)
	$blogname = wp_specialchars_decode(get_option('blogname'), ENT_QUOTES);
	// コメント
	$comment_content = wp_specialchars_decode($comment->comment_content);
	//コメントの承認状態
	$comment_approved = ($comment->comment_approved);

	global $wpdb;
	//追加項目(来店日)
	$sql = "SELECT meta_value FROM $wpdb->commentmeta WHERE comment_id like '".$comment_id."' and meta_key like 'raitenbi'";
	$raitenbi = $wpdb->get_var($sql);

	//追加項目(担当)
	$sql = "SELECT meta_value FROM $wpdb->commentmeta WHERE comment_id like '".$comment_id."' and meta_key like 'tantou'";
	$tantou = $wpdb->get_var($sql);
 
	// コメントの時
	if ( $comment->comment_type == "comment" ) {

		$notify_message = "「{$post->post_title}」にコメントがありました。確認をお願いします。\r\n";
		$notify_message .= get_permalink($comment->comment_post_ID) . "\r\n\r\n";
		$notify_message .= "\r\n";
		$notify_message .= "========================================\r\n";
		$notify_message .= "\r\n";
		$notify_message .= "投稿者: {$comment->comment_author}\r\n";
		$notify_message .= "IP: {$comment->comment_author_IP} ({$comment_author_domain})\r\n";
		$notify_message .= "メールアドレス: {$comment->comment_author_email}\r\n";
		$notify_message .= "来店日: {$raitenbi}\r\n";
		$notify_message .= "担当: {$tantou}\r\n";
		$notify_message .= "URL: {$comment->comment_author_url}\r\n";
		$notify_message .= "コメント: \r\n";
		$notify_message .= "{$comment_content}\r\n";
		$notify_message .= "\r\n";
		$notify_message .= "========================================\r\n";
		$notify_message .= "\r\n";

	}
 
	//ここから操作用URLの記載
	$notify_message .= "各操作は下記のアドレスから行うことができます。\r\n";
	$notify_message .= "\r\n";
 
	if($comment_approved != '1'){
		// 承認
		$notify_message .= "承認: \r\n";
		$notify_message .= admin_url("comment.php?action=approve&c=$comment_id") . "\r\n";
	}
 
	if ( EMPTY_TRASH_DAYS ) {
		// ゴミ箱に移動
		$notify_message .= "ゴミ箱に移動: \r\n";
		$notify_message .= admin_url("comment.php?action=trash&c=$comment_id") . "\r\n";
	}else{
		// 削除
		$notify_message .= "削除: \r\n";
		$notify_message .= admin_url("comment.php?action=delete&c=$comment_id") . "\r\n";
	}
 
	// スパムとしてマーク
	$notify_message .= "スパムとしてマーク: \r\n";
	$notify_message .= admin_url("comment.php?action=spam&c=$comment_id") . "\r\n";
	
	// 未承認のコメント一覧
	$notify_message .= "未承認のコメント一覧:\r\n";
	$notify_message .= admin_url("edit-comments.php?comment_status=moderated") . "\r\n";
 
	return $notify_message;
}
 
 
//コメントの承認待ちメール
add_filter('comment_moderation_text', 'custom_comment_moderation_text', 10, 2 );
//コメントの通知メール
add_filter('comment_notification_text', 'custom_comment_moderation_text', 10, 2);


これでOK!と思いきや、なんとメールの該当箇所は空欄のまま。
DBにはきちんと登録されているし、なんでだよとしばらく悩みました。

で気が付いたのです。

コメント送信された後の動作の順番
⇒spam判定などのチェック
⇒DBのcommentsテーブルにコメントの内容が登録される
⇒通知メールが送信される
⇒WP Advanced Commentで設定した追加項目の内容がDBのcommentmetaテーブルに登録される

なので、通知メールを操作する時にはまだcommentmetaにはデータが空なんですね。

原因はWP Advanced CommentがDBを書き込む動作を「comment_post」アクションにフックしているのですが、本体のコメント通知を送信する動作も「comment_post」をアクションフックにしていたのです。

その為DBに書き込まれる前にコメント通知が送信されていたということです。

なのでWP Advanced CommentがDBに書き込む動作が先に動くように、アクションフックの優先順位を変更しました。

プラグインフォルダの「functions/frontend.php 1463行目くらい」

//アクションフック優先順位変更
add_action( 'comment_post', 'cfb_save_comment_meta_data' , 1 , 3 );

これで無事にコメント欄に追加した項目もメール通知されるようになりました。

Comments

コメントする