Прекратить отправку сообщений по электронной почте каждый раз, когда я обновляю свой пост

Мои проекты сообщений будут иметь настраиваемое поле, которое содержит значение как адрес электронной почты. Поэтому всякий раз, когда я публикую сообщение, он отправляет электронное письмо пользователю. Он работает нормально. Однако, если я обновляю сообщение, он все равно отправляет электронное письмо снова и снова. Вот мой кусок кода:

add_action( 'save_post', 'send_email' ); function send_email( $post_id ) { if ( !wp_is_post_revision( $post_id ) ) { $post_url = get_permalink( $post_id ); $subject = 'Your post is published!'; $message = "Testing!"; $message .= "<a href='". $post_url. "'>Click here to view</a>"; $custom_field_name = 'author_email'; $email = get_post_meta($post_id, $custom_field_name, true); wp_mail($email, $subject, $message ); } } 

Я исследовал эту тему, и вот решение, которое я нашел здесь в этой ссылке, но как мне обновить в моем коде. Любая помощь будет оценена!

Вам нужно использовать {old_status} для {new_status} . И используйте draft и publish статусы. Этот крючок будет выполнен только тогда, когда ваш пост изменит статус из draft для publish .

 function wpse_288250_send_email( $post ) { $post_id = $post->ID; if( wp_is_post_revision( $post_id ) ) { return; } $post_url = get_permalink( $post_id ); $subject = 'Your post is published!'; $message = "Testing!"; $message .= "<a href='". $post_url. "'>Click here to view</a>"; $email = get_post_meta($post_id, 'author_email', true ); wp_mail($email, $subject, $message ); } add_action( 'draft_to_publish', 'wpse_288250_send_email' ); 

Имейте в виду, если вы измените свой статус сообщения на draft и снова publish электронное письмо, он будет отправлен снова. Чтобы предотвратить это, вы можете обновить почтовую мета, которая сообщит вам, была ли отправлена ​​электронная почта.

 function wpse_288250_send_email_once( $post ) { $post_id = $post->ID; if( wp_is_post_revision( $post_id ) ) { return; } $email_sent = get_post_meta( $post_id, 'email_sent' ); if( $email_sent ) { return; } $post_url = get_permalink( $post_id ); $subject = 'Your post is published!'; $message = "Testing!"; $message .= "<a href='". $post_url. "'>Click here to view</a>"; $email = get_post_meta($post_id, 'author_email', true ); wp_mail($email, $subject, $message ); update_post_meta( $post_id, 'email_sent', true ); } add_action( 'draft_to_publish', 'wpse_288250_send_email_once' ); 

Попробуйте использовать publish_post вместо save_post : https://codex.wordpress.org/Plugin_API/Action_Reference/publish_post : « publish_post – это действие, инициируемое при публикации публикации, или если оно редактируется и статус изменен для публикации. "

Обновленный ответ : давайте попробуем с переходом статуса сообщения, чтобы убедиться, что это только когда сообщение отправляется на публикацию статуса. https://codex.wordpress.org/Post_Status_Transitions

 function send_email( $new_status, $old_status, $post) { if ( $new_status != $old_status && $new_status == "publish") { $post_url = get_permalink( $post->ID ); $subject = 'Your post is published!'; $message = "Testing!"; $message .= "<a href='". $post_url. "'>Click here to view</a>"; $custom_field_name = 'author_email'; $email = get_post_meta($post->ID, $custom_field_name, true); wp_mail($email, $subject, $message ); } } add_action( 'transition_post_status', 'send_email', 10, 3 ); 
 add_action( 'save_post', 'send_email' ); function send_email( $post_id ) { if ( !wp_is_post_revision( $post_id ) && ( get_post_status($post_id) !== 'publish') ) { $post_url = get_permalink( $post_id ); $subject = 'Your post is published!'; $message = "Testing!"; $message .= "<a href='". $post_url. "'>Click here to view</a>"; $custom_field_name = 'author_email'; $email = get_post_meta($post_id, $custom_field_name, true); wp_mail($email, $subject, $message ); } } 

Мы могли бы проверить функции get_post_status, а не отправлять электронную почту еще раз.