[WooCommerce] 修改預設訂單狀態與低庫存通知收件人的方法

本篇文章更新時間: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 這邊信箱的設定其實預設沒有寫進資料庫,這邊程式碼片段的直接干預也有保留「如果有寫進資料庫,就已寫入的那組為主」的彈性。

如有其他邏輯條件,再來根據這基礎做些調整即可。


Share:

作者: Chun

資訊愛好人士。主張「人人都該為了偷懶而進步」。期許自己成為斜槓到變進度條 100% 的年輕人。[///////////____36%_________]

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *


文章
Filter
Apply Filters
Mastodon