本篇文章更新時間:2024/01/10
如有資訊過時或語誤之處,歡迎使用 Contact 功能通知。
一介資男的 LINE 社群開站囉!歡迎入群聊聊~
如果本站內容對你有幫助,歡迎使用 BFX Pay 加密貨幣 或 新台幣 贊助支持。
昨天因應客戶需求開發,想要設計一個能在前端顧客瀏覽網站時出現通知的功能。
這功能不是全站大橫幅「公告」類型,而是「針對性」的指定通知某個顧客的方式。由於是與系統發信同步,所以就沒有特別設計一個後台來做指定顧客與內容的方法,純粹條件滿足有發信,就補上這樣的通知給使用中的顧客提醒。
方法設計如下:
- 發信時,一併將標題與內文存入
_usermeta
資料表。 - 顧客登入狀態下,檢查資料表中是否有留下訊息。
- 有的話,就輸出成前端 JavaScript Alert 方式提醒。
存入 _usermeta
資料表
$now = time();
wp_mail($customer_email, $subject, $body, $headers);
$notice = array(
'subject' => $subject,
'body' => $body,
);
update_user_meta($user_id, 'mxp_notice_alert_' . $now, $notice);
存入的邏輯或是內容等,都可以自己根據使用情境配置,哪怕是設計過一個後台介面指定顧客與指定內容都可以。關鍵程式碼如上,將通知訊息存入使用者的中繼資料表中。
檢查是否有留下訊息,並輸出
// 如果使用者有通知需要顯示,就抓出來顯示
function mxp_show_notice_alart() {
$user_id = get_current_user_id();
if ($user_id == 0 || wp_doing_ajax() || is_ajax() || wp_doing_cron()) {
return;
}
if (is_product() || is_product_category() || is_product_tag() || is_shop() || is_singular()) {
global $wpdb;
$get_all_notice = $wpdb->get_results($wpdb->prepare("SELECT meta_key FROM {$wpdb->prefix}usermeta WHERE meta_key LIKE %s AND user_id = %d", 'mxp_notice_alert_%', $user_id), ARRAY_A);
foreach ($get_all_notice as $key => $notice) {
$notice_key = $notice['meta_key'];
$notice_data = get_user_meta($user_id, $notice_key, true);
if (!empty($notice_data) && is_array($notice_data)) {
$subject = str_replace('
', '\n', $notice_data['subject']);
$body = str_replace('
', '\n', $notice_data['body']);
echo "";
delete_user_meta($user_id, $notice_key);
}
}
}
}
add_action('wp_footer', 'mxp_show_notice_alart');
前端部分,透過 wp_footer
這個 Hook 勾點來檢查,查詢使用者 _usermeta
中繼資料表是否有紀錄還沒發送。
確保顧客是在瀏覽某些頁面下才輸出提示,避免某些背後執行的做法(Ex: AJAX, CRON ...等 )觸發。
再來就是把通知內容撈出來組合成 JavaScript 通知方法顯示於前端給瀏覽器觸發,完成!
最後記得刪除這筆已經顯示於前端通知的訊息,清空訊息佇列。
後記
機制還滿簡單的,關鍵的部分要注意是想要在哪裡「勾」起來,需要多補一些判斷來確保。
有些勾點不一定會在使用者真的有在瀏覽時才會觸發,可能是某個後端請求或是背景執行時就有被呼叫到,導致訊息其實沒有準確地傳達到瀏覽者面前。