我雖然有十多年開發經驗,但在這個開發階段,轉投入 WordPress 開發的時間不長,我也不喜歡硬嗑K技術文件工作上也不會有這樣的時間,所以主要是憑藉著過往經驗跟 ChatGPT 的幫助,解決各種需求,因此有心轉投 WordPress 的開發人員,可以參考我處理的思考方式,文章著重在思考跟邏輯面,若需要程式碼或者需要相關協助可以透過 Email 聯繫我
情境描述
新建立的電商網站,希望從CRM系統中匯出使用者資訊並整理成CSV檔,然後將CSV內容匯入網站成為客戶,並且需提供分群功能,以便日後針對不同客群寄送邀請信。
初判
從上述我預估要開發的功能可以拆分成下面幾個
- 使用者匯入機制
- 使用者群組管理
- 邀請函管理
本文主要談「使用者匯入機制」這塊,其他功能將在後續繼續討論
分析與設計
如果有做過類似功能的工程師,大概可以想到後台頁面上要提供一個<form>裡面包著上傳檔案的 input 跟送出按鈕,送出後來到後端時 php 解析 CSV 內容,然後開始逐一新增使用者,處理完後導回原本頁面並顯示處理結果。
如果只是這樣可能還蠻容易就能找到現成的外掛來使用,不論品質的狀況下,至少有機會可以把這功能切給不會寫程式的人處理。
接下來我們就來看看到底還有哪些考量,讓我們有理由自己動手寫!
- 註冊大量帳號寄信時間過長的問題
- CRM給的檔案包含了好多wordpress 預設沒有的欄位
- CRM帶過來的欄位要怎麼修改
第一個問題,通常網頁呼叫都會設有最大執行或等待時間,時間到就斷掉連線,斷掉後比較好的結果是 Server 端仍在處理,只是前端追蹤不到進度,最糟糕就是只做一半。這邊我的做法是
- 改為 JS 讀取 csv 檔後在前端以Table方式呈現出來
- 利用 ajax 依序送往後端處理,並即時更新處理狀況到 Table 中
如此處理人員可以很清楚看到,條列的資料、處理進度,也不用擔心執行時間過長
第二個問題,建立帳號主要內容為帳號跟Email,次要的相關欄位還有顯示名稱、First Name、Last Name 等等。不過來自CRM的資料可能更多啊,利如聯絡電話、地址、生日等等,這些要往哪裡塞呢?
如果你要仿照 WordPress 的邏輯,那麼這些資訊應該被存放在 usermeta 中,你可以在新增使用者成功後,利用使用者 ID 透過內建函式 update_user_meta() 這些額外資訊進行保存。
第三個問題,當匯入資料完成後,就跑到使用者管理頁面點了剛剛新增的使用者想看看詳細內容,可是卻發現這些從CRM帶過來的資訊並沒有被呈現在這邊,所以你得再繼續花點功夫補完這一塊!
首先是在詳細頁面要能看到,這部分必須透過 show_user_profile 及 edit_user_profile 這兩個 hook 將將類似下面這樣的HTML 塞入詳細頁面
<h3>CRM資訊</h3>
<table class="form-table">
<tr>
<th><label for="phone">電話</label></th>
<td>
<input type="text" name="phone" id="phone" value="<?php echo esc_attr(get_user_meta($user->ID, 'phone', true)); ?>" class="regular-text" />
</td>
</tr>
</table>
既然使用者詳細內容裡面有顯示了,也能修改了,那麼按儲存時,也要額外處理這些欄位,這時候要利用的是 personal_options_update 跟 edit_user_profile_update 這兩個 hook 對上面電話傳過來的值 $_POST[‘phone’] 進行update_user_meta() 的處理
如此一套完整的匯入功能就完成了!