本篇文章更新時間:2023/08/31
如有資訊過時或語誤之處,歡迎使用 Contact 功能通知。
一介資男的 LINE 社群開站囉!歡迎入群聊聊~
如果本站內容對你有幫助,歡迎使用 BFX Pay 加密貨幣 或 新台幣 贊助支持。
這方法大概對網站經營者來說很無感,但對我這種時常開站建置 WooCommerec 網站的人很有幫助。
因為... WooCommerce 後台設定收件人的地方要過好幾個畫面才能完成這些設定,有夠擾人!
預設是使用網站管理員信箱來處理,但通常我們幫客戶建置網站最後也是客戶要使用這些功能,所以一定會需要改。
今天又處理了一次,索性直接把修改方法寫出來用。
// 後台設定看到的設定項目
function mxp_woocommerce_email_get_option_rewrite($value1, $email_obj, $value2, $key, $empty_value) {
// 批次修正 WooCommerce 發信收件人(網站主)
if ($key == 'recipient' && in_array($email_obj->id, array('new_order', 'cancelled_order', 'failed_order'))) {
// 不是網站管理員的話,就回傳設定值
if (trim($value1) !== trim(get_option('admin_email'))) {
return trim($value1);
} else {
$recipient = apply_filters('woocommerce_email_recipient_' . $email_obj->id, $value1, $email_obj->object, $email_obj);
$recipients = array_map('trim', explode(',', $recipient));
$user_query = new WP_User_Query(
array(
'fields' => array('ID', 'display_name', 'user_email'),
'role__in' => array('shop_manager'),
'exclude' => []
),
);
$users = $user_query->get_results();
foreach ($users as $user) {
$recipients[] = $user->user_email;
}
$recipients = array_unique(array_filter($recipients, 'is_email'));
$recipients = array_diff($recipients, [get_option('admin_email')]);
if (empty($recipients)) {
return get_option('admin_email');
}
$emails = implode(', ', $recipients);
return $emails;
}
}
return $value1;
}
add_filter('woocommerce_email_get_option', 'mxp_woocommerce_email_get_option_rewrite', 11, 5);
// 指定的「新訂單」、「取消的定單」與「失敗的訂單」收件者
function mxp_woocommerce_email_recipient_modify($recipient, $email_object, $email) {
if (empty($recipient)) {
return get_option('admin_email');
}
if ($recipient !== get_option('admin_email')) {
return $recipient;
}
$recipients = array_map('trim', explode(',', $recipient));
$user_query = new WP_User_Query(
array(
'fields' => array('ID', 'display_name', 'user_email'),
'role__in' => array('shop_manager'),
'exclude' => []
),
);
$users = $user_query->get_results();
foreach ($users as $user) {
$recipients[] = $user->user_email;
}
$recipients = array_unique(array_filter($recipients, 'is_email'));
$recipients = array_diff($recipients, [get_option('admin_email')]);
if (empty($recipients)) {
return get_option('admin_email');
}
$emails = implode(', ', $recipients);
return $emails;
}
add_filter('woocommerce_email_recipient_new_order', 'mxp_woocommerce_email_recipient_modify', 11, 3);
add_filter('woocommerce_email_recipient_cancelled_order', 'mxp_woocommerce_email_recipient_modify', 11, 3);
add_filter('woocommerce_email_recipient_failed_order', 'mxp_woocommerce_email_recipient_modify', 11, 3);
add_filter('woocommerce_email_recipient_low_stock', 'mxp_woocommerce_email_recipient_modify', 11, 3);
add_filter('woocommerce_email_recipient_no_stock', 'mxp_woocommerce_email_recipient_modify', 11, 3);
add_filter('woocommerce_email_recipient_backorder', 'mxp_woocommerce_email_recipient_modify', 11, 3);
把預設指定管理員信箱的邏輯調整成「預設網站中有商店管理員角色權限的使用者信箱」。
修改的範圍有:「新訂單」、「取消的訂單」、「失敗的訂單」、「低庫存」、「無庫存」與「預購」這幾個情境。
由於 WooCommerce 這邊信箱的設定其實預設沒有寫進資料庫,這邊程式碼片段的直接干預也有保留「如果有寫進資料庫,就已寫入的那組為主」的彈性。
如有其他邏輯條件,再來根據這基礎做些調整即可。