WordPress 外掛開發 – 讀取CSV檔匯入使用者資訊

我雖然有十多年開發經驗,但在這個開發階段,轉投入 WordPress 開發的時間不長,我也不喜歡硬嗑K技術文件工作上也不會有這樣的時間,所以主要是憑藉著過往經驗跟 ChatGPT 的幫助,解決各種需求,因此有心轉投 WordPress 的開發人員,可以參考我處理的思考方式,文章著重在思考跟邏輯面,若需要程式碼或者需要相關協助可以透過 Email 聯繫我

情境描述

新建立的電商網站,希望從CRM系統中匯出使用者資訊並整理成CSV檔,然後將CSV內容匯入網站成為客戶,並且需提供分群功能,以便日後針對不同客群寄送邀請信。

初判

從上述我預估要開發的功能可以拆分成下面幾個

  • 使用者匯入機制
  • 使用者群組管理
  • 邀請函管理

本文主要談「使用者匯入機制」這塊,其他功能將在後續繼續討論

分析與設計

如果有做過類似功能的工程師,大概可以想到後台頁面上要提供一個<form>裡面包著上傳檔案的 input 跟送出按鈕,送出後來到後端時 php 解析 CSV 內容,然後開始逐一新增使用者,處理完後導回原本頁面並顯示處理結果。

如果只是這樣可能還蠻容易就能找到現成的外掛來使用,不論品質的狀況下,至少有機會可以把這功能切給不會寫程式的人處理。

接下來我們就來看看到底還有哪些考量,讓我們有理由自己動手寫!

  1. 註冊大量帳號寄信時間過長的問題
  2. CRM給的檔案包含了好多wordpress 預設沒有的欄位
  3. CRM帶過來的欄位要怎麼修改

第一個問題,通常網頁呼叫都會設有最大執行或等待時間,時間到就斷掉連線,斷掉後比較好的結果是 Server 端仍在處理,只是前端追蹤不到進度,最糟糕就是只做一半。這邊我的做法是

  1. 改為 JS 讀取 csv 檔後在前端以Table方式呈現出來
  2. 利用 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() 的處理

如此一套完整的匯入功能就完成了!

後續 WordPress 外掛開發 – 使用者群組管理與邀請函管理