web-dev-qa-db-ja.com

Save_postの呼び出しを2回使用して関数を回避できない

投稿がユーザによって更新されたときに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
Ben H

まず、このフックを使って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);
1
mmm

承認された答えは私にとってはうまくいきませんでした。私はいくつかの条件を試しましたが、それでもメールは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 );

これが誰かを助けることを願って

0
Uriahs Victor

関数内でこのコードを試してください。

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

あるいは、 publish_post hookを使用することもできます。投稿ステータスが公開のときにこの機能を起動するだけの場合。

0
Atlas_Gondal