在某些情境下我們需要透過程式碼來開通 LearnDash 的課程瀏覽權限,像是有些免費課程需要填表單才能觀看,或是連續登入 N 日就送課程,雖然 LearnDash 的擴充套件很豐富,但難免還是遇到需要自行處理的部分。
LearnDash 紀錄會員瀏覽課程權限的方式寫在 wp_usermeta
資料表, meta key 是 'course_' . $course_id . '_access_from
,value 則是 timestamp,當登入的 user 帶有 course_123_access_from
這個 meta 的時候,就代表他有權限瀏覽 ID 為 123 的課程。
以 LearnDash WooCommerce Integration 擴充為例,我想在訂單成立後就讓購買者有課程瀏覽權限,該擴充可以在商品設定頁設定該商品要綁定的課程,讓我們可以根據訂單中的商品明細來取得要開通的課程 ID,欄位名稱是 _related_course
,回傳的是課程 ID 陣列。
因此處理的邏輯是當訂單完成後取得商品 ID 關聯的課程 ID,並將課程 ID 寫入 usemeta 之中,程式碼如下:
add_action(
'woocommerce_order_status_pending',
function( $order_id ) {
$order = wc_get_order( $order_id );
$user_id = $order->get_user_id();
// 取得可變商品屬性 ID
foreach ( $order->get_items() as $item ) {
$variation_id = $item->get_variation_id();
}
if ( $variation_id ) {
$related_course_ids = get_post_meta( $variation_id, '_related_course', true );
if ( $related_course_ids ) {
foreach ( $related_course_ids as $course_id ) {
update_user_meta( $user_id, 'course_' . $course_id . '_access_from', time() );
}
}
}
},
10,
1
);
2 則留言
嗨Oberon , 你的程式碼中:
// 取得可變商品屬性 ID
foreach ( $order->get_items() as $item ) {
$variation_id = $item->get_variation_id();
}
由於是foreach迴圈,這邊可以確定$item只有一個嗎?如果一個order理有多個item,這樣後面處理的程式碼會變成只處理到最後一個item的$variation_id。
我對WooCommerce和LeanDash不熟,只是對程式碼的邏輯提出一些疑問,跟你討論。謝謝。
Hi David
你說的沒錯,正常情況下應該還要準備一個陣列來放 variation_id,但我的情境真的剛好是每張訂單只會有一個商品,所以就這樣寫了XD
非常感謝你的回饋,我再調整一下!