常遇到讀者來信問說該如何知道要修改外掛功能時該用哪個勾點,坦白說我也不知道,只能靠著經驗跟 Google 來找,但常常也會卡關就是了,於是我試著紀錄自己在找線索時的思考方向與步驟,作為除錯時的一個參考。
我的情境是這樣:客戶發現課程外掛 LearnDash 在顧客送出訂單後且訂單狀態變更為處理中時,顧客就能看到課程內容,但有些付款方式當訂單處理中時事實上還沒付款完成,因此造成顧客還沒付錢就能看到課程內容,為了要修改這問題我的思路如下:
- 先從資料庫裡面查紀錄使用者課程開通的欄位叫什麼
- 從程式碼裡面去找寫入該欄位的函式寫在哪邊
- 但發現程式碼太大不容易爬
- 於是換個方向,先測試是在哪幾種訂單狀態會開通
- 找到只有在訂單狀態為完成、處理中時會開通
- 找到訂單變成取消時會移除開通權限
- 發現該功能寫在 LearnDash 的擴充 learndash-woocommerce
- 使用 VSCode 開啟該擴功的資料夾進行搜索
- 搜尋關鍵字 processing、completed 或是 hook
- 發現在勾點
woocommerce_order_status_processing
有觸發add_course_access()
的方法 - 找到後思考該如何不動到原始碼的情況下進行修改
- 發現到移除課程觀看權限的方法是
remove_course_access()
所以我最後的解法是在勾點 woocommerce_order_status_processing
的地方多呼叫一次 remove_course_access()
,就能確保當訂單狀態變為處理中時能移除課程權限:
<?php
function remove_course_permission() {
add_action( 'woocommerce_order_status_processing', array( 'Learndash_WooCommerce', 'remove_course_access' ), 99, 1 );
}
add_action( 'plugins_loaded', 'remove_course_permission' );