Отправить уведомление если кто-то ответит на комментарий WordPress

Давайте добавим чекбокс в форму комментария к статьям на WordPress, чтобы если кто-то ответит на ваш комментарий, то Вы об этом получите уведомление.

snimok jekrana 2025 12 22 v 23.58.11

Добавьте сниппет код:

// 1. обработчик отписки
add_action( 'init', function() {
	if ( empty($_GET['avs_unsubscribe']) ) {
		return;
	}
	$comment_id = absint($_GET['avs_unsubscribe']);
	if ( !$comment_id ) {
		return;
	}

	global $wpdb;
	$table = 'wp_commentmeta'; // <-- Ваш реальный префикс таблицы!
	$sql = $wpdb->prepare(
		"DELETE FROM $table WHERE comment_id = %d AND meta_key = %s",
		$comment_id,
		'avs_notify_reply'
	);
	$wpdb->query($sql);

	// Вместо редиректа просто выводим сообщение и стопаем выполнение WP дальше
	wp_die(
		'<div style="max-width:600px;margin:80px auto;padding:36px 24px 24px 24px;background:#fefff7;border:1px solid #e1e7cd;border-left:8px solid #89A316; border-radius:6px;">
			<h2 style="color:#62750f;font-size:1.6em;margin:0 0 20px 0;text-align:left;">Вы успешно отписались от уведомлений на комментарий</h2>
			<p style="color:#222;font-size:1.07em;margin:6px 0 0 0;">Уведомления об ответах на этот комментарий больше приходить не будут.</p>
			<p style="margin-top:2em;"><a href="' . esc_url(home_url()) . '" style="color:#62750f;text-decoration:underline">Вернуться на главную</a></p>
		</div>',
		'Отписка от уведомлений',
		array('response' => 200)
	);
	exit;
});

// 2. для отправителя
add_filter( 'wp_mail_from', function() { return 'info@wp-alexandra.store'; } );
add_filter( 'wp_mail_from_name', function() { return 'Лайфхаки WordPress'; } );

// 3. Чекбокс подписки
function avs_comment_notify_checkbox() {
	$checked = '';
	if ( isset( $_POST['avs_notify_reply'] ) && $_POST['avs_notify_reply'] ) {
		$checked = ' checked="checked"';
	}
	echo '<p class="comment-form-notify">
		<label>
			<input type="checkbox" name="avs_notify_reply" value="1"' . $checked . ' />
			' . esc_html__( 'Отправить мне письмо, если кто-то ответит на мой комментарий', 'avs' ) . '
		</label>
	</p>';
}
add_action( 'comment_form_after_fields', 'avs_comment_notify_checkbox' );
add_action( 'comment_form_logged_in_after', 'avs_comment_notify_checkbox' );

// 4. Сохранение/удаление meta при комментировании
function avs_save_comment_notify_meta( $comment_id, $comment_approved ) {
	if ( isset( $_POST['avs_notify_reply'] ) && $_POST['avs_notify_reply'] ) {
		update_comment_meta( $comment_id, 'avs_notify_reply', '1' );
	} else {
		delete_comment_meta( $comment_id, 'avs_notify_reply' );
	}
}
add_action( 'comment_post', 'avs_save_comment_notify_meta', 10, 2 );

// 5. Отправка уведомления (только если meta=1 у родителя)
add_action( 'comment_post', 'avs_schedule_or_send_reply_notification', 20, 2 );
function avs_schedule_or_send_reply_notification( $comment_id, $comment_approved ) {
	$comment = get_comment( $comment_id );
	if ( ! $comment ) return;
	$parent_id = (int) $comment->comment_parent;
	if ( $parent_id <= 0 ) return;
	$notify = get_comment_meta( $parent_id, 'avs_notify_reply', true );
	if ( empty( $notify ) ) return;
	$hook = 'avs_send_reply_notification_async';
	$args = array( 'comment_id' => $comment_id );
	if ( function_exists( 'as_next_scheduled_action' ) && function_exists( 'as_schedule_single_action' ) ) {
		$existing = as_next_scheduled_action( $hook, $args, 'avs-comment-notify' );
		if ( ! $existing ) as_schedule_single_action( time(), $hook, $args, 'avs-comment-notify' );
		return;
	}
	avs_send_reply_notification_job( $args );
}

add_action( 'avs_send_reply_notification_async', 'avs_send_reply_notification_job' );
function avs_send_reply_notification_job( $args ) {
	if ( is_array( $args ) && isset( $args['comment_id'] ) ) {
		$comment_id = (int) $args['comment_id'];
	} elseif ( is_numeric( $args ) ) {
		$comment_id = (int) $args;
	} else return;

	$comment = get_comment( $comment_id );
	if ( ! $comment ) return;
	$parent_id = (int) $comment->comment_parent;
	if ( $parent_id <= 0 ) return;
	$parent_comment = get_comment( $parent_id );
	if ( ! $parent_comment ) return;
	$notify = get_comment_meta( $parent_id, 'avs_notify_reply', true );
	if ( empty( $notify ) ) return;
	$to = trim( $parent_comment->comment_author_email );
	if ( empty( $to ) || ! is_email( $to ) ) return;
	$new_author_email = trim( $comment->comment_author_email );
	if ( $new_author_email && $new_author_email === $to ) return;
	$comment_link = get_comment_link( $comment_id );
	$post_id      = $comment->comment_post_ID;
	$subject = sprintf( __( 'Новый ответ на ваш комментарий: %s', 'avs' ), get_the_title( $post_id ) );
	$site_name = wp_specialchars_decode( get_bloginfo( 'name' ), ENT_QUOTES );
	$message  = '<p>' . sprintf( esc_html__( 'Здравствуйте, %s!', 'avs' ), esc_html( $parent_comment->comment_author ) ) . '</p>';
	$message .= '<p>' . esc_html__( 'Кто-то ответил на ваш комментарий:', 'avs' ) . '</p>';
	$excerpt  = wp_trim_words( wp_strip_all_tags( $comment->comment_content ), 30, '...' );
	$message .= '<blockquote style="border-left:3px solid #ddd;padding-left:10px;color:#333;">' . esc_html( $excerpt ) . '</blockquote>';
	$message .= '<p><a href="' . esc_url( $comment_link ) . '">' . esc_html__( 'Перейти к ответу', 'avs' ) . '</a></p>';
	$nonce = wp_create_nonce( 'avs_unsubscribe_' . $parent_id );
	$unsubscribe_url = add_query_arg(
		array(
			'avs_unsubscribe' => $parent_id,
			'avs_nonce'       => $nonce,
		),
		get_permalink( $post_id )
	);
	$message .= '<p><small><a href="' . esc_url( $unsubscribe_url ) . '">' . esc_html__( 'Отписаться от уведомлений об ответах на этот комментарий', 'avs' ) . '</a></small></p>';
	$message .= '<hr />';
	$message .= '<p>' . sprintf( esc_html__( 'С уважением, %s', 'avs' ), esc_html( $site_name ) ) . '</p>';

	$headers = array();
	$headers[] = 'Content-Type: text/html; charset=' . get_option( 'blog_charset' );
	if ( ! empty( $new_author_email ) && is_email( $new_author_email ) ) {
		$headers[] = 'Reply-To: ' . wp_mail_utils_format_name_and_address( $comment->comment_author, $new_author_email );
	} else {
		$admin_email = get_bloginfo( 'admin_email' );
		$headers[]   = 'Reply-To: ' . wp_mail_utils_format_name_and_address( $site_name, $admin_email );
	}
	wp_mail( $to, wp_strip_all_tags( $subject ), $message, $headers );
}

// 6. Вспомогательная функция для оформления полей адреса в e-mail
if ( ! function_exists( 'wp_mail_utils_format_name_and_address' ) ) {
	function wp_mail_utils_format_name_and_address( $name, $email ) {
		$clean_name  = trim( preg_replace( '/\s+/', ' ', strip_tags( $name ) ) );
		$clean_email = sanitize_email( $email );
		if ( $clean_name ) {
			return sprintf( '%s <%s>', $clean_name, $clean_email );
		}
		return sprintf( '<%s>', $clean_email );
	}
}


В сниппет коде ОБЯЗАТЕЛЬНО поменяйте wp_commentmeta на ваш префикс в таблице, но как правило он будет wp_commentmeta.
А также измените в пункте 2. отправителя. Как настроить почту смотрите здесь

snimok jekrana 2025 12 23 v 00.11.47


Протестируйте отправку писем, если кто-то оставит ответ на комментарий. Письма будут приходить в таком виде:

snimok jekrana 2025 12 23 v 00.18.46

Когда пользователь проходит по ссылки отписаться, то он попадает на страницу:

snimok jekrana 2025 12 23 v 00.18.02

Также для формы комментария добавьте css для красоты:

/* Стили для чекбокса подписки на ответы */
selector .comment-form-notify {
  margin-bottom:14px;font-size: 14px;}
selector .comment-form-notify label{display: flex;align-items: center;gap: 12px;cursor: pointer;font-size: 14px;}
selector .comment-form-notify input[type="checkbox"] {vertical-align: middle;}
.comment-form-notify input[type="checkbox"] {
  appearance: none;
  -webkit-appearance: none;
  outline: none;
  width: 18px;
  height: 18px;
  border: 2px solid #4E88DC;
  border-radius: 6px;
  background: #0D1117;
  cursor: pointer;
  position: relative;
  vertical-align: top;}
.comment-form-notify input[type="checkbox"]:checked {
  background: #4E88DC;}
.comment-form-notify input[type="checkbox"]:checked::after {content: '';
  position: absolute;
  left: 4px;
  top: 1px;
  width: 6px;
  height: 10px;
  border-right: 3px solid #fff;
  border-bottom: 3px solid #fff;
  transform: rotate(41deg);}

Кстати! Не забудьте сделать древовидный вид комментариев в настройках wordpress.

Picture of Автор: Александра

Автор: Александра

@avsalexandra
Занимаюсь натуральным питанием собак и кошек BARF. Wordpress для души ☺️

Crocoblock
Elementor
Gutenberg
Jetengine
Jetformbuilder
profile builder
Woocommerce
Wordpress
WYSIWYG
Лейка
#публикация постов
#видео
#доменная почта
#рассылка
#бейдж
#благотворительность
#заказ ожидает
#подарок
#подчёркивание
#vk
#автосохранение
#пожертвования
#мультивыбор
#роли
#drag and drop
#изображения товаров
#подписки
#цена
#отменить заказ
#самозанятый
#чеки
#мой налог
#alt text
#галерея товара
#возврат
#видео товара
Комментарии:

Добавить комментарий