Skip to content

Session Handoff — Programs SEO & Architecture

Created 2026-02-24
Updated 2026-02-24
Tags handoffseoprogramssession-context

Use this file to resume work on the Baseworks programs page architecture and Spring 2026 cohort launch.


In Claude Code (terminal):

Read ~/Documents/baseworks-changelog/CLAUDE-INSTRUCTIONS.md

Then reference this file and the full notes below.

SSH access:

ssh bwsite_primo_82@5.180.253.171
WP path: /var/www/baseworks.com

All decisions, architecture, and to-do list from the Feb 24 session are documented here:

~/Obsidian/baseworks-kb-shared-brain/02-areas/website/seo-architecture-session-2026-02-24.md

Read that file first before starting any work. It contains the full architecture diagram, redirect rules, schema strategy, and the phased to-do list.


Context: what was decided (quick reference)

Section titled “Context: what was decided (quick reference)”

Program naming: Staying with Study Group (no rename). The format pair is:

  • Baseworks Study Group — multi-week cohort (7 sessions over 7 weeks)
  • Baseworks Lab — intensive format (dropped “Study” from “Study Lab”)

Target hub URL: /programs/montreal-study-group/ Currently ranking at: /montreal-study-program/ (Page ID 33521) — do not touch this URL until the URL restructuring phase (see to-do list).

Spring 2026 cohort:

  • Dates: April 4 – May 16, 2026 (7 Saturdays)
  • Location: Proto Studio, Montreal
  • Price + enrollment cap: still TBD — must be set before any pages go live
  • Obsidian notes: Spring 2026 Study Group Montreal

What needs to happen next (in priority order)

Section titled “What needs to happen next (in priority order)”
  • Finalize Spring 2026 price and enrollment cap
  • Update /montreal-study-program/ content to function as a hub (upcoming cohort prominent, links to past events)
  • Create Spring 2026 event post (/event/montreal-study-group-spring-2026/) with Event schema
  • Create campaign landing pages — EN + FR versions, noindexed, canonical → event post
  • Finish and publish Study Lab Landing draft (Page ID 36638)
  • Update /programs/ page (ID 28338) to link to Montreal Study Group hub + Study Lab hub
  • Change slug montreal-study-programmontreal-study-group AND set parent to programs (ID 28338) in ONE save
  • Verify redirect in SEOPress: /montreal-study-program/ →301→ /programs/montreal-study-group/ (single hop)
  • Clean up duplicate pages (all 301 directly to /programs/montreal-study-group/):
    • /smart-movement-mtl-2025/ (ID 34474)
    • /smart-movement-study-program-mtl-2025/ (ID 34739)
    • /smart-movement-study-program-2026/ (ID 44805)
    • /smsg-2026/ (ID 44851)
  • Add breadcrumb Schema to Montreal Study Group event posts via SEOPress
  • Submit updated sitemap in Google Search Console

FileWhat it is
~/Documents/baseworks-changelog/CLAUDE-INSTRUCTIONS.mdAlways read at session start
~/Documents/baseworks-changelog/CHANGELOG.mdLog all site changes here
~/Documents/baseworks-changelog/docs/SEO-PLUGIN-MIGRATION-PLAN.mdSEOPress migration plan (in progress)
~/Obsidian/baseworks-kb-shared-brain/02-areas/website/seo-architecture-session-2026-02-24.mdFull session notes from Feb 24
~/Obsidian/baseworks-kb-shared-brain/02-areas/educational-programs/educational-programs.mdPrograms overview
~/Obsidian/baseworks-kb-shared-brain/02-areas/educational-programs/study-groups/2026 (Spring) Study Group Montreal/Spring 2026 cohort notes

baseworks.com — main site (this session's focus)
practice.baseworks.com — learning platform (separate, not in scope here)
staging.baseworks.com — test changes here before production

SEO plugin: SEOPress PRO (migrated from Slim SEO — see migration plan doc above) Page builder: Elementor Multilingual: WPML (EN + JA — French is NOT a full site language)


The /programs/ page (ID 28338) is now live using a custom PHP page template.

Template file:

~/files/wp-content/themes/kadence/template-programs-hub.php

(also tracked at sites/baseworks.com/theme-overrides/template-programs-hub.php in the changelog repo)

To revert: WP Admin → Pages → Programs (ID 28338) → Page Attributes → Template → Default


Technical notes — implementing PHP page templates on this site

Section titled “Technical notes — implementing PHP page templates on this site”

Things that tripped us up during deployment. Keep these in mind for any future custom PHP templates.

1. Kadence namespace — always use \Kadence\kadence()

Section titled “1. Kadence namespace — always use \Kadence\kadence()”

Kadence’s helper function is declared inside namespace Kadence;. Custom page templates do not inherit that namespace. Calling kadence() from a template without a namespace declaration causes a fatal PHP error — the page goes blank with no output after the header.

Always use the fully qualified call:

\Kadence\kadence()->print_styles( 'kadence-content' );

2. Design tokens are not in Kadence core — include them in the template

Section titled “2. Design tokens are not in Kadence core — include them in the template”

The site’s CSS variables (--color-bg-dark, --color-primary, --font-display, --font-accent, --space-*, etc.) and utility classes (.container, .section, .btn) live in baseworks-tokens.css — a mockup-only file. They are not part of Kadence’s theme CSS.

Custom page templates bypass Elementor entirely, so these tokens are not loaded. The fix: copy the full :root {} token block and utility classes directly into the template’s <style> block.

Reference file: sites/baseworks.com/mockups/baseworks-tokens.css

Adding a wrapper <div class="programs-hub"> around all content lets you scope utility classes (.container, .section, .btn) without risking conflicts with Kadence’s own CSS that uses similar class names. Use .programs-hub .container { ... } etc.

4. Page template is in the parent Kadence theme (no child theme)

Section titled “4. Page template is in the parent Kadence theme (no child theme)”

There is no child theme on baseworks.com — only the parent Kadence theme. Templates go directly in:

~/files/wp-content/themes/kadence/

Kadence updates do not overwrite custom files you add. Only files that ship with Kadence (like page.php) would be overwritten by an update — custom templates with unique filenames are safe.

The web root for bwsite_primo_82 is ~/files/ (not /var/www/baseworks.com/ directly — that’s the system path used in PHP error logs). Upload files to:

~/files/wp-content/themes/kadence/

6. Cache: PHP file changes require a manual purge

Section titled “6. Cache: PHP file changes require a manual purge”

Deploying or editing a PHP template file on disk does NOT trigger any WordPress cache hook. Neither cloudflare-auto-purge.php nor the elementor-css-cache-handler.php mu-plugin will fire — those only respond to WP events (post saves, Elementor flushes, etc.).

After any SSH file change (template edits, mu-plugin changes, etc.) you must run the full purge manually:

Terminal window
cd /var/www/baseworks.com
# 1. Redis
wp cache flush
# 2. nginx FastCGI (owned by bwsite_primo_82 — no sudo needed)
rm -rf /etc/nginx/cache/baseworks.com/*
# 3. Cloudflare
CF_EMAIL='accounts@baseworks.com'
CF_KEY='149706d4a2297dcb049f2d1f64848138e2bf1'
ZONE_ID='98842cf61429901d7e7214e3cb71f6db'
curl -s -X POST "https://api.cloudflare.com/client/v4/zones/$ZONE_ID/purge_cache" \
-H "X-Auth-Email: $CF_EMAIL" \
-H "X-Auth-Key: $CF_KEY" \
-H 'Content-Type: application/json' \
--data '{"purge_everything":true}'
# 4. Warm the page (so nginx rebuilds cache from fresh PHP render)
curl -s -o /dev/null -w '%{http_code}' --resolve baseworks.com:443:127.0.0.1 -k https://baseworks.com/programs/

Symptom when forgotten: Cloudflare shows cf-cache-status: MISS (already cleared) but x-cache: HIT (nginx still serving old content). The nginx cache file timestamp predates the file change.

Quick diagnosis:

Terminal window
# Find the nginx cache file for /programs/
find /etc/nginx/cache/baseworks.com -type f | while read f; do
key=$(head -c 300 "$f" 2>/dev/null | grep -a 'KEY:' | head -1)
echo "$key" | grep -q 'programs' && ls -la "$f"
done

Compare the cache file timestamp to when you last modified the template.