वर्डप्रेस से ओपन बैज जारी करना (भारी प्लगइन के बिना)

किसी भी वर्डप्रेस कोर्स/LMS प्लगइन (LearnDash, LifterLMS, Tutor) से कोर्स पूरा होने पर Badges Ninja API को कॉल करके ओपन बैज जारी करें — अलग से कोई बैज प्लगइन इंस्टॉल करने की जरूरत नहीं।

Nacho Coll लेखक: अपडेट किया गया 14 मिनट पढ़ें
किसी भी वर्डप्रेस कोर्स/LMS प्लगइन (LearnDash, LifterLMS, Tutor) से कोर्स पूरा होने पर Badges Ninja API को कॉल करके ओपन बैज जारी करें — अलग से कोई बैज प्लगइन इंस्टॉल करने की जरूरत नहीं।

अगर आप वर्डप्रेस पर कोर्स चलाते हैं, तो आप पहले से यह पैटर्न जानते हैं: कोई LearnDash, LifterLMS, या Tutor LMS में एक मॉड्यूल पूरा करता है, LMS उन्हें “complete” मार्क करता है, और फिर… कुछ भी सत्यापन योग्य नहीं होता। शायद आप एक PDF ईमेल करते हैं। शायद आप एक समर्पित वर्डप्रेस बैज प्लगइन इंस्टॉल करते हैं जो अपनी खुद की डेटाबेस टेबल, अपनी खुद की इमेज लाइब्रेरी, और “बैज” क्या है इसकी अपनी खुद की अवधारणा जोड़ता है — एक ऐसी जो आपकी साइट के बाहर कोई भी सत्यापित नहीं कर सकता।

इसका एक आसान रास्ता है। वर्डप्रेस कोर्स प्लगइन जिस पल कोई कोर्स पूरा करता है, वह एक एक्शन हुक पहले से ही फायर करते हैं। आप उस हुक को पकड़ सकते हैं और Badges Ninja API को एक HTTP कॉल कर सकते हैं। कोई अतिरिक्त प्लगइन नहीं, कोई अतिरिक्त होस्टिंग नहीं, कोई proprietary बैज फॉर्मेट नहीं — बस एक स्टैंडर्ड्स-कम्प्लायंट Open Badge v2.0 क्रेडेंशियल जिसे आपका प्राप्तकर्ता कहीं भी सत्यापित कर सकता है, LinkedIn पर जोड़ सकता है, और PDF के रूप में डाउनलोड कर सकता है।

यह पोस्ट एक बार इस पैटर्न को समझाता है, फिर LearnDash, LifterLMS, और Tutor LMS के लिए विशिष्ट हुक दिखाता है।

सिर्फ एक वर्डप्रेस बैज प्लगइन का उपयोग क्यों न करें?

समर्पित वर्डप्रेस बैज प्लगइन वास्तव में उस समस्या से कहीं छोटी समस्या हल करते हैं जितनी वे हल करते हुए दिखते हैं। वे आपकी साइट के अंदर “my achievements” पेज पर एक इमेज रेंडर करने में अच्छे होते हैं। लेकिन क्रेडेंशियल के लिए वास्तव में जो मायने रखता है, उसमें वे आमतौर पर काफी कमजोर होते हैं:

  • पोर्टेबिलिटी। एक बैज जो केवल आपकी वर्डप्रेस साइट पर एक शॉर्टकोड के रूप में मौजूद है, वह क्रेडेंशियल नहीं है — वह सिर्फ एक सजावट है। जिस पल प्राप्तकर्ता नौकरी बदलता है, अपना इनबॉक्स बदलता है, या आपकी साइट डाउन हो जाती है, “प्रमाण” भी उसके साथ चला जाता है।
  • सत्यापन। किसी को भी आपके वर्डप्रेस एडमिन में लॉग इन किए बिना यह जांचने में सक्षम होना चाहिए कि कोई क्रेडेंशियल असली है। Open Badge v2.0 डिज़ाइन के हिसाब से आपको एक सार्वजनिक सत्यापन URL और मशीन-रीडेबल JSON-LD देता है।
  • मेंटेनेंस सरफेस। हर वर्डप्रेस प्लगइन एक और चीज़ है जिसे पैच करना है, एक और डेटाबेस टेबल है जिसका बैकअप लेना है, कोर अपडेट के दौरान एक और फेलियर पॉइंट है।

कोर्स पूरा होने पर एक एक्सटर्नल API को कॉल करना इन तीनों को टाल देता है। वर्डप्रेस उसी चीज़ के लिए जिम्मेदार रहता है जिसमें वह अच्छा है — कंटेंट डिलीवरी और प्रोग्रेस ट्रैकिंग — और क्रेडेंशियल खुद एक ऐसे सिस्टम में रहता है जो विशेष रूप से इसे जारी करने, सत्यापित करने और साझा करने के लिए बनाया गया है।

पैटर्न: एक हुक, एक HTTP कॉल

हर प्रमुख वर्डप्रेस LMS प्लगइन तब एक एक्शन फायर करता है जब कोई यूज़र कोर्स पूरा करता है। इंटीग्रेशन हमेशा यही तीन स्टेप होते हैं:

  1. अपने विशिष्ट LMS के लिए कम्प्लीशन एक्शन में हुक करें।
  2. प्राप्तकर्ता की पहचान देखें (या बनाएं) — आमतौर पर सिर्फ उनका वर्डप्रेस अकाउंट ईमेल और डिस्प्ले नेम।
  3. बैज ID और प्राप्तकर्ता की जानकारी पास करते हुए wp_remote_post() के साथ Badges Ninja API पर POST /awards कॉल करें।

सबसे पहले आपको एक API key चाहिए होगी। इसे अपने डैशबोर्ड में API Keys के तहत जनरेट करें — पूरी जानकारी के लिए API keys guide देखें। Keys क्रिएशन के समय सिर्फ एक बार दिखाई जाती हैं, इसलिए इसे डेटाबेस में नहीं बल्कि wp-config.php में एक कॉन्स्टेंट के रूप में सेव करें:

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

नई बनाई गई key एक बार दिखाई गई

इस key को सर्वर-साइड ही रखें। इस गाइड में सब कुछ आपके वर्डप्रेस सर्वर पर PHP में चलता है — wp_remote_post() एक सर्वर-साइड कॉल है, और wp-config.php कभी भी ब्राउज़र को नहीं भेजा जाता। यही वह चीज़ है जो आप चाहते हैं: key HTTPS पर सर्वर-टू-सर्वर ट्रैवल करती है, और कोई भी साइट विज़िटर इसे पढ़ नहीं सकता। इस कॉल को कभी भी क्लाइंट-साइड JavaScript में न ले जाएं — ब्राउज़र से एक fetch() जिसमें key इनलाइन हो, उसे किसी के भी ब्राउज़र के dev tools के ज़रिए उजागर कर देगा। दो आदतें बनाए रखने लायक हैं: सुनिश्चित करें कि आपकी होस्टिंग wp-config.php को executed PHP के रूप में सर्व करे (कभी भी plaintext के रूप में नहीं, और webroot में wp-config.php.bak कॉपी न छोड़ें), और इस इंटीग्रेशन के लिए एक समर्पित API key बनाएं ताकि अगर यह कभी compromise हो जाए तो आप इसे अपने बाकी टूल्स को तोड़े बिना अलग से रिवोक कर सकें।

एक शेयर्ड हेल्पर फ़ंक्शन हर 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 );
}

प्राप्तकर्ता का ईमेल Badges Ninja तक पहुंचते ही सर्वर-साइड पर SHA-256 हैश कर दिया जाता है, और रिटर्न पेलोड में award का सत्यापन URL शामिल होता है — यह तब काम आता है जब आप कॉल सफल होने के बाद वर्डप्रेस में वहीं “view your credential” लिंक दिखाना चाहते हैं।

LearnDash

LearnDash user और course वाले एक सिंगल ऐरे आर्गुमेंट के साथ learndash_course_completed फायर करता है:

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 कॉन्स्टेंट के बजाय कोर्स मेटा के रूप में स्टोर करना सही तरीका है — हर कोर्स अपने खुद के बैज डिज़ाइन से मैप होता है।

LifterLMS

LifterLMS $user_id और $course_id के साथ lifterlms_course_completed फायर करता है:

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 कोर्स ID के साथ tutor_course_complete_after फायर करता है, और आप सेशन से current user को पुल करते हैं:

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 सेटअप कम्प्लीशन को एक बैकग्राउंड प्रोसेस से फायर करता है (जैसे quiz auto-grade के ज़रिए), तो get_current_user_id() को उस user ID से बदलें जो आपका विशिष्ट हुक प्रदान करता है — आर्गुमेंट्स की पुष्टि करने के लिए सेटअप के दौरान एक बार error_log( print_r( func_get_args(), true ) ) से पेलोड चेक करें।

हुक वायर करने से पहले बैज डिज़ाइन करना

यह सब फायर होने से पहले, आपको award करने के लिए एक बैज चाहिए। visual designer यह काम बिना किसी डिज़ाइनर को स्टाफ पर रखे कर देता है — 80+ शेप टेम्पलेट, कस्टम कलर्स, आइकन लाइब्रेरी, और लोगो अपलोड, सब स्नैप-टू-ग्रिड। अगर आप डिज़ाइनर के लिए नए हैं, तो Designing Your First Verifiable Digital Certificate आपको एक टेम्पलेट चुनने और ऐसा कुछ शिप करने के बारे में बताता है जिसे प्राप्तकर्ता वाकई साझा करना चाहेंगे।

एक बार बैज बन जाए, तो उसकी ID डैशबोर्ड से (या GET /badges के ज़रिए) लें और उसे अपने कोर्स के कस्टम फील्ड में डाल दें।

प्राप्तकर्ता को वास्तव में क्या मिलता है

यही वह हिस्सा है जिसे एक घर-में-बनाया वर्डप्रेस बैज प्लगइन दोहरा नहीं सकता। जब POST /awards सफल होता है, तो प्राप्तकर्ता को मिलता है:

  • एक यूनीक सत्यापन URL जिसे कोई भी खोल सकता है — कोई वर्डप्रेस लॉगिन ज़रूरी नहीं — जो दिखाता है कि क्रेडेंशियल असली है, इसे किसने जारी किया, और कब।
  • एक QR code और A4 PDF सर्टिफिकेट, अपने आप जनरेट होते हैं।
  • एक Add to LinkedIn Profile बटन, अगर आपके issuer का LinkedIn organization ID सेट है — वन-टाइम सेटअप के लिए Add a LinkedIn “Add to Profile” Button देखें।
  • badges.ninja/me पर उनके अपने recipient portal का एक्सेस, magic-link साइन-इन के ज़रिए — न कोई पासवर्ड भूलने के लिए, न आपकी वर्डप्रेस साइट पर मैनेज करने के लिए कोई अलग अकाउंट।
  • स्टैंडर्ड्स-कम्प्लायंट Open Badge v2.0 JSON-LD, ताकि कोई भी OB-aware वेरिफायर (सिर्फ Badges Ninja नहीं) इसे वैलिडेट कर सके।

इनमें से कुछ भी बनाना वर्डप्रेस का काम नहीं है, और इनमें से कुछ भी सिर्फ आपके वर्डप्रेस डेटाबेस के अंदर नहीं रहना चाहिए।

फेलियर को ग्रेसफुली हैंडल करना

कोर्स-कम्प्लीशन हुक एक लाइव पेज रिक्वेस्ट के दौरान फायर होते हैं, और एक धीमी या फेल हुई API कॉल को लर्नर की “congratulations” स्क्रीन को ब्लॉक नहीं करना चाहिए। प्रूफ ऑफ कॉन्सेप्ट से आगे बढ़ने पर दो व्यावहारिक बदलाव:

एक फेल हुए award को UI ब्लॉक न करने दें। ऊपर दिया गया हेल्पर फ़ंक्शन पहले से ही throw करने के बजाय लॉग करता है और false रिटर्न करता है — badges_ninja_issue_award() चाहे जो भी रिटर्न करे, LearnDash, LifterLMS, और Tutor अपना सामान्य कम्प्लीशन फ्लो जारी रखते हैं।

स्केल पर, इनलाइन कॉल करने के बजाय इसे क्यू करें। अगर आप एक ही समय में एक ही कोर्स से बड़े cohorts चला रहे हैं (एक cohort स्टार्ट डेट, एक वेबिनार रीप्ले अनलॉक), तो API को synchronously कॉल करने के बजाय हुक से एक WP-Cron scheduled event फायर करें:

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 );

इससे लोड बंट जाता है और एक अकेली धीमी रिक्वेस्ट लर्नर की समस्या नहीं बनती। सच में बड़े बैचों के लिए (एक पूरा पुराना cohort, एक ही बार में माइग्रेट किया गया), वर्डप्रेस हुक वाले रास्ते को पूरी तरह छोड़ दें और bulk awards via CSV का उपयोग करें — एक बार अपलोड करें, और प्लेटफॉर्म सर्वर-साइड पर issuance को पेजिनेट करता है, जिसमें pause/resume पहले से बना हुआ है।

Idempotency पर एक नोट

अगर आपका LMS कभी एक ही यूज़र के लिए अपना कम्प्लीशन हुक एक से ज़्यादा बार फायर करता है (quiz retakes के साथ एक आम LearnDash edge case, या एक Tutor LMS re-sync), तो आप एक ही बैज को दो बार अवार्ड नहीं करना चाहेंगे। सबसे आसान गार्ड एक वर्डप्रेस user-meta फ्लैग है जिसे आप सफल कॉल के तुरंत बाद सेट करते हैं:

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 );
}

अगर आप वास्तविक वॉल्यूम पर जारी कर रहे हैं और इसे per-site के बजाय केंद्रीय रूप से हैंडल करवाना चाहते हैं, तो हर endpoint के request/response शेप के लिए webhook-driven event handling या पूरा API quickstart देखें।

जब यह पैटर्न एक अकेले कोर्स से बड़ा हो जाए

ऊपर दिए गए उदाहरण मानते हैं कि हर कोर्स के लिए एक बैज है। एक बार जब आप stackable credentials चला रहे हों — एक track बैज जो कई कोर्स बैज के बाद अनलॉक होता है, या एक capstone जो कई prerequisites पर निर्भर करता है — तो “कौन सा बैज, किस कम्प्लीशन के लिए” वाली मैपिंग को post meta से निकालकर एक छोटी lookup table में ले जाएं, या इसे किसी spreadsheet-backed automation (Airtable या Google Sheets) से चलाएं जो वही POST /awards कॉल फायर करता हो। API कॉल खुद नहीं बदलती; सिर्फ यह तय करने वाला हिस्सा बदलता है कि इसे कब करना है।

इंटीग्रेशन को ट्रबलशूट करना

कुछ गिनी-चुनी समस्याएं ही उस ज़्यादातर घर्षण का कारण बनती हैं जो लोग इसे पहली बार वायर करते समय झेलते हैं:

हुक कभी फायर नहीं होता। पुष्टि करें कि आप अपने प्लगइन के वास्तविक वर्जन के लिए सही एक्शन को हुक कर रहे हैं — खासकर LearnDash ने major releases में completion-hook के नाम बदले हैं (पुराने इंस्टॉल कभी-कभी अब भी learndash_course_completed पर निर्भर करते हैं जो नए वाले से एक अलग कोड पाथ से फायर होता है)। अपने callback के ऊपर एक अस्थायी error_log() जोड़ें और एक थ्रोअवे यूज़र के रूप में एक टेस्ट कोर्स पूरा करते समय wp-content/debug.log देखें।

wp_remote_post() टाइमआउट हो जाता है। शेयर्ड होस्टिंग एनवायरनमेंट कभी-कभी अनजान होस्ट्स के लिए आउटबाउंड HTTPS ब्लॉक कर देते हैं, या रिक्वेस्ट टाइमआउट को ऊपर सेट किए 15 सेकंड से कम पर कैप कर देते हैं। अगर कॉल लगातार टाइमआउट होती हैं, तो अपने होस्ट से चेक करें कि क्या api.badges.ninja को आउटबाउंड कनेक्शन की अनुमति है, और पुष्टि करें कि आपके PHP curl एक्सटेंशन में मौजूदा CA सर्टिफिकेट्स हैं — एक पुराना cert bundle पुराने शेयर्ड-होस्टिंग स्टैक्स पर एक आम साइलेंट फेलियर है।

400 Bad Request. पेलोड में एक ज़रूरी फील्ड गायब है या उसका शेप गलत है। POST /awards को badgeId, name और email वाला एक नेस्टेड recipient ऑब्जेक्ट, और एक issuedOn टाइमस्टैम्प चाहिए — ऊपर दिया गया हेल्पर ठीक यही भेजता है। सबसे आम गड़बड़ी प्राप्तकर्ता का name है: इसमें कम से कम 5 अक्षर होने चाहिए, इसलिए “Jo” जैसा वर्डप्रेस डिस्प्ले नेम रिजेक्ट हो जाता है। जब डिस्प्ले नेम बहुत छोटा हो तो अकाउंट के पूरे नाम (या ईमेल के local-part) पर फॉलबैक करें।

401 Unauthorized. API key वाला कॉन्स्टेंट लोड नहीं हो रहा, या कॉन्स्टेंट सेट होने के बाद उसे फिर से जनरेट किया गया। Keys क्रिएशन के समय सिर्फ एक बार दिखाई जाती हैं और दोबारा प्राप्त नहीं की जा सकतीं — अगर आपको याद नहीं कि कौन सी key लाइव है, तो अंदाज़ा लगाने के बजाय पुरानी वाली को डिलीट करें और एक नई जारी करें।

बैज जारी हुआ, लेकिन गलत बैज डिज़ाइन को। यह लगभग हमेशा टेस्टिंग से बचा हुआ एक stale badges_ninja_badge_id post-meta वैल्यू होता है। चूंकि यह मैपिंग कोर्स पोस्ट पर रहती है, इसलिए किसी नए cohort के लिए कोर्स को डुप्लिकेट करने के बाद इसे बदलना भूलना आसान है — जब भी आप कोई कोर्स क्लोन करें, तो एक जल्दी चेक कर लेना अच्छा रहेगा।

एक ही व्यक्ति के लिए डुप्लिकेट awards। यह ऊपर user-meta गार्ड के साथ कवर किया जा चुका है, लेकिन दोबारा कहना ज़रूरी है: LMS completion हुक ठीक एक बार फायर होने की गारंटी नहीं देते। “पहले से award हो चुका” को एक सामान्य स्थिति मानें जिसे चेक करना है, न कि नज़रअंदाज़ करने वाला edge case।

अक्सर पूछे जाने वाले सवाल

क्या यह WooCommerce कोर्स bundles के साथ काम करता है? हां — अगर एक bundle खरीद को कोर्स कम्प्लीशन से अलग एक बैज ट्रिगर करना चाहिए (जैसे किसी खास bundle को खरीदने वाले किसी भी व्यक्ति के लिए एक “certified member” बैज), तो LMS completion एक्शन के बजाय woocommerce_order_status_completed हुक करें, और बैज ID को कोर्स के बजाय प्रोडक्ट मेटा से देखें।

क्या प्राप्तकर्ता बिना वर्डप्रेस अकाउंट के बैज पा सकते हैं? हां, और यही तो पूरी बात है। award Badges Ninja में उनके ईमेल एड्रेस से जुड़ा होता है, किसी वर्डप्रेस यूज़र रिकॉर्ड से नहीं। अगर आपकी साइट guest checkout या anonymous quiz completion की अनुमति देती है, तो बस यह पक्का करें कि आप badges_ninja_issue_award() में पास करने के लिए एक असली ईमेल एड्रेस कैप्चर कर रहे हैं।

अगर मैं awards को भेजे जाने से पहले रिव्यू करना चाहूं तो? कम्प्लीशन हुक से सीधे कॉल फायर करना छोड़ दें। इसके बजाय, pending award (user, course, timestamp) को एक कस्टम टेबल या post type में लिखें, और इसे एक scheduled task से या एक admin “Approve & Award” बटन से जारी करें जो डिमांड पर वही हेल्पर फ़ंक्शन कॉल करता है।

क्या मुझे हर कोर्स के लिए एक अलग बैज चाहिए, या एक बैज कई को कवर कर सकता है? दोनों तरीके काम करते हैं। कुछ issuers granularity के लिए हर कोर्स के लिए एक बैज बनाते हैं; कुछ एक ही “program completion” बैज बनाते हैं और इसे तभी award करते हैं जब हर ज़रूरी कोर्स पूरा हो चुका हो, API कॉल करने से पहले हुक के अंदर prerequisite completion चेक करते हुए।


अपना पहला सत्यापन योग्य क्रेडेंशियल जारी करने के लिए तैयार हैं? badges.ninja पर मुफ़्त शुरू करें — visual designer, सार्वजनिक सत्यापन पेज, 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.

ब्लॉग पर वापस

संबंधित लेख