fabiodemelo.com arrived as the most-neglected of the four sites done so far — 14 of 15 published items had no Rank Math score and 14 had no focus keyword set. Per-post SEO was effectively zero. Plus: no LiteSpeed Cache plugin (TTFB 1.3s+), no og:image in HTML output, all social URL fields empty, and 5 imgs with empty alt on the homepage.
Result: TTFB 1.27s → 0.09s (14× faster), focus keywords now set on all 15 items (auto-derived from titles), og:image + twitter:image emit on every page, knowledge graph type corrected to person (it's a personal brand), all 47 imgs on homepage have non-empty alt, and 1 stray auto-draft cleaned up.
Hit a snag mid-flight: my mu-plugin template had a structural bug — a regex literal containing the bytes */ prematurely closed an outer /* */ wrapper that was supposed to comment out an optional code block. Caused fabiodemelo.com to WSOD for ~2 minutes. Fixed by replacing the wrapping with if (false) {…} in the template + added gotcha #21 to known-gotchas.md so it doesn't bite the next site.
company → person DONEknowledgegraph_type = person, knowledgegraph_name = "Fabio DeMelo" (was "Fabio DeMelo - USA"), website_alternate_name = "Fabio DeMelo — Entrepreneur & Philanthropist".fabio demelo, "Building a Better World through Business" → building better world, "Navigating Life's Challenges" → navigating life challenges. The "News & Articles" page got an awkward auto-derived FK ("news amp articles" from the HTML entity); manually fixed to "news articles".og:image + twitter:image output-buffer injection DONEtemplate_redirect priority 11, scans for og:image in head, and injects both tags before </head> if missing. Source priority: per-post FB image → per-post Twitter image → featured image → site-wide homepage image → site-wide OG default → og:image:secure_url fallback.<img> on every page has a non-empty alt — looks up media library by URL → uses postmeta → falls back to humanized filename prefixed "Fabio DeMelo — ".x-litespeed-cache: hit on second request. TTFB cold ~2.1s → cached 0.09s.Options -Indexes to .htaccess + dropped index.php silencer files in wp-content/{plugins,themes,uploads}/.<h1> neutralizer + viewport fix DONE<h1>…</h1> placeholders to <div> and strips user-scalable=no from viewport meta if present.The drop-in mu-plugin template at ~/.claude/skills/seo-rank-math/assets/mu-plugin-seo-render.php.template had two optional code blocks wrapped in /* … */. Inside one of them was a regex literal: '/\s*[\|\—\-]\s*/'. The bytes */ appear in the regex (whitespace + slash), and PHP's lexer closes the outer comment at the first */ it sees — even inside a string literal. So the "commented out" code partially executed, hit a malformed structure, and threw a parse error that took fabiodemelo.com down for ~2 minutes.
Fixed by replacing the /* … */ wrapping with if (false) { … } in the template (which doesn't have the lexer-level comment-close issue) AND added gotcha #21 to known-gotchas.md. The 4 remaining WordPress sites won't hit this.
| Signal | Status |
|---|---|
| og:image | Fabio-DeMelo-USA-Entrepreneur-Philanthropist-00285.jpeg OK |
| twitter:image | same OK |
| og:site_name | "Fabio DeMelo" OK |
| viewport | width=device-width, initial-scale=1 OK |
| H1 with text (homepage) | 0 Elementor canvas — no H1 in hero. Add one in Elementor for stronger on-page SEO. |
| H2 count | 11 OK |
| imgs total / empty alt / no alt | 47 / 0 / 0 OK |
| schema blocks (JSON-LD) | 1 OK |
| x-litespeed-cache | hit OK |
| TTFB (cache) | 0.09s OK |
fabio demelo, building better world); others are mechanical and could be sharpened to reflect actual search demand.sameAs needs at least one entry.| # | Item | Effort |
|---|---|---|
| 1 | The 6 user-action items above | ~30-50 min total (mostly the FK review) |
| 2 | Move to next site (10 WP sites left to do) | per-site basis |