it-swarm.com.de

Funktion kann nicht durch zweimaliges Auslösen von save_post verhindert werden

Ich verwende save_post für eine Funktion zum Senden einer E-Mail, wenn ein Beitrag von einem Benutzer aktualisiert wird. Dies wird zweimal ausgelöst und ich bin mir bewusst, dass dies an den Post-Revisionen und Autosaves liegt.

Ich habe versucht, dies zu verhindern, indem ich meinen wp_mail in eine bedingte Anweisung eingeschlossen habe, aber dies wird immer noch zweimal ausgelöst. Welche Anpassungen muss ich vornehmen, um sicherzustellen, dass dies nur einmal ausgelöst wird, wenn ein Benutzer den Beitrag aktualisiert?

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

erstens können Sie diesen Hook verwenden, um nur einen benutzerdefinierten Typ als Ziel festzulegen:
https://developer.wordpress.org/reference/hooks/save_post_post-post_type/

dieser Hook (und save_post) wird das erste Mal aufgerufen, wenn Sie auf "Neu ..." klicken. Anschließend wird der Hook mit $update = FALSE aufgerufen.
Wenn Sie dann eine E-Mail nur senden möchten, wenn das Objekt aktualisiert wurde, können Sie den $update folgendermaßen testen:

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

Probieren Sie diesen Code in Ihrer Funktion aus:

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

Alternativ können Sie publish_post hook verwenden. Wenn Sie diese Funktion nur auslösen möchten, wenn der Post-Status "Publizieren" lautet.

0
Atlas_Gondal