WordPress থেকে Open Badges ইস্যু করা (ভারী প্লাগইন ছাড়াই)
কোর্স সম্পন্ন হওয়ার সাথে সাথে Badges Ninja API কল করে যেকোনো WordPress কোর্স/LMS প্লাগইন (LearnDash, LifterLMS, Tutor) থেকে Open Badges ইস্যু করুন — আলাদা কোনো ব্যাজ প্লাগইন ইনস্টল করার দরকার নেই।
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.
আপনি যদি WordPress-এ কোর্স চালান, তাহলে আপনি এই রুটিন সম্পর্কে ইতিমধ্যেই জানেন: কেউ LearnDash, LifterLMS বা Tutor LMS-এ একটি মডিউল শেষ করে, LMS তাকে “সম্পন্ন” হিসেবে চিহ্নিত করে, আর তারপর… যাচাইযোগ্য কিছুই ঘটে না। হয়তো আপনি একটি PDF ইমেইল করেন। হয়তো আপনি একটি ডেডিকেটেড WordPress ব্যাজ প্লাগইন ইনস্টল করেন যা নিজস্ব ডাটাবেস টেবিল, নিজস্ব ইমেজ লাইব্রেরি এবং “ব্যাজ” কী তা নিয়ে নিজস্ব একটি ধারণা যোগ করে — যা আপনার সাইটের বাইরে কেউ যাচাই করতে পারে না।
এর চেয়ে সহজ একটি পথ আছে। WordPress কোর্স প্লাগইনগুলো এমনিতেই কেউ কোর্স সম্পন্ন করার মুহূর্তে একটি action hook ফায়ার করে। আপনি সেই hook ধরে Badges Ninja API-তে একটি HTTP কল করতে পারেন। অতিরিক্ত কোনো প্লাগইন নেই, অতিরিক্ত হোস্টিং নেই, মালিকানাধীন ব্যাজ ফরম্যাট নেই — শুধু একটি স্ট্যান্ডার্ড-কমপ্লায়েন্ট Open Badge v2.0 credential, যা আপনার প্রাপক যেকোনো জায়গায় যাচাই করতে পারবেন, LinkedIn-এ যোগ করতে পারবেন এবং PDF হিসেবে ডাউনলোড করতে পারবেন।
এই পোস্টে প্রথমে প্যাটার্নটি একবার ব্যাখ্যা করা হবে, তারপর LearnDash, LifterLMS এবং Tutor LMS-এর জন্য নির্দিষ্ট hook দেখানো হবে।
কেন শুধু একটি WordPress ব্যাজ প্লাগইন ব্যবহার করবেন না?
ডেডিকেটেড WordPress ব্যাজ প্লাগইনগুলো দেখতে যতটা সমস্যার সমাধান করে বলে মনে হয়, তার চেয়ে সংকীর্ণ একটি সমস্যার সমাধান করে। এগুলো আপনার সাইটের ভেতরে একটি “আমার অর্জন” পেজে একটি ইমেজ রেন্ডার করতে ভালো। একটি credential-এর জন্য যা আসলে গুরুত্বপূর্ণ, সেসব ক্ষেত্রে এগুলো সাধারণত অনেক দুর্বল:
- পোর্টেবিলিটি। একটি ব্যাজ যা শুধুমাত্র আপনার WordPress সাইটে একটি shortcode হিসেবে বিদ্যমান, তা কোনো credential নয় — এটি একটি সজ্জা মাত্র। প্রাপক চাকরি পরিবর্তন করার মুহূর্তে, তার ইনবক্স পরিবর্তন করলে, বা আপনার সাইট বন্ধ হয়ে গেলে, সেই “প্রমাণ”ও তার সাথে চলে যায়।
- যাচাই। আপনার WordPress অ্যাডমিনে লগইন না করেই যে কেউ একটি credential সত্যিকারের কিনা তা যাচাই করতে পারা উচিত। Open Badge v2.0 ডিজাইন অনুযায়ী আপনাকে একটি পাবলিক ভেরিফিকেশন URL এবং মেশিন-রিডেবল JSON-LD দেয়।
- রক্ষণাবেক্ষণ পৃষ্ঠতল। প্রতিটি WordPress প্লাগইন মানে প্যাচ করার জন্য আরেকটি জিনিস, ব্যাকআপ নেওয়ার জন্য আরেকটি ডাটাবেস টেবিল, একটি কোর আপডেটের সময় ব্যর্থতার আরেকটি পয়েন্ট।
কোর্স সম্পন্ন হওয়ার সময় একটি বাহ্যিক API কল করা এই তিনটি সমস্যাই এড়িয়ে যায়। WordPress যেটাতে ভালো, সেটার জন্যই দায়ী থাকে — কনটেন্ট ডেলিভারি এবং প্রোগ্রেস ট্র্যাকিং — আর credential নিজেই এমন একটি সিস্টেমে থাকে যা বিশেষভাবে এটি ইস্যু, যাচাই এবং শেয়ার করার জন্য তৈরি।
প্যাটার্ন: একটি hook, একটি HTTP কল
প্রতিটি বড় WordPress LMS প্লাগইন একজন ব্যবহারকারী কোর্স সম্পন্ন করলে একটি action ফায়ার করে। ইন্টিগ্রেশন সবসময় একই তিনটি ধাপে হয়:
- আপনার নির্দিষ্ট LMS-এর জন্য completion action-এ hook করুন।
- প্রাপকের identity খুঁজে বের করুন (বা তৈরি করুন) — সাধারণত শুধু তার WordPress অ্যাকাউন্টের ইমেইল এবং display name।
- ব্যাজ ID এবং প্রাপকের বিবরণ পাস করে
wp_remote_post()দিয়ে Badges Ninja API-তেPOST /awardsকল করুন।
প্রথমে আপনার একটি API key দরকার হবে। আপনার ড্যাশবোর্ডে API Keys থেকে একটি জেনারেট করুন — সম্পূর্ণ ওয়াকথ্রুর জন্য API keys গাইড দেখুন। Key তৈরির সময় একবারই দেখানো হয়, তাই এটি ডাটাবেসে না রেখে wp-config.php-তে একটি constant হিসেবে সংরক্ষণ করুন:
define( 'BADGES_NINJA_API_KEY', 'bws_your_32_hex_key_here' );
define( 'BADGES_NINJA_BADGE_ID', 'your-badge-id' );

এই key সার্ভার-সাইডে রাখুন। এই গাইডের সবকিছু আপনার WordPress সার্ভারে PHP-তে চলে — wp_remote_post() একটি সার্ভার-সাইড কল, আর wp-config.php কখনো ব্রাউজারে পাঠানো হয় না। এটাই ঠিক যা আপনি চান: key HTTPS-এর মাধ্যমে সার্ভার-থেকে-সার্ভার ভ্রমণ করে, আর কোনো সাইট ভিজিটর এটি পড়তে পারে না। কখনোই এই কলটি ক্লায়েন্ট-সাইড JavaScript-এ নিয়ে যাবেন না — key ইনলাইন করে ব্রাউজার থেকে একটি fetch() করলে তা যে কারো ব্রাউজারের dev tools-এর মাধ্যমে উন্মুক্ত হয়ে যাবে। দুটি অভ্যাস বজায় রাখা মূল্যবান: নিশ্চিত করুন আপনার হোস্ট wp-config.php-কে executed PHP হিসেবে সার্ভ করে (কখনো plaintext হিসেবে নয়, এবং webroot-এ wp-config.php.bak কপি রেখে দেবেন না), আর এই ইন্টিগ্রেশনের জন্য একটি ডেডিকেটেড API key তৈরি করুন যাতে এটি কখনো compromise হলে আপনার অন্য টুলগুলো ভেঙে না দিয়ে স্বাধীনভাবে revoke করতে পারেন।
একটি শেয়ার্ড হেল্পার ফাংশন প্রতিটি LMS hook-কে হালকা রাখে:
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 দিয়ে hash করা হয়, আর রিটার্ন payload-এ award-এর ভেরিফিকেশন URL অন্তর্ভুক্ত থাকে — কল সফল হওয়ার পর WordPress-এ সেখানেই একটি “আপনার credential দেখুন” লিংক দেখাতে চাইলে এটি কাজে লাগে।
LearnDash
LearnDash user এবং course ধারণকারী একটি একক array আর্গুমেন্ট দিয়ে 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 );
} );
একটি সিঙ্গেল গ্লোবাল BADGES_NINJA_BADGE_ID constant-এর পরিবর্তে ব্যাজ ID-কে কোর্স meta হিসেবে সংরক্ষণ করা তখনই সঠিক পদক্ষেপ, যখন আপনার একের বেশি কোর্স থাকে — প্রতিটি কোর্স নিজস্ব ব্যাজ ডিজাইনের সাথে ম্যাপ হয়।
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 ফায়ার করে, আর আপনাকে সেশন থেকে বর্তমান ব্যবহারকারী নিতে হয়:
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 সেটআপ একটি ব্যাকগ্রাউন্ড প্রসেস থেকে completion ফায়ার করে (যেমন একটি quiz auto-grade-এর মাধ্যমে), get_current_user_id()-এর পরিবর্তে আপনার নির্দিষ্ট hook যে user ID দেয় তা ব্যবহার করুন — argument নিশ্চিত করতে সেটআপের সময় একবার error_log( print_r( func_get_args(), true ) ) দিয়ে payload যাচাই করুন।
Hook যুক্ত করার আগে ব্যাজ ডিজাইন করা
এর কোনোটি ফায়ার হওয়ার আগে, আপনার পুরস্কার দেওয়ার জন্য একটি ব্যাজ দরকার। ভিজ্যুয়াল ডিজাইনার স্টাফে একজন ডিজাইনার না রেখেই এটি কভার করে — ৮০+ শেপ টেমপ্লেট, কাস্টম রং, আইকন লাইব্রেরি, এবং লোগো আপলোড, সবকিছু স্ন্যাপ-টু-গ্রিড। আপনি যদি ডিজাইনারে নতুন হন, তাহলে আপনার প্রথম যাচাইযোগ্য ডিজিটাল সার্টিফিকেট ডিজাইন করা একটি টেমপ্লেট বেছে নেওয়া এবং প্রাপকরা সত্যিই শেয়ার করতে চাইবেন এমন কিছু প্রকাশ করার পুরো প্রক্রিয়ার মধ্য দিয়ে নিয়ে যায়।
ব্যাজ তৈরি হয়ে গেলে, ড্যাশবোর্ড থেকে (অথবা GET /badges-এর মাধ্যমে) এর ID নিয়ে আপনার কোর্সের কাস্টম ফিল্ডে রেখে দিন।
প্রাপক আসলে কী পান
এই অংশটিই একটি হোমগ্রোন WordPress ব্যাজ প্লাগইন প্রতিলিপি করতে পারে না। POST /awards সফল হলে, প্রাপক পান:
- একটি অনন্য ভেরিফিকেশন URL যা যে কেউ খুলতে পারে — কোনো WordPress লগইনের প্রয়োজন নেই — যা দেখায় যে credential সত্যি, কে এটি ইস্যু করেছে এবং কখন।
- স্বয়ংক্রিয়ভাবে জেনারেট করা একটি QR কোড এবং A4 PDF সার্টিফিকেট।
- একটি Add to LinkedIn Profile বাটন, যদি আপনার issuer-এর একটি LinkedIn organization ID সেট করা থাকে — এককালীন সেটআপের জন্য LinkedIn “Add to Profile” বাটন যোগ করুন দেখুন।
badges.ninja/me-তে নিজস্ব recipient portal-এ প্রবেশাধিকার, magic-link সাইন-ইনের মাধ্যমে — ভুলে যাওয়ার মতো কোনো পাসওয়ার্ড নেই, আপনার WordPress সাইটে ম্যানেজ করার জন্য আলাদা কোনো অ্যাকাউন্ট নেই।- স্ট্যান্ডার্ড-কমপ্লায়েন্ট Open Badge v2.0 JSON-LD, যাতে যেকোনো OB-aware ভেরিফায়ার (শুধু Badges Ninja নয়) এটি validate করতে পারে।
এর কোনোটিই WordPress-এর তৈরি করার কাজ নয়, আর এর কোনোটিরই শুধু আপনার WordPress ডাটাবেসের ভেতরে থাকা উচিত নয়।
ব্যর্থতা সুন্দরভাবে সামলানো
Course-completion hook গুলো একটি লাইভ পেজ রিকোয়েস্টের সময় ফায়ার হয়, আর একটি ধীর বা ব্যর্থ API কল শিক্ষার্থীর “অভিনন্দন” স্ক্রিনকে ব্লক করা উচিত নয়। প্রুফ অফ কনসেপ্ট পার হয়ে গেলে দুটি ব্যবহারিক পরিবর্তন করা যায়:
একটি ব্যর্থ award UI ব্লক করতে দেবেন না। উপরের হেল্পার ফাংশনটি এমনিতেই throw করার পরিবর্তে log করে এবং false রিটার্ন করে — badges_ninja_issue_award() যাই রিটার্ন করুক না কেন, LearnDash, LifterLMS এবং Tutor সবাই তাদের স্বাভাবিক completion flow চালিয়ে যায়।
বড় স্কেলে, ইনলাইন কল করার পরিবর্তে queue করুন। যদি আপনি একসাথে একটি কোর্সের মধ্য দিয়ে বড় cohort চালান (একটি cohort শুরুর তারিখ, একটি webinar replay unlock), তাহলে API-কে synchronously কল করার পরিবর্তে hook থেকে একটি scheduled WP-Cron 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 );
এটি লোড ছড়িয়ে দেয় এবং একটি একক ধীর রিকোয়েস্টকে শিক্ষার্থীর সমস্যা হতে বাধা দেয়। সত্যিকারের বড় ব্যাচের জন্য (একবারে migrate করা একটি সম্পূর্ণ পুরনো cohort), WordPress hook path সম্পূর্ণভাবে এড়িয়ে যান এবং CSV-এর মাধ্যমে bulk awards ব্যবহার করুন — একবার আপলোড করুন, আর প্ল্যাটফর্ম pause/resume সহ সার্ভার-সাইডে issuance paginate করে।
Idempotency নিয়ে একটি নোট
যদি আপনার LMS কখনো একই ব্যবহারকারীর জন্য একাধিকবার তার completion hook ফায়ার করে (quiz retake-এর সাথে LearnDash-এর একটি সাধারণ edge case, অথবা Tutor LMS re-sync), তাহলে আপনি একই ব্যাজ দুবার award করতে চাইবেন না। সবচেয়ে সহজ গার্ড হলো একটি WordPress 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 shape-এর জন্য webhook-driven event handling অথবা সম্পূর্ণ API quickstart দেখুন।
এই প্যাটার্ন যখন একটি কোর্স ছাড়িয়ে যায়
উপরের উদাহরণগুলো প্রতি কোর্সে একটি ব্যাজ ধরে নেয়। আপনি যখন stackable credential চালান — একটি track ব্যাজ যা বেশ কয়েকটি কোর্স ব্যাজের পর unlock হয়, অথবা একটি capstone যা একাধিক prerequisite-এর উপর নির্ভর করে — তখন “কোন ব্যাজ, কোন completion-এর জন্য” ম্যাপিংটি post meta থেকে বের করে একটি ছোট lookup table-এ নিয়ে যান, অথবা একটি spreadsheet-backed automation (Airtable বা Google Sheets) থেকে চালান যা একই POST /awards কল ফায়ার করে। API কল নিজে পরিবর্তন হয় না; শুধু কখন এটি করতে হবে তা কী সিদ্ধান্ত নেয়, সেটাই পরিবর্তন হয়।
ইন্টিগ্রেশনের সমস্যা সমাধান
প্রথমবার এটি সেটআপ করার সময় মানুষ যে সমস্যাগুলোর মুখোমুখি হয়, তার বেশিরভাগের জন্য কয়েকটি সমস্যা দায়ী:
Hook কখনো ফায়ার হয় না। নিশ্চিত করুন আপনি আপনার প্লাগইনের প্রকৃত ভার্সনের জন্য সঠিক action-এ hook করছেন — বিশেষ করে LearnDash মেজর রিলিজ জুড়ে completion-hook নাম পরিবর্তন করেছে (কিছু পুরনো ইনস্টলেশন এখনো নতুনগুলোর চেয়ে ভিন্ন একটি code path থেকে learndash_course_completed ফায়ার হওয়ার উপর নির্ভর করে)। আপনার callback-এর শুরুতে একটি সাময়িক error_log() যোগ করুন এবং একটি ডিসপোজেবল টেস্ট ব্যবহারকারী হিসেবে একটি টেস্ট কোর্স সম্পন্ন করার সময় wp-content/debug.log দেখুন।
wp_remote_post() টাইমআউট হয়ে যায়। শেয়ার্ড হোস্টিং পরিবেশ কখনো কখনো অপরিচিত হোস্টে আউটবাউন্ড HTTPS ব্লক করে, অথবা উপরে সেট করা ১৫ সেকেন্ডের নিচে request timeout ক্যাপ করে। যদি কল ধারাবাহিকভাবে টাইমআউট হয়, তাহলে আপনার হোস্টের কাছে যাচাই করুন যে api.badges.ninja-তে আউটবাউন্ড কানেকশন অনুমোদিত কিনা, এবং নিশ্চিত করুন আপনার PHP curl extension-এ বর্তমান CA certificate আছে কিনা — একটি পুরনো cert bundle পুরনো শেয়ার্ড-হোস্টিং স্ট্যাকে একটি সাধারণ নীরব ব্যর্থতা।
400 Bad Request। Payload-এ একটি প্রয়োজনীয় ফিল্ড অনুপস্থিত, অথবা এর shape ভুল। POST /awards badgeId, name ও email সহ একটি nested recipient object, এবং একটি issuedOn timestamp আশা করে — উপরের হেল্পার ঠিক তাই পাঠায়। সবচেয়ে সাধারণ ভুলটি হলো প্রাপকের নাম: এটি অন্তত ৫ অক্ষরের হতে হবে, তাই “Jo”-এর মতো একটি WordPress display name প্রত্যাখ্যাত হয়। Display name খুব ছোট হলে অ্যাকাউন্টের পূর্ণ নামে (অথবা ইমেইলের local-part-এ) fall back করুন।
401 Unauthorized। API key constant লোড হচ্ছে না, অথবা constant সেট করার পর এটি regenerate করা হয়েছে। Key তৈরির সময় একবারই দেখানো হয় এবং আবার retrieve করা যায় না — কোন key live আছে তার হিসাব হারিয়ে ফেললে, অনুমান করার পরিবর্তে পুরনোটি মুছে ফেলুন এবং একটি নতুন ইস্যু করুন।
ব্যাজ ইস্যু হয়েছে, কিন্তু ভুল ব্যাজ ডিজাইনে। এটি প্রায় সবসময়ই টেস্টিং থেকে অবশিষ্ট একটি stale badges_ninja_badge_id post-meta value। যেহেতু ম্যাপিং কোর্স post-এ থাকে, তাই একটি নতুন cohort-এর জন্য কোর্স duplicate করার পর আপনি এটি পরিবর্তন করেছেন তা ভুলে যাওয়া সহজ — যখনই আপনি একটি কোর্স clone করেন, তখন একটি দ্রুত যাচাই করা মূল্যবান।
একই ব্যক্তির জন্য ডুপ্লিকেট award। উপরে user-meta গার্ড দিয়ে কভার করা হয়েছে, কিন্তু পুনরাবৃত্তি করা মূল্যবান: LMS completion hook ঠিক একবার ফায়ার হবে তার নিশ্চয়তা নেই। “already awarded”-কে উপেক্ষা করার একটি edge case হিসেবে না দেখে, যাচাই করার একটি স্বাভাবিক case হিসেবে দেখুন।
প্রায়শই জিজ্ঞাসিত প্রশ্ন
এটি কি WooCommerce কোর্স bundle-এর সাথে কাজ করে? হ্যাঁ — যদি কোর্স completion থেকে স্বাধীনভাবে একটি bundle কেনা একটি ব্যাজ ট্রিগার করা উচিত হয় (যেমন, একটি নির্দিষ্ট bundle কেনা যে কারো জন্য একটি “certified member” ব্যাজ), তাহলে একটি LMS completion action-এর পরিবর্তে woocommerce_order_status_completed-এ hook করুন, এবং কোর্সের পরিবর্তে product meta থেকে ব্যাজ ID খুঁজুন।
প্রাপকরা কি WordPress অ্যাকাউন্ট ছাড়াই ব্যাজ পেতে পারেন? হ্যাঁ, আর সেটাই মূল বিষয়। Award তাদের WordPress user record-এর সাথে নয়, Badges Ninja-তে তাদের ইমেইল ঠিকানার সাথে যুক্ত থাকে। যদি আপনার সাইট guest checkout বা anonymous quiz completion অনুমোদন করে, তাহলে শুধু নিশ্চিত করুন badges_ninja_issue_award()-এ পাস করার জন্য আপনি একটি প্রকৃত ইমেইল ঠিকানা ক্যাপচার করছেন।
যদি আমি award পাঠানোর আগে review করতে চাই? completion hook থেকে সরাসরি কল ফায়ার করা বাদ দিন। এর পরিবর্তে, pending award (user, course, timestamp) একটি কাস্টম টেবিল বা post type-এ লিখুন, এবং একটি scheduled task থেকে অথবা একটি admin “Approve & Award” বাটন থেকে ইস্যু করুন যা on demand একই হেল্পার ফাংশন কল করে।
আমার কি প্রতি কোর্সে আলাদা ব্যাজ দরকার, নাকি একটি ব্যাজ একাধিককে কভার করতে পারে? দুটোই কাজ করে। কিছু issuer granularity-র জন্য প্রতি কোর্সে একটি ব্যাজ তৈরি করে; অন্যরা একটি একক “program completion” ব্যাজ তৈরি করে এবং API কল করার আগে hook-এর ভেতরে prerequisite completion যাচাই করে, শুধুমাত্র প্রতিটি প্রয়োজনীয় কোর্স সম্পন্ন হলেই এটি award করে।
আপনার প্রথম যাচাইযোগ্য credential ইস্যু করতে প্রস্তুত? badges.ninja-তে বিনামূল্যে শুরু করুন — ভিজ্যুয়াল ডিজাইনার, পাবলিক ভেরিফিকেশন পেজ, PDF সার্টিফিকেট, Open Badge v2.0 আউটপুট। কোনো ক্রেডিট কার্ডের প্রয়োজন নেই।
এই নিবন্ধটি যেভাবে তৈরি হয়েছে
এই ব্লগের কিছু পোস্ট এআই সহায়কের সাহায্যে খসড়া করা হয় এবং প্রকাশের আগে Badges Ninja টিম তা পর্যালোচনা, তথ্য যাচাই ও সম্পাদনা করে। প্রতিটি কোড নমুনা ও মূল্য লাইভ প্রোডাক্টের সাথে যাচাই করা হয়। আমাদের সম্পাদকীয় ও এআই প্রক্রিয়া সম্পর্কে আরও পড়ুন আমাদের সম্পাদকীয় প্রক্রিয়া পৃষ্ঠা .

লেখক সম্পর্কে
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.
