Skip to content

/12Hosting SCORM · Tutorial

How to embed a SCORM course in WordPress. Without a plugin.

WordPress can show your course but can’t run it. Host the package, then drop in one link.

Jonathan Borgwing · Founder, Allure Training OSPublished · Updated 7 min read

Short answer

WordPress can’t run SCORM. Host the package, then embed it with a new-tab button or an iframe. No plugin needed; here are the gotchas that break it.

You finished the course. The client’s site runs on WordPress. So you do the obvious thing — drag the SCORM .zip into the Media Library — and nothing useful happens. Maybe it uploads as a dead file. Maybe the page offers a download link to a zip no human can open. Either way, the module doesn’t run.

Here’s the fix, and it’s simpler than every “best SCORM plugin for WordPress” listicle wants you to believe: you don’t need a plugin. You need one good link.

WordPress is a CMS, not a SCORM runtime. It can show your course. It can’t run it.
the whole article in one line

/01Host it first, then embed.

A SCORM package is a .zip that expects to talk to a JavaScript runtime — the thing that calls LMSInitialize() and records completion, score, and bookmarking. WordPress serves files; it does not provide that runtime. So the move is always two steps: host the package somewhere that runs it, then point WordPress at the URL.

Publish from Storyline, Rise, or Captivate, upload the package to a host that serves the player (on Training OS the module plays on your public portfolio at /portfolio/<handle>; Pro adds an embed URL at /embed/<courseId> and private share links), and — before you touch WordPress — open that URL in a plain browser tab. If audio, completion, and resume work there, they’ll work embedded. If they don’t, fix it at the host first; WordPress can’t fix a broken launch.

One prerequisite: your WordPress site must be on HTTPS. An HTTP page embedding an HTTPS player throws mixed-content warnings, and some browsers block it outright.

/02Two ways to put it on the page.

Once the URL works, you have exactly two good options. Ranked by how rarely they break:

Option 01

A button that opens the module in a new tab.

Best for: portfolios, client demos, any theme you don’t control

Recommended

In the Block Editor, drop a Button block, paste your launch URL, and set it to open in a new tab. Write real CTA copy — “Launch the module,” not a naked URL. This is the option that still works after the client installs three plugins and changes themes twice.

  • Works well
  • Survives security plugins, page builders, and theme updates
  • Full-window playback — how Storyline and Rise expect to run
  • One Button block, zero HTML
  • Watch out for
  • Leaves your WordPress page for the module
  • Not an inline-on-the-page feel

Option 02

An inline iframe.

Best for: course landing pages where the demo should live on the page

If you own the theme

Add a Custom HTML block and paste an iframe pointing at your launch URL. Give it room — full width, at least 600px tall (700–800px for tall players), and allow="fullscreen" if your authoring tool needs it. On Training OS, the iframe embed URL (/embed/<courseId>) is a Pro feature.

  • Works well
  • Module feels like part of the page
  • Good for long-form pages with an inline demo
  • Watch out for
  • Security and caching plugins love to break it
  • Page builders strip raw HTML on save
  • Cramped on narrow mobile themes

Inline embed · paste into a Custom HTML block

<iframe
  src="https://www.trainingos.com/embed/your-course-id?creator=your-handle"
  width="100%"  height="760"
  allow="fullscreen"
  title="Compliance refresher — interactive module"
></iframe>

/03Where WordPress fights you.

If the iframe misbehaves, it’s almost always one of three WordPress-specific things — in order of how often I see them:

1. A security plugin is blocking the frame.

Wordfence, iThemes, and friends sometimes refuse to render external iframes. Whitelist your host’s domain in the plugin’s content-security settings — or just use the new-tab button and move on with your day.

2. The editor ate your iframe.

Page builders and “sanitize HTML” settings strip <iframe> tags on save. If your embed vanishes after you hit Update, use a block that explicitly allows raw HTML — or, again, the button.

3. A caching plugin is serving a stale page.

WP Rocket, LiteSpeed, and co. cache aggressively. Exclude the page from full-page cache while you’re testing, or you’ll swear you fixed something that the cache is quietly hiding.

/04Before you hit publish.

Run this once, from a logged-out incognito window:

  • The button or iframe loads the module — not a download prompt.
  • Audio plays, completion fires, and resume works if your package relies on them.
  • It looks right on a phone — narrow themes crush iframes; bump the height or fall back to the button.
  • Re-check after any theme or plugin update; updates love to re-tighten allowed HTML.

/05Frequently asked questions.

Do I need a SCORM plugin for WordPress?
Not for hosted playback. A plugin only matters if you want SCORM completion data stored inside WordPress itself. For portfolio demos and most training launches, a link or iframe to a hosted module is all you need.
Why does my embedded course show a blank box?
Almost always a security plugin, a content-security-policy rule, or a Custom HTML block that stripped the iframe. Open the browser console, look for a blocked-frame error, and confirm the raw launch URL works in a new tab.
Should I use a link or an iframe?
Default to a new-tab button — it survives plugins, page builders, and theme changes. Reach for an iframe only when the demo needs to live inline on a page whose theme you control and have tested.

See what Allure Training OS includes

About the author

Jonathan Borgwing

Jonathan Borgwing founded Allure Training OS. He writes about hosting SCORM, xAPI and sharing work clients can open.

Put your SCORM somewhere people can play it.