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が曲者だった。
行き着いた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 ); } } }