投稿がユーザによって更新されたときにEメールを送信するための関数にsave_post
を使用しています。これは2回発砲されていますが、これはポストのリビジョンと自動保存が原因であることを認識しています。
私はwp_mail
を条件付きステートメントの中にラップすることによってこれが起こらないようにすることを試みました、しかしこれはまだ二度発火します。ユーザーが投稿を更新したときに一度だけ実行されるようにするために必要な調整は何ですか。
function updated_search_notification($post_id)
{
$post_type = get_post_type($post_id);
if ($post_type === 'utility-search') {
if ((wp_is_post_revision($post_id)) || (wp_is_post_autosave($post_id))) {
// post is autosave
} else {
// Message Variables
$siteurl = get_option('siteurl');
$post_url = '' . $siteurl . '/wp-admin/post.php?post=' . $post_id . '&action=edit';
$new_search_name = '';
//$new_search_email = get_option( 'new_search_email' );
$new_search_email = '[email]';
$utility_search_customer = '';
$subject = 'Your search has been updated';
// Message Contents
$message = "[Message Contents]";
// Send Email
wp_mail($new_search_email, $subject, $message);
}
}
}
add_action('save_post', 'updated_search_notification', 10, 3);
まず、このフックを使って1つのカスタムタイプのみをターゲットにすることができます。
https://developer.wordpress.org/reference/hooks/save_post_post-post_type/
このフック(およびsave_post
)は、 "new ..."をクリックしたときに初めて呼び出され、その後、フックは$update = FALSE
で呼び出されます。
次に、オブジェクトが更新されたときにのみEメールを送信するには、次のように$update
をテストします。
const UTILITY_SEARCH_POST_TYPE = "utility-search";
add_action("save_post_" . UTILITY_SEARCH_POST_TYPE, function ($post_ID, $post, $update) {
if (wp_is_post_autosave($post_ID)) {
return;
}
if (!$update) { // if new object
return;
}
// preparing e-mail
...
// sending e-mail
wp_mail(...);
}, 10, 3);
承認された答えは私にとってはうまくいきませんでした。私はいくつかの条件を試しましたが、それでもメールは2回送信されました。
function xxx_send_mail($id, $post, $update){
if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE ) {
return;
}
if (wp_is_post_revision($id)) {
return;
}
if (wp_is_post_autosave($id)) {
return;
}
// if new post
if (!$update) {
return;
}
wp_mail('[email protected]', 'The subject', 'The message');
}
add_action( 'save_post_{the_post_type}', 'xxx_send_mail', 10, 3 );
did_action() と呼ばれるWPによって提供される便利な関数を追加することで、これを修正しました。
function xxx_send_mail($id, $post, $update){
if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE ) {
return;
}
if (wp_is_post_revision($id)) {
return;
}
if (wp_is_post_autosave($id)) {
return;
}
// if new post
if (!$update) {
return;
}
$times = did_action('save_post_{the_post_type}');
if( $times === 1){
wp_mail('[email protected]', 'The subject', 'The message');
}
}
add_action( 'save_post_{the_post_type}', 'xxx_send_mail', 10, 3 );
これが誰かを助けることを願って
関数内でこのコードを試してください。
if ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE ) return;
あるいは、 publish_post hookを使用することもできます。投稿ステータスが公開のときにこの機能を起動するだけの場合。