{"id":338912,"date":"2026-07-12T13:33:47","date_gmt":"2026-07-12T13:33:47","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/fenton-digital-badges\/"},"modified":"2026-07-12T14:32:44","modified_gmt":"2026-07-12T14:32:44","slug":"fenton-digital-badges","status":"publish","type":"plugin","link":"https:\/\/wordpress.org\/plugins\/fenton-digital-badges\/","author":14515157,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"0.1.31","stable_tag":"0.1.31","tested":"7.0.1","requires":"6.2","requires_php":"8.0","requires_plugins":null,"header_name":"Fenton Digital Badges","header_author":"Fenton","header_description":"Issue, manage, and display digital badges.","assets_banners_color":"f1fffa","last_updated":"2026-07-12 14:32:44","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"https:\/\/github.com\/Steve-Fenton\/digital-badges","header_author_uri":"","rating":0,"author_block_rating":0,"active_installs":0,"downloads":39,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"0.1.30":{"tag":"0.1.30","author":"Steve_Fenton","date":"2026-07-12 13:33:39"},"0.1.31":{"tag":"0.1.31","author":"Steve_Fenton","date":"2026-07-12 14:32:44"}},"upgrade_notice":{"0.1.5":"<p>Initial release.<\/p>"},"ratings":[],"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3604885,"resolution":"128x128","location":"assets","locale":"","width":128,"height":128},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3604885,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256},"icon.svg":{"filename":"icon.svg","revision":3604885,"resolution":false,"location":"assets","locale":false}},"assets_banners":{"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":3604885,"resolution":"1544x500","location":"assets","locale":"","width":1544,"height":500},"banner-772x250.png":{"filename":"banner-772x250.png","revision":3604885,"resolution":"772x250","location":"assets","locale":"","width":772,"height":250},"banner.svg":{"filename":"banner.svg","revision":3604885,"resolution":false,"location":"assets","locale":false}},"assets_blueprints":{},"all_blocks":[],"tagged_versions":["0.1.30","0.1.31"],"block_files":[],"assets_screenshots":{"screenshot-1.png":{"filename":"screenshot-1.png","revision":3604885,"resolution":"1","location":"assets","locale":"","width":2212,"height":1736},"screenshot-2.png":{"filename":"screenshot-2.png","revision":3604885,"resolution":"2","location":"assets","locale":"","width":3402,"height":1641},"screenshot-3.png":{"filename":"screenshot-3.png","revision":3604885,"resolution":"3","location":"assets","locale":"","width":1799,"height":1654}},"screenshots":{"1":"Badges settings \u2014 configure your issuing organization.","2":"Issue badges \u2014 award credentials from a CSV upload.","3":"Attestation page \u2014 public certificate view for earners."}},"plugin_section":[],"plugin_tags":[2306,44546,174467,313,192752],"plugin_category":[56],"plugin_contributors":[271227],"plugin_business_model":[],"class_list":["post-338912","plugin","type-plugin","status-publish","hentry","plugin_tags-badges","plugin_tags-certificates","plugin_tags-credentials","plugin_tags-linkedin","plugin_tags-open-badges","plugin_category-social-and-sharing","plugin_contributors-steve_fenton","plugin_committers-steve_fenton"],"banners":{"banner":"https:\/\/ps.w.org\/fenton-digital-badges\/assets\/banner-772x250.png?rev=3604885","banner_2x":"https:\/\/ps.w.org\/fenton-digital-badges\/assets\/banner-1544x500.png?rev=3604885","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":"https:\/\/ps.w.org\/fenton-digital-badges\/assets\/icon.svg?rev=3604885","icon":"https:\/\/ps.w.org\/fenton-digital-badges\/assets\/icon.svg?rev=3604885","icon_2x":false,"generated":false},"screenshots":[{"src":"https:\/\/ps.w.org\/fenton-digital-badges\/assets\/screenshot-1.png?rev=3604885","caption":"Badges settings \u2014 configure your issuing organization."},{"src":"https:\/\/ps.w.org\/fenton-digital-badges\/assets\/screenshot-2.png?rev=3604885","caption":"Issue badges \u2014 award credentials from a CSV upload."},{"src":"https:\/\/ps.w.org\/fenton-digital-badges\/assets\/screenshot-3.png?rev=3604885","caption":"Attestation page \u2014 public certificate view for earners."}],"raw_content":"<!--section=description-->\n<p>Fenton Digital Badges lets you issue <a href=\"https:\/\/github.com\/mozilla\/openbadges-specification\/blob\/master\/Assertion\/latest.md\">Open Badges 1.0<\/a> credentials from WordPress. Define an issuing organization, create badge classes, award them in bulk via CSV, and give earners public attestation pages they can share or add to LinkedIn.<\/p>\n\n<p><strong>Features<\/strong><\/p>\n\n<ul>\n<li>Configure an issuing organization (name, URL, logo, contact details)<\/li>\n<li>Create badge classes as a custom post type with image, criteria URL, and tags<\/li>\n<li>Issue badges in bulk from CSV (email required; name, evidence, and expiry optional)<\/li>\n<li>Public Open Badges JSON endpoints for issuer, badge class, and assertion<\/li>\n<li>Public attestation pages with share, download, and LinkedIn Add to Profile<\/li>\n<li>Email lookup so earners can request links to badges issued to them (avoids revealing whether an address has badges)<\/li>\n<li>Find-badges emails include a secure link to stop future notifications<\/li>\n<li>Assertions list with revoke, restore, and delete (revoked only)<\/li>\n<li>Recipient emails are salted\/hashed \u2014 plaintext emails are not stored on assertions (unsubscribe opt-outs are an exception)<\/li>\n<\/ul>\n\n<p>You can add templates for the badge pages using <code>\/wp-admin\/site-editor.php?p=%2Ftemplate<\/code> on your site.<\/p>\n\n<ul>\n<li>Click \"Add Template\"<\/li>\n<li>Select \"Single item: Badge\" or \"Archive: Badge\"<\/li>\n<\/ul>\n\n<p>To control the layout of <code>\/badges\/find\/<\/code> or <code>\/badges\/assertion\/{uid}\/<\/code>, create a Page, optionally add <code>[fendigibadge_find]<\/code> or <code>[fendigibadge_attestation]<\/code>, then choose that page under <strong>Badges \u2192 Settings<\/strong>. Edit the page\u2019s template in the Site Editor. Themes can also override the markup with <code>fendigibadge\/find.php<\/code> or <code>fendigibadge\/attestation.php<\/code>.<\/p>\n\n<p><strong>Shortcodes<\/strong><\/p>\n\n<ul>\n<li><code>[fendigibadge id=\"123\"]<\/code> \u2014 display a badge<\/li>\n<li><code>[fendigibadge_find]<\/code> \u2014 email lookup form (also available at <code>\/badges\/find\/<\/code>)<\/li>\n<li><code>[fendigibadge_attestation]<\/code> \u2014 certificate markup on <code>\/badges\/assertion\/{uid}\/<\/code> when using a page template<\/li>\n<\/ul>\n\n<p><strong>Public endpoints<\/strong><\/p>\n\n<ul>\n<li>Issuer JSON: <code>\/ob\/issuer.json<\/code><\/li>\n<li>Badge class JSON: <code>\/ob\/badges\/{id}.json<\/code><\/li>\n<li>Assertion JSON: <code>\/ob\/assertions\/{uid}.json<\/code><\/li>\n<li>Attestation page: <code>\/badges\/assertion\/{uid}\/<\/code><\/li>\n<li>Find badges: <code>\/badges\/find\/<\/code><\/li>\n<li>Claim name: <code>\/badges\/claim-name\/{token}\/<\/code><\/li>\n<li>Unsubscribe: <code>\/badges\/unsubscribe\/{token}\/<\/code><\/li>\n<\/ul>\n\n<!--section=installation-->\n<ol>\n<li>Upload the plugin files to <code>\/wp-content\/plugins\/fenton-digital-badges<\/code>, or install the ZIP via <strong>Plugins \u2192 Add New \u2192 Upload Plugin<\/strong>.<\/li>\n<li>Activate <strong>Fenton Digital Badges<\/strong> through the <strong>Plugins<\/strong> screen.<\/li>\n<li>Go to <strong>Badges \u2192 Settings<\/strong> and configure your issuing organization (name and website URL are required).<\/li>\n<li>Create a badge under <strong>Badges \u2192 Add New<\/strong> (featured image and criteria URL required).<\/li>\n<li>Use <strong>Badges \u2192 Issue Badges<\/strong> to award badges from a CSV.<\/li>\n<\/ol>\n\n<!--section=faq-->\n<dl>\n<dt id=\"what%20csv%20format%20is%20required%3F\"><h3>What CSV format is required?<\/h3><\/dt>\n<dd><p>Columns: <code>email<\/code> (required), <code>name<\/code>, <code>evidence<\/code>, <code>expires<\/code> (YYYY-MM-DD). A header row is optional \u2014 a single line like <code>you@example.com,Your Name<\/code> works.<\/p><\/dd>\n<dt id=\"are%20recipient%20emails%20stored%3F\"><h3>Are recipient emails stored?<\/h3><\/dt>\n<dd><p>No, not on assertions. Emails are salted and hashed for the assertion identity and looked up via a separate HMAC. The only plaintext emails kept are addresses that opted out of find-badges notifications via the unsubscribe link.<\/p><\/dd>\n<dt id=\"how%20does%20the%20find%20badges%20form%20work%3F\"><h3>How does the find badges form work?<\/h3><\/dt>\n<dd><p>Enter the email used when the badge was issued. The form always shows the same confirmation message so it does not reveal whether an address has badges. If matches exist, attestation URLs are emailed to that address. Unsubscribed addresses are ignored before lookup. Submissions are rate-limited per IP (to limit probing many addresses) and per email (to limit repeat requests for the same address).<\/p><\/dd>\n<dt id=\"what%20happens%20if%20a%20recipient%20name%20is%20omitted%3F\"><h3>What happens if a recipient name is omitted?<\/h3><\/dt>\n<dd><p>The attestation page still verifies the badge, but shows a generic completion message instead of naming the earner. When the earner uses Find your badges, the email includes a one-time link to claim the certificate and add their name. The link asks them to confirm the name before saving, then stops working.<\/p><\/dd>\n<dt id=\"how%20do%20i%20stop%20find-badges%20emails%3F\"><h3>How do I stop find-badges emails?<\/h3><\/dt>\n<dd><p>Each find-badges email ends with a \u201cStop all future notifications\u201d link. Using it adds that address to an unsubscribe list (only when the address still matches at least one badge). Later find requests for that address are ignored.<\/p><\/dd>\n<dt id=\"does%20this%20support%20open%20badges%202.0%20%2F%203.0%3F\"><h3>Does this support Open Badges 2.0 \/ 3.0?<\/h3><\/dt>\n<dd><p>This release implements Open Badges 1.0 JSON endpoints and assertions.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>0.1.29<\/h4>\n\n<ul>\n<li>Tightened find-badges rate limits: 8 submissions per IP per 10 minutes, and one lookup per email every 30 minutes.<\/li>\n<\/ul>\n\n<h4>0.1.28<\/h4>\n\n<ul>\n<li>Find-badges emails include a secure \u201cStop all future notifications\u201d unsubscribe link.<\/li>\n<li>Unsubscribed addresses are ignored before email lookup hashing.<\/li>\n<\/ul>\n\n<h4>0.1.23<\/h4>\n\n<ul>\n<li>Find-badges emails include a one-time link to add a missing recipient name, with confirm-before-save.<\/li>\n<\/ul>\n\n<h4>0.1.19<\/h4>\n\n<ul>\n<li>Renamed internal prefixes to <code>fendigibadge<\/code> for WordPress.org plugin review compliance.<\/li>\n<\/ul>\n\n<h4>0.1.5<\/h4>\n\n<ul>\n<li>Initial public release candidate for the WordPress.org plugin directory.<\/li>\n<\/ul>","raw_excerpt":"Issue, manage, and display Open Badges 1.0 credentials from your WordPress site.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/338912","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=338912"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/steve_fenton"}],"wp:attachment":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=338912"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=338912"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=338912"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=338912"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=338912"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=338912"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}