LearnDash 手動開通課程瀏覽權限

在某些情境下我們需要透過程式碼來開通 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
);
文章標籤LearnDash

目錄

2 則留言

  1. 嗨Oberon , 你的程式碼中:
    // 取得可變商品屬性 ID
    foreach ( $order->get_items() as $item ) {
    $variation_id = $item->get_variation_id();
    }
    由於是foreach迴圈,這邊可以確定$item只有一個嗎?如果一個order理有多個item,這樣後面處理的程式碼會變成只處理到最後一個item的$variation_id。
    我對WooCommerce和LeanDash不熟,只是對程式碼的邏輯提出一些疑問,跟你討論。謝謝。

    1. Hi David

      你說的沒錯,正常情況下應該還要準備一個陣列來放 variation_id,但我的情境真的剛好是每張訂單只會有一個商品,所以就這樣寫了XD
      非常感謝你的回饋,我再調整一下!

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *

這個網站採用 Akismet 服務減少垃圾留言。進一步了解 Akismet 如何處理網站訪客的留言資料

Picture of 賴俊吾 / Oberon Lai
賴俊吾 / Oberon Lai

現為全職 WordPress 工程師,網站開發經歷 11 年,專攻前端工程與 WordPress 佈景主題、外掛客製化開發

訂閱電子報

Hi,我是 Oberon,我會固定在每週五早上發送接案心得以及與 WordPress 相關的電子報,同時也會分享一些實用的開發知識,讓你在 WordPress 的接案路上不孤單!

專注於分享 WordPress 開發、接案技巧、專案管理等自由工作者必備知識與心得

© 2024 想點創意科技有限公司

想點創意科技有限公司 | 統一編號 90516823
Designed by Hend Design | 隱私權政策

訂閱電子報

Hi,我是 Oberon,我會固定在每週五早上發送接案心得以及與 WordPress 相關的電子報,同時也會分享一些實用的開發知識,讓你在 WordPress 的接案路上不孤單!