WooCommerceのメールを送信しない方法

Pocket

WooCommerceのメール設定は、全てWooCommerce→設定→メールで設定できる。

一律にメールをするか否かはここで設定できる。しかし、注文によっては送信したくない場合や、タイミングによって(ステータス変更し忘れなど)送信したくないときもある。

こんなhookを使うと、statusによって送信する/しないを変更できる:

https://www.damiencarbery.com/2018/12/conditionally-disable-woocommerce-emails/

 

しかし、今改修しているサービスでは、WooCommerce Order Status Managerプラグインを使い、新たにorder statusを作っている。このstatusに変更したときのメールを、送信したくないときの処理方法についてメモ。

WooCommerce Order Status Managerプラグインで作ったstatusは “pickup-ready” とし、店頭受取が可能な状態として作った。
Emailは、通常はorderのstatus がAnyからpickup-readyになったときに送信したい。

使うhookはwoocommerce_email_enabled_<id>だが、このidが曲者だった。

woocommerce_email_enabled_

行き着いたcodeが以下。post_idがPOSTされ、no_email ==’on’ の場合はメール送信しない。

if( $_POST['no_email'] == 'on'){

    // don't send email.
    $query = "SELECT post_id FROM {$wpdb->prefix}postmeta WHERE `meta_key` = '_email_dispatch_condition' AND `meta_value` = 'any_to_pickup-ready';";

    $results = $wpdb->get_results( $query, ARRAY_A );
    if( $results ){
        foreach( $results as $res ){
            $id = $res['post_id'];
            // The filter name is 'woocommerce_email_enabled_'.WC_Email::id e.g. 'new_order', 'cancelled_order' 'customer_completed_order' 'customer_processing_order' etc
            add_filter( "woocommerce_email_enabled_" . 'wc_order_status_email_' . $id, '__return_false', 100, 2 );

        }
    }
}