ออก Open Badge จาก WordPress (โดยไม่ต้องใช้ปลั๊กอินหนักๆ)

ออก Open Badge จากปลั๊กอินคอร์ส/LMS ของ WordPress ใดก็ได้ (LearnDash, LifterLMS, Tutor) โดยเรียก Badges Ninja API เมื่อเรียนจบ — ไม่ต้องติดตั้งปลั๊กอินแบดจ์แยกต่างหาก

Nacho Coll โดย อัปเดตล่าสุด 6 นาทีอ่าน
ออก Open Badge จากปลั๊กอินคอร์ส/LMS ของ WordPress ใดก็ได้ (LearnDash, LifterLMS, Tutor) โดยเรียก Badges Ninja API เมื่อเรียนจบ — ไม่ต้องติดตั้งปลั๊กอินแบดจ์แยกต่างหาก

ถ้าคุณเปิดคอร์สเรียนบน WordPress คุณคงคุ้นเคยกับรูปแบบนี้ดี: มีคนเรียนจบโมดูลใน LearnDash, LifterLMS หรือ Tutor LMS ระบบ LMS ทำเครื่องหมายว่า “เรียนจบแล้ว” แล้วก็… ไม่มีอะไรที่ตรวจสอบได้เกิดขึ้นเลย บางทีคุณอาจส่ง PDF ทางอีเมล บางทีคุณอาจติดตั้งปลั๊กอินแบดจ์เฉพาะสำหรับ WordPress ที่เพิ่มตารางฐานข้อมูลของตัวเอง คลังภาพของตัวเอง และแนวคิดของตัวเองว่า “แบดจ์” คืออะไร — แบดจ์ที่ไม่มีใครนอกเว็บไซต์ของคุณตรวจสอบได้

มีวิธีที่ง่ายกว่านั้น ปลั๊กอินคอร์สของ WordPress จะยิง action hook ทันทีที่มีคนเรียนจบคอร์ส คุณสามารถดักจับ hook นั้นแล้วเรียก HTTP ไปยัง Badges Ninja API เพียงครั้งเดียว ไม่ต้องใช้ปลั๊กอินเพิ่ม ไม่ต้องใช้โฮสติ้งเพิ่ม ไม่ต้องมีรูปแบบแบดจ์เฉพาะของตัวเอง — มีเพียงเครดิเชียล Open Badge v2.0 ที่เป็นไปตามมาตรฐาน ซึ่งผู้รับสามารถตรวจสอบได้ทุกที่ เพิ่มลงใน LinkedIn และดาวน์โหลดเป็น PDF ได้

บทความนี้จะอธิบายรูปแบบนี้ครั้งเดียว แล้วแสดง hook เฉพาะสำหรับ LearnDash, LifterLMS และ Tutor LMS

ทำไมไม่ใช้ปลั๊กอินแบดจ์ของ WordPress ไปเลย?

ปลั๊กอินแบดจ์เฉพาะสำหรับ WordPress แก้ปัญหาที่แคบกว่าที่ดูเหมือนจะแก้ พวกมันเก่งในการแสดงรูปภาพบนหน้า “ความสำเร็จของฉัน” ภายในเว็บไซต์ของคุณ แต่มักจะอ่อนกว่ามากในเรื่องที่สำคัญจริงๆ สำหรับเครดิเชียล:

  • การพกพาได้ (Portability) แบดจ์ที่มีอยู่แค่ในรูปแบบ shortcode บนเว็บไซต์ WordPress ของคุณไม่ใช่เครดิเชียล — มันเป็นแค่ของประดับ ทันทีที่ผู้รับเปลี่ยนงาน เปลี่ยนอีเมล หรือเว็บไซต์ของคุณล่ม “หลักฐาน” นั้นก็หายไปด้วย
  • การตรวจสอบ (Verification) ใครก็ตามควรตรวจสอบได้ว่าเครดิเชียลนั้นเป็นของจริง โดยไม่ต้องล็อกอินเข้าหลังบ้าน WordPress ของคุณ Open Badge v2.0 ออกแบบมาให้มี URL สำหรับตรวจสอบแบบสาธารณะ และ JSON-LD ที่เครื่องอ่านได้ในตัว
  • พื้นที่ที่ต้องดูแลรักษา (Maintenance surface) ปลั๊กอิน WordPress ทุกตัวคือสิ่งที่ต้องอัปเดตเพิ่ม ตารางฐานข้อมูลที่ต้องสำรองข้อมูลเพิ่ม และจุดที่อาจล้มเหลวเพิ่มขึ้นเวลาที่อัปเดตแกนหลักของระบบ

การเรียก API ภายนอกเมื่อเรียนจบคอร์สช่วยหลีกเลี่ยงปัญหาทั้งสามข้อนี้ได้ WordPress ยังคงรับผิดชอบสิ่งที่มันทำได้ดี — การส่งมอบเนื้อหาและการติดตามความคืบหน้า — ในขณะที่เครดิเชียลเองอยู่ในระบบที่สร้างขึ้นมาโดยเฉพาะสำหรับการออก ตรวจสอบ และแชร์

รูปแบบการทำงาน: หนึ่ง hook หนึ่งการเรียก HTTP

ปลั๊กอิน LMS หลักๆ ของ WordPress ทุกตัวจะยิง action เมื่อผู้ใช้เรียนจบคอร์ส การเชื่อมต่อจะมีขั้นตอนเดียวกันเสมอสามขั้นตอนคือ:

  1. เชื่อมต่อกับ action การเรียนจบ ของ LMS ที่คุณใช้
  2. ค้นหา (หรือสร้าง) ข้อมูลผู้รับ — ปกติแล้วก็แค่อีเมลและชื่อที่แสดงของบัญชี WordPress
  3. เรียก POST /awards บน Badges Ninja API ด้วย wp_remote_post() โดยส่ง ID ของแบดจ์และรายละเอียดผู้รับไปด้วย

ก่อนอื่นคุณต้องมี API key สร้างได้จากแดชบอร์ดของคุณในเมนู API Keys — ดู คู่มือ API key สำหรับขั้นตอนแบบเต็ม คีย์จะแสดงให้เห็นเพียงครั้งเดียวตอนสร้าง ดังนั้นให้เก็บไว้ใน wp-config.php เป็นค่าคงที่แทนที่จะเก็บในฐานข้อมูล:

define( 'BADGES_NINJA_API_KEY', 'bws_your_32_hex_key_here' );
define( 'BADGES_NINJA_BADGE_ID', 'your-badge-id' );

คีย์ที่เพิ่งสร้างใหม่ที่แสดงเพียงครั้งเดียว

เก็บคีย์นี้ไว้ฝั่งเซิร์ฟเวอร์เท่านั้น ทุกอย่างในคู่มือนี้ทำงานด้วย PHP บนเซิร์ฟเวอร์ WordPress ของคุณ — wp_remote_post() เป็นการเรียกฝั่งเซิร์ฟเวอร์ และ wp-config.php จะไม่ถูกส่งไปยังเบราว์เซอร์เลย นั่นคือสิ่งที่คุณต้องการพอดี: คีย์เดินทางจากเซิร์ฟเวอร์ถึงเซิร์ฟเวอร์ผ่าน HTTPS และผู้เยี่ยมชมเว็บไซต์ไม่สามารถอ่านมันได้ ห้าม ย้ายการเรียกนี้ไปไว้ใน JavaScript ฝั่งไคลเอนต์เด็ดขาด — เพราะ fetch() จากเบราว์เซอร์ที่ฝังคีย์ไว้จะเปิดเผยคีย์ให้ใครก็ตามเห็นผ่านเครื่องมือนักพัฒนาของเบราว์เซอร์ มีสองข้อควรทำเป็นนิสัย: ตรวจสอบให้แน่ใจว่าโฮสต์ของคุณเสิร์ฟ wp-config.php ในรูปแบบ PHP ที่ถูกประมวลผลแล้ว (ไม่ใช่ plaintext และอย่าปล่อยให้มีสำเนา wp-config.php.bak อยู่ใน webroot) และสร้าง API key เฉพาะ สำหรับการเชื่อมต่อนี้ เพื่อให้คุณเพิกถอนได้อย่างอิสระหากมันถูกบุกรุก — โดยไม่กระทบเครื่องมืออื่นๆ ของคุณ

ฟังก์ชันตัวช่วยที่ใช้ร่วมกันจะทำให้ทุก hook ของ LMS มีขนาดเล็กและเรียบง่าย:

function badges_ninja_issue_award( $recipient_email, $recipient_name, $badge_id ) {
	$response = wp_remote_post( 'https://api.badges.ninja/awards', array(
		'headers' => array(
			'X-Api-Key'    => BADGES_NINJA_API_KEY,
			'Content-Type' => 'application/json',
		),
		'body' => wp_json_encode( array(
			'badgeId'   => $badge_id,
			'recipient' => array(
				'name'  => $recipient_name,  // must be at least 5 characters
				'email' => $recipient_email,
			),
			'issuedOn'  => round( microtime( true ) * 1000 ), // epoch milliseconds
		) ),
		'timeout' => 15,
	) );
	if ( is_wp_error( $response ) ) {
		error_log( 'Badges Ninja award failed: ' . $response->get_error_message() );
		return false;
	}
	$code = wp_remote_retrieve_response_code( $response );
	if ( $code >= 400 ) {
		error_log( 'Badges Ninja award failed with HTTP ' . $code . ': ' . wp_remote_retrieve_body( $response ) );
		return false;
	}
	return json_decode( wp_remote_retrieve_body( $response ), true );
}

อีเมลของผู้รับจะถูกแฮชด้วย SHA-256 ฝั่งเซิร์ฟเวอร์ทันทีที่ถึง Badges Ninja และข้อมูลที่ส่งกลับมาจะรวม URL สำหรับตรวจสอบของรางวัลนั้นด้วย — สะดวกมากถ้าคุณต้องการแสดงลิงก์ “ดูเครดิเชียลของคุณ” ใน WordPress ทันทีหลังจากการเรียกสำเร็จ

LearnDash

LearnDash จะยิง learndash_course_completed พร้อมอาร์กิวเมนต์แบบ array ตัวเดียวที่มี user และ course อยู่ข้างใน:

add_action( 'learndash_course_completed', function( $data ) {
	$user   = $data['user'];
	$course = $data['course'];
	// Map LearnDash course ID → your Badges Ninja badge ID.
	// A simple approach: store the badge ID in a course custom field.
	$badge_id = get_post_meta( $course->ID, 'badges_ninja_badge_id', true );
	if ( ! $badge_id ) {
		return; // no badge configured for this course
	}
	badges_ninja_issue_award( $user->user_email, $user->display_name, $badge_id );
} );

การเก็บ ID ของแบดจ์ไว้ในเมตาของคอร์ส (แทนที่จะใช้ค่าคงที่ BADGES_NINJA_BADGE_ID เดียวแบบ global) เป็นวิธีที่ถูกต้องเมื่อคุณมีคอร์สมากกว่าหนึ่งคอร์ส — เพราะแต่ละคอร์สจะผูกกับดีไซน์แบดจ์ของตัวเอง

LifterLMS

LifterLMS จะยิง lifterlms_course_completed พร้อม $user_id และ $course_id:

add_action( 'lifterlms_course_completed', function( $user_id, $course_id ) {
	$user     = get_userdata( $user_id );
	$badge_id = get_post_meta( $course_id, 'badges_ninja_badge_id', true );
	if ( ! $user || ! $badge_id ) {
		return;
	}
	badges_ninja_issue_award( $user->user_email, $user->display_name, $badge_id );
}, 10, 2 );

Tutor LMS

Tutor LMS จะยิง tutor_course_complete_after พร้อม ID ของคอร์ส และคุณต้องดึงผู้ใช้ปัจจุบันจากเซสชันเอง:

add_action( 'tutor_course_complete_after', function( $course_id ) {
	$user_id  = get_current_user_id();
	$user     = get_userdata( $user_id );
	$badge_id = get_post_meta( $course_id, 'badges_ninja_badge_id', true );
	if ( ! $user || ! $badge_id ) {
		return;
	}
	badges_ninja_issue_award( $user->user_email, $user->display_name, $badge_id );
} );

ถ้าการตั้งค่า Tutor LMS ของคุณยิงเหตุการณ์เรียนจบจากโพรเซสที่ทำงานเบื้องหลัง (เช่น ผ่านการตรวจให้คะแนนแบบทดสอบอัตโนมัติ) ให้เปลี่ยนจาก get_current_user_id() เป็น ID ผู้ใช้ที่ hook เฉพาะของคุณส่งมาให้แทน — ลองตรวจสอบ payload ด้วย error_log( print_r( func_get_args(), true ) ) สักครั้งระหว่างตั้งค่าเพื่อยืนยันอาร์กิวเมนต์

ออกแบบแบดจ์ก่อนเชื่อมต่อ hook

ก่อนที่ทุกอย่างนี้จะทำงานได้ คุณต้องมีแบดจ์สำหรับมอบให้ก่อน เครื่องมือออกแบบเชิงภาพ รองรับเรื่องนี้ได้โดยไม่ต้องมีนักออกแบบในทีม — มีเทมเพลตรูปทรงกว่า 80 แบบ สีที่ปรับแต่งได้ คลังไอคอน และการอัปโหลดโลโก้ ทั้งหมดจัดวางแบบ snap-to-grid ถ้าคุณยังไม่คุ้นเคยกับเครื่องมือออกแบบ บทความ ออกแบบใบรับรองดิจิทัลที่ตรวจสอบได้ใบแรกของคุณ จะพาคุณเลือกเทมเพลตและสร้างสิ่งที่ผู้รับอยากแชร์จริงๆ

เมื่อแบดจ์ถูกสร้างขึ้นแล้ว ให้นำ ID ของมันจากแดชบอร์ด (หรือผ่าน GET /badges) มาใส่ในฟิลด์ที่กำหนดเองของคอร์สของคุณ

สิ่งที่ผู้รับได้จริงๆ

นี่คือส่วนที่ปลั๊กอินแบดจ์ WordPress ที่สร้างขึ้นเองไม่สามารถทำได้ เมื่อ POST /awards สำเร็จ ผู้รับจะได้รับ:

  • URL สำหรับตรวจสอบ เฉพาะตัวที่ใครก็เปิดดูได้ — ไม่ต้องล็อกอิน WordPress — แสดงให้เห็นว่าเครดิเชียลนี้เป็นของจริง ใครเป็นผู้ออก และออกเมื่อไหร่
  • QR code และ ใบรับรอง PDF ขนาด A4 ที่สร้างขึ้นโดยอัตโนมัติ
  • ปุ่ม เพิ่มลงในโปรไฟล์ LinkedIn หากผู้ออกของคุณตั้งค่า LinkedIn organization ID ไว้แล้ว — ดู เพิ่มปุ่ม “Add to Profile” ของ LinkedIn สำหรับการตั้งค่าครั้งเดียว
  • สิทธิ์เข้าถึง พอร์ทัลของผู้รับ ของตัวเองที่ badges.ninja/me ผ่านการล็อกอินแบบ magic link — ไม่ต้องจำรหัสผ่าน ไม่ต้องจัดการบัญชีแยกต่างหากบนเว็บไซต์ WordPress ของคุณ
  • Open Badge v2.0 JSON-LD ที่เป็นไปตามมาตรฐาน ทำให้ตัวตรวจสอบใดๆ ที่รองรับ OB (ไม่ใช่แค่ Badges Ninja) สามารถตรวจสอบความถูกต้องได้

ไม่มีสิ่งใดในนี้ที่เป็นหน้าที่ของ WordPress ที่ต้องสร้าง และไม่มีสิ่งใดควรอยู่แค่ในฐานข้อมูล WordPress ของคุณเท่านั้น

จัดการความล้มเหลวอย่างนุ่มนวล

hook การเรียนจบคอร์สจะทำงานระหว่างการร้องขอหน้าเว็บแบบสด และการเรียก API ที่ช้าหรือล้มเหลวไม่ควรไปบล็อกหน้าจอ “ยินดีด้วย” ของผู้เรียน มีการปรับแต่งที่ใช้ได้จริงสองอย่างเมื่อคุณพ้นขั้นตอน proof of concept ไปแล้ว:

อย่าปล่อยให้การมอบรางวัลที่ล้มเหลวไปบล็อก UI ฟังก์ชันตัวช่วยด้านบนนี้บันทึกล็อกและคืนค่า false อยู่แล้วแทนที่จะโยน exception — LearnDash, LifterLMS และ Tutor ต่างก็ดำเนินขั้นตอนการเรียนจบตามปกติต่อไป ไม่ว่า badges_ninja_issue_award() จะคืนค่าอะไรก็ตาม

ใส่คิวแทนการเรียกแบบ inline เมื่อทำงานในระดับใหญ่ ถ้าคุณกำลังให้กลุ่มผู้เรียนจำนวนมากผ่านคอร์สเดียวกันพร้อมกัน (เช่น วันเริ่มต้นของกลุ่มผู้เรียน หรือการปลดล็อกวิดีโอย้อนหลังของเว็บบินาร์) ให้ยิง event ที่ตั้งเวลาไว้แบบ WP-Cron จาก hook แทนการเรียก API แบบซิงโครนัส:

add_action( 'learndash_course_completed', function( $data ) {
	wp_schedule_single_event( time() + 30, 'badges_ninja_deferred_award', array(
		$data['user']->user_email,
		$data['user']->display_name,
		get_post_meta( $data['course']->ID, 'badges_ninja_badge_id', true ),
	) );
} );
add_action( 'badges_ninja_deferred_award', 'badges_ninja_issue_award', 10, 3 );

วิธีนี้ช่วยกระจายโหลด และป้องกันไม่ให้คำขอที่ช้าเพียงคำขอเดียวกลายเป็นปัญหาของผู้เรียน สำหรับชุดข้อมูลขนาดใหญ่จริงๆ (เช่น ผู้เรียนกลุ่มเก่าทั้งหมดที่ย้ายมาในครั้งเดียว) ให้ข้ามเส้นทาง hook ของ WordPress ไปเลย แล้วใช้ การมอบรางวัลแบบกลุ่มผ่าน CSV แทน — อัปโหลดครั้งเดียว แล้วแพลตฟอร์มจะแบ่งหน้าการออกแบดจ์ฝั่งเซิร์ฟเวอร์ พร้อมระบบหยุดชั่วคราว/ทำต่อในตัว

หมายเหตุเรื่อง idempotency

ถ้า LMS ของคุณยิง hook การเรียนจบมากกว่าหนึ่งครั้งสำหรับผู้ใช้คนเดียวกัน (กรณีที่พบได้บ่อยใน LearnDash เมื่อมีการทำแบบทดสอบซ้ำ หรือการซิงค์ใหม่ของ Tutor LMS) คุณคงไม่อยากมอบแบดจ์เดียวกันซ้ำสองครั้ง วิธีป้องกันที่ง่ายที่สุดคือใช้ flag แบบ user-meta ของ WordPress ที่ตั้งค่าทันทีหลังการเรียกสำเร็จ:

if ( get_user_meta( $user_id, 'badges_ninja_awarded_' . $course_id, true ) ) {
	return; // already issued
}
$result = badges_ninja_issue_award( $user->user_email, $user->display_name, $badge_id );
if ( $result ) {
	update_user_meta( $user_id, 'badges_ninja_awarded_' . $course_id, true );
}

ถ้าคุณออกแบดจ์ในปริมาณมากจริงๆ และต้องการจัดการเรื่องนี้จากศูนย์กลางแทนที่จะทำทีละเว็บไซต์ ลองดู การจัดการอีเวนต์ผ่าน webhook หรือ คู่มือเริ่มต้นใช้งาน API แบบเต็มสำหรับรูปแบบคำขอ/คำตอบของทุก endpoint

เมื่อรูปแบบนี้ขยายเกินกว่าคอร์สเดียว

ตัวอย่างด้านบนสมมติว่ามีแบดจ์เดียวต่อหนึ่งคอร์ส แต่เมื่อคุณเริ่มใช้เครดิเชียลแบบซ้อนกันได้ — เช่น แบดจ์สายการเรียนที่ปลดล็อกหลังจากได้แบดจ์ของหลายคอร์ส หรือแบดจ์สุดท้ายที่ขึ้นกับข้อกำหนดเบื้องต้นหลายอย่าง — ให้ย้ายการจับคู่ “แบดจ์ไหนคู่กับการเรียนจบแบบไหน” ออกจาก post meta ไปไว้ในตารางค้นหาขนาดเล็ก หรือขับเคลื่อนด้วยระบบอัตโนมัติที่อิงสเปรดชีต (Airtable หรือ Google Sheets) ที่ยิงคำสั่ง POST /awards เดียวกัน ตัวการเรียก API เองไม่เปลี่ยนแปลง สิ่งที่เปลี่ยนคือสิ่งที่ตัดสินใจว่าจะเรียกเมื่อไหร่เท่านั้น

การแก้ไขปัญหาในการเชื่อมต่อ

มีปัญหาไม่กี่อย่างที่เป็นสาเหตุหลักของความยุ่งยากที่คนส่วนใหญ่เจอตอนตั้งค่าครั้งแรก:

hook ไม่ทำงานเลย ตรวจสอบให้แน่ใจว่าคุณเชื่อมกับ action ที่ถูกต้องตามเวอร์ชันจริงของปลั๊กอินคุณ — โดยเฉพาะ LearnDash ที่เปลี่ยนชื่อ hook การเรียนจบไปตามรุ่นใหญ่ๆ (การติดตั้งรุ่นเก่าบางครั้งยังพึ่งพา learndash_course_completed ที่ทำงานจาก code path ที่ต่างจากรุ่นใหม่) ให้เพิ่ม error_log() ชั่วคราวไว้บนสุดของ callback แล้วดู wp-content/debug.log ขณะที่คุณเรียนจบคอร์สทดสอบด้วยบัญชีผู้ใช้ที่สร้างขึ้นมาทิ้ง

wp_remote_post() หมดเวลา (timeout) สภาพแวดล้อม shared hosting บางแห่งบล็อกการเชื่อมต่อ HTTPS ขาออกไปยังโฮสต์ที่ไม่คุ้นเคย หรือจำกัดเวลา timeout ของคำขอให้ต่ำกว่า 15 วินาทีที่ตั้งไว้ด้านบน ถ้าการเรียกหมดเวลาซ้ำๆ ให้ตรวจสอบกับผู้ให้บริการโฮสติ้งว่าอนุญาตการเชื่อมต่อขาออกไปยัง api.badges.ninja หรือไม่ และตรวจสอบว่า extension curl ของ PHP มีใบรับรอง CA ที่เป็นปัจจุบันหรือไม่ — ชุดใบรับรองที่ล้าสมัยเป็นสาเหตุความล้มเหลวแบบเงียบๆ ที่พบได้บ่อยบน shared-hosting รุ่นเก่า

400 Bad Request payload ขาดฟิลด์ที่จำเป็น หรือมีรูปแบบไม่ถูกต้อง POST /awards ต้องการ badgeId อ็อบเจกต์ recipient ที่ซ้อนอยู่ข้างในพร้อม name และ email และ timestamp issuedOn — ฟังก์ชันตัวช่วยด้านบนส่งข้อมูลตรงตามนี้พอดี จุดที่คนสะดุดบ่อยที่สุดคือ ชื่อ ของผู้รับ: ต้องมีอย่างน้อย 5 ตัวอักษร ดังนั้นชื่อที่แสดงใน WordPress อย่าง “Jo” จะถูกปฏิเสธ ให้ใช้ชื่อเต็มของบัญชี (หรือส่วนหน้าของอีเมล) แทนเมื่อชื่อที่แสดงสั้นเกินไป

401 Unauthorized ค่าคงที่ของ API key ไม่ถูกโหลด หรือถูกสร้างใหม่หลังจากที่ตั้งค่าคงที่ไปแล้ว คีย์จะแสดงเพียงครั้งเดียวตอนสร้าง และไม่สามารถดึงกลับมาดูได้อีก — ถ้าคุณจำไม่ได้ว่าคีย์ไหนที่ยังใช้งานอยู่ ให้ลบคีย์เก่าทิ้งแล้วออกคีย์ใหม่แทนการเดา

ออกแบดจ์แล้ว แต่เป็นดีไซน์แบดจ์ที่ผิด ส่วนใหญ่มักเกิดจากค่า post-meta badges_ninja_badge_id เก่าที่หลงเหลือจากการทดสอบ เนื่องจากการจับคู่นี้อยู่ในโพสต์ของคอร์ส จึงลืมได้ง่ายว่าคุณเปลี่ยนค่านี้ไปแล้วหลังจากทำสำเนาคอร์สสำหรับกลุ่มผู้เรียนใหม่ — ควรตรวจสอบอย่างรวดเร็วทุกครั้งที่คุณโคลนคอร์ส

ได้รับรางวัลซ้ำสำหรับคนเดียวกัน ได้กล่าวไปแล้วด้านบนด้วยการป้องกันแบบ user-meta แต่ก็ควรย้ำอีกครั้งว่า hook การเรียนจบของ LMS ไม่ได้รับประกันว่าจะทำงานแค่ครั้งเดียวเสมอไป ให้ถือว่า “มอบรางวัลไปแล้ว” เป็นกรณีปกติที่ต้องตรวจสอบ ไม่ใช่กรณีพิเศษที่มองข้ามได้

คำถามที่พบบ่อย

ใช้ได้กับชุดคอร์สแบบรวม (bundle) ของ WooCommerce ไหม? ได้ — ถ้าการซื้อชุดรวมควรกระตุ้นแบดจ์โดยไม่ขึ้นกับการเรียนจบคอร์ส (เช่น แบดจ์ “สมาชิกที่ได้รับการรับรอง” สำหรับใครก็ตามที่ซื้อชุดรวมนั้นๆ) ให้เชื่อมกับ woocommerce_order_status_completed แทน action การเรียนจบของ LMS แล้วค้นหา ID ของแบดจ์จากเมตาของสินค้าแทนที่จะเป็นคอร์ส

ผู้รับสามารถได้รับแบดจ์โดยไม่ต้องมีบัญชี WordPress ไหม? ได้ และนั่นคือประเด็นสำคัญ รางวัลจะผูกกับที่อยู่อีเมลของผู้รับใน Badges Ninja ไม่ใช่กับข้อมูลผู้ใช้ของ WordPress ถ้าเว็บไซต์ของคุณอนุญาตให้ชำระเงินแบบผู้เยี่ยมชม หรือทำแบบทดสอบแบบไม่ระบุตัวตนได้ ก็แค่ต้องแน่ใจว่าคุณเก็บที่อยู่อีเมลจริงเพื่อส่งเข้า badges_ninja_issue_award()

ถ้าอยากตรวจสอบรางวัลก่อนที่จะส่งออกไปล่ะ? ให้ข้ามการเรียกโดยตรงจาก hook การเรียนจบ แล้วเขียนรางวัลที่รอดำเนินการ (ผู้ใช้ คอร์ส และ timestamp) ลงในตารางที่กำหนดเองหรือ post type แทน แล้วออกรางวัลจากงานที่ตั้งเวลาไว้ หรือปุ่มแอดมิน “อนุมัติและมอบรางวัล” ที่เรียกฟังก์ชันตัวช่วยเดียวกันตามต้องการ

ต้องมีแบดจ์แยกต่างหากสำหรับแต่ละคอร์ส หรือแบดจ์เดียวครอบคลุมหลายคอร์สได้? ได้ทั้งสองแบบ ผู้ออกบางรายสร้างแบดจ์แยกต่อคอร์สเพื่อความละเอียด ในขณะที่บางรายสร้างแบดจ์ “จบโปรแกรม” เพียงใบเดียว แล้วมอบให้ก็ต่อเมื่อคอร์สที่จำเป็นทั้งหมดเรียนจบแล้ว โดยตรวจสอบการทำตามข้อกำหนดเบื้องต้นภายใน hook ก่อนเรียก API


พร้อมออกเครดิเชียลที่ตรวจสอบได้ใบแรกของคุณหรือยัง? เริ่มต้นใช้งานฟรีที่ badges.ninja — เครื่องมือออกแบบเชิงภาพ หน้าตรวจสอบสาธารณะ ใบรับรอง PDF ผลลัพธ์แบบ Open Badge v2.0 ไม่ต้องใช้บัตรเครดิต

Nacho Coll

เกี่ยวกับผู้เขียน

Founder & Engineer at Badges Ninja

Nacho founded Badges Ninja to make issuing verifiable digital credentials as simple as a single API call — Open Badge v2.0 badges and certificates, minted, hosted, and verifiable without standing up your own issuer infrastructure. Writes about the Open Badges spec, credential verification, and running a credentialing platform serverless on AWS, from the operator side of the wire.

กลับไปที่บล็อก

บทความที่เกี่ยวข้อง