Newsroom Puzzles

CMS

WordPress VIP Install

Ship the puzzle embed on WordPress VIP — code review, allowed scripts, and deployment-safe patterns.

WordPress VIP is managed WordPress for high-traffic publishers — code review, security scanning, and deployment pipelines. The puzzle embed is still one script tag; the difference is how you ship it through VIP’s workflow.

What you are shipping

A single external script load — no new PHP dependencies, no Composer packages, no database migrations on your side:

<script src="https://newsroompuzzles.com/embed.js?site=yourpaper.com&game=sudoku"></script>

For code review, note: script loads from newsroompuzzles.com, posts anonymous JSON events to https://newsroompuzzles.com/api/events, uses Shadow DOM, no cookies, no reader PII.

Recommended pattern: theme template partial

Add a reusable partial in your VIP theme repo rather than pasting into post content:

@
<div class="puzzle-embed">
  <script src="https://newsroompuzzles.com/embed.js?site=yourpaper.com&game=sudoku&flat=1"></script>
</div>

Include it from 404.php, a page template, or a block pattern registration. Child themes or a dedicated VIP client mu-plugin are both acceptable — follow your org’s standard.

Block editor option

Editors can use a Custom HTML block on VIP if your tenant allows unfiltered HTML for authorized roles. Many VIP shops prefer template-level injection so editors cannot paste arbitrary scripts in posts. See the standard WordPress guide for block editor steps.

Code review checklist

Include this in your VIP pull request description:

  • External origin: https://newsroompuzzles.com (script + XHR/fetch to same origin)
  • No inline JavaScript required
  • CSP addition if enforced: script-src and connect-src for newsroompuzzles.com
  • site= parameter hard-coded or passed from site option — must match production domain
  • Widget isolated via Shadow DOM — minimal CSS collision risk

Environments

Use your production domain in site= on production only. For develop/staging, either omit the embed or use a staging domain string so analytics stay separate. VIP’s WP_ENV constant is a good gate:

if ( defined( 'VIP_GO_APP_ENVIRONMENT' ) && 'production' === VIP_GO_APP_ENVIRONMENT ) {
    // output embed partial
}

Multiple games

Pass game= as a partial argument or block attribute — sudoku, akari, wordsearch, hangman, memory, game2048. Word games support pack=. Full reference.

Related