web-dev-qa-db-fra.com

Impossible d’empêcher une fonction en utilisant deux fois le save_post

J'utilise save_post pour une fonction d'envoyer un courrier électronique lorsqu'un message est mis à jour par un utilisateur. Cela se déclenche deux fois et je suis conscient que cela est dû aux révisions de publication et aux sauvegardes automatiques.

J'ai essayé d'empêcher que cela ne se produise en encapsulant mon wp_mail dans une instruction conditionnelle, mais cela se déclenche encore deux fois. Quels ajustements dois-je faire pour que cela ne se déclenche qu'une fois lorsqu'un utilisateur met à jour le message?

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
Ben H

tout d'abord, vous pouvez utiliser ce hook pour cibler un seul type personnalisé:
https://developer.wordpress.org/reference/hooks/save_post_post-post_type/

ce hook (et save_post) est appelé la première fois que vous cliquez sur "nouveau ..." puis le hook s'appelle avec $update = FALSE.
puis pour envoyer un courrier électronique uniquement lorsque l'objet est mis à jour, vous pouvez tester $update comme ceci:

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);
1
mmm

Essayez ce morceau de code dans votre fonction:

if ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE ) return;

Alternativement, vous pouvez utiliser publish_post hook. Si vous souhaitez simplement activer cette fonction lorsque le statut de la publication est publié.

0
Atlas_Gondal