Guide

Welcome! This guide covers everything on this testbed: a five-minute learner demo, a reference for each admin screen, the badge display features, and notes on how the plugin behaves under the hood. The plugin is Open Badges for LearnDash v0.1.0, running on WordPress 7.0 / LearnDash 5.1 / PHP 8.4.

Logins

  • Your admin account — you received a personal login by email. It has full administrator access; this is a testbed, so explore freely.
  • Demo learner — username demolearner, password Badge-Demo-2026. A plain subscriber, enrolled in the demo course, whose email address is intentionally non-deliverable (demo-learner@example.test), so badge issuances to it never send real mail. Use a private/incognito window so your admin session stays separate.

The five-minute demo

  1. In a private window, log in at /wp-login.php as demolearner.
  2. Open the Badge Basics course and complete Lesson 1: What Is an Open Badge? — click Mark Complete. This matches a lesson-completion trigger and queues a badge from CanCred Factory.
  3. Complete Lesson 2. That finishes the course, which matches a course-completion trigger for a badge from Open Badge Factory.
  4. Visit My Badges (still as the demo learner). Within a minute or so — issuance runs in the background via WP-Cron — both badges appear.
  5. In your admin window, open Open Badges → Activity Log to see the issuance records, and the Triggers screen to see each trigger’s fired count incremented.
Lesson 1 of Badge Basics as the demo learner sees it, with the Mark Complete button
Lesson 1 as the demo learner sees it — Mark Complete is what fires the trigger.

Repeatable? Deduplication is per learner: the demo learner can’t earn the same badge twice from the same trigger. To re-run the loop, create a fresh subscriber (or delete and recreate demolearner and re-enroll them), or watch the loop with manual issuance instead.

The admin screens

Everything lives under the Open Badges menu in wp-admin.

Settings

One credentials panel per provider — Open Badge Factory and CanCred Factory, same API, different host. Client ID is visible; the Client Secret is write-only (never redisplayed) and stored encrypted with this site’s WordPress salts. Test connection performs a live authenticated ping and records the result; both providers on this site currently test green. If the site’s security keys were ever rotated, stored secrets would become undecryptable and a “re-enter credentials” notice would appear here — a health notice, never a fatal.

Settings screen with both providers connected
Settings — both providers connected; secrets are write-only.

Badges

The local mirror of both providers’ badge inventories. Sync now refreshes it (each connected provider is paged fully). Note the columns: this site currently shows two published badges and one draft — “Badge 2 (Left as Draft)” from OBF. Draft badges sync and display here so you can see them coming, but they are excluded from triggers and issuance until published at the provider. If a badge disappears at the provider while a trigger still references it, it is kept and flagged “missing at provider” rather than deleted — deleting it would silently destroy trigger configuration.

Badges screen listing badges from both providers, including a draft
Badges — the local mirror of both tenants; note the Draft label.

Triggers

The automation rules: when this LearnDash event happens, issue that badge. Event types are course, lesson, and topic completion, plus quiz completion with an optional minimum score. Each row shows its fired count; triggers can be disabled without being deleted. This site has two: Lesson 1 of Badge Basics → CanCred badge, and the Badge Basics course → OBF badge. Try adding a third against the draft badge — the form won’t offer it, by design.

Triggers screen with two triggers and the add-a-trigger form
Triggers — this site’s two live rules, each already fired once.

Issue Badges

Two tools on one screen. Manual issuance: pick a badge and one or more people, and issue outside any trigger — useful for one-off recognition. Backfill a trigger: retroactively award a trigger’s badge to everyone who already met its condition before the trigger existed (e.g. learners who completed the course last year). Backfill skips anyone who already holds the badge, however they earned it — the two deduplication rules are covered under “Under the hood” below. Tip: manual issuance to your own real email will send you an actual badge email from the provider — a nice way to see the learner-facing result.

Issue Badges screen with manual issuance and backfill sections
Issue Badges — award by hand, or backfill a trigger retroactively.

Activity Log

Every notable action — syncs, connection tests, each issuance with learner, badge, and outcome — filterable by outcome, exportable as CSV, and clearable (clearing the log never touches the award records themselves). This is the first place to look when demonstrating or debugging anything.

Activity Log screen with sync, connection test, and issuance entries
Activity Log — this site’s real history: syncs, connection tests, and four issued badges.

Displaying badges to learners

  • Earned Badges block — in the editor’s Widgets category. Shows the logged-in visitor’s badges; columns, image size, names, and linking are configurable in the block sidebar. Live example: My Badges.
  • [user_badges] shortcode — same output for classic contexts. Attributes: user (a user ID; defaults to the logged-in visitor), columns (1–6, default 3), size (image pixels, 32–256, default 96), show_name (“1″/”0”, default on), link (“1″/”0”, default off), export (“1″/”0”, default on), verify (“1″/”0”, default on). Live example with an explicit user: Badge Showcase.
My Badges page showing a logged-in learner's two earned badges
My Badges as a logged-in learner — both providers’ badges, with issue dates.

Saving a badge to a Passport, and verifying one

Every displayed badge carries up to two small links, fetched from the issuing provider after the badge is awarded:

  • Save & share — opens the badge holder’s personal page at the provider, where they can save the badge to Open Badge Passport (or CanCred Passport), download it, or share it. This is the same link the provider emails when a badge is issued — so it appears only when you are logged in and looking at your own badges, never on a public page.
  • Verify — opens the provider-hosted Open Badges 3.0 credential for that specific award: the machine-readable proof of who issued what, to whom (identified by a hashed email, not a readable address), and when. This link is public by design — it is what makes a badge on the Badge Showcase independently verifiable.

Downloading the badge image from a page here gives you only the artwork — the verifiable version of a badge always comes from the provider, via those two links.

Under the hood

  • Issuance is asynchronous. A completion only writes a queued award and schedules a background job — the learner’s page load never waits on, and is never exposed to, a provider outage. Failures retry with backoff, and an hourly sweep catches anything left over.
  • Two deduplication rules. Trigger-driven awards are unique per learner per trigger (database-enforced). Manual and backfill awards have no trigger, so they deduplicate at badge level: “does this person already hold this badge, however earned?”
  • Provider emails are real. The badge email comes from OBF/CanCred, not from WordPress. Issue to a real address and that person gets a real badge. The demo learner’s example.test address is reserved and non-deliverable on purpose.
  • What’s counted where. The Badges screen mirrors providers; the Triggers screen counts firings; the Activity Log records outcomes; award records (who holds what) live behind My Badges and the Issue screens’ dedup checks.

Questions, bugs, ideas? This is exactly what the testbed is for — note them and tell Dan (dan@lxdintegral.com).