fix: blank page

This commit is contained in:
2026-05-12 13:42:02 -04:00
parent 7cb5c30b71
commit cb5e688e55
3 changed files with 55 additions and 7 deletions

View File

@@ -35,6 +35,7 @@
"lewebsimple/advanced-custom-fields-pro": "*", "lewebsimple/advanced-custom-fields-pro": "*",
"lewebsimple/ithemes-security-pro": "*", "lewebsimple/ithemes-security-pro": "*",
"lewebsimple/kaliroots": "*", "lewebsimple/kaliroots": "*",
"lewebsimple/polylang-pro": "*",
"lewebsimple/wp-offload-ses": "*", "lewebsimple/wp-offload-ses": "*",
"wpackagist-plugin/disable-comments": "*", "wpackagist-plugin/disable-comments": "*",
"wpackagist-plugin/user-switching": "*" "wpackagist-plugin/user-switching": "*"

29
composer.lock generated
View File

@@ -4,7 +4,7 @@
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
"This file is @generated automatically" "This file is @generated automatically"
], ],
"content-hash": "5a3da24d8abeb9e99f6f31797787cb3c", "content-hash": "6213374b7b0148dc093add61e4f5be92",
"packages": [ "packages": [
{ {
"name": "composer/installers", "name": "composer/installers",
@@ -203,6 +203,23 @@
"type": "wordpress-theme", "type": "wordpress-theme",
"time": "2026-02-09T15:07:56+00:00" "time": "2026-02-09T15:07:56+00:00"
}, },
{
"name": "lewebsimple/polylang-pro",
"version": "v3.7.7",
"source": {
"type": "git",
"url": "ssh://git@gitea.websimple.com:222/wp-plugins/polylang-pro.git",
"reference": "f13d2bf308d50713f5de50e7734b505e239d068b"
},
"dist": {
"type": "zip",
"url": "https://satis.ledevsimple.ca/dist/lewebsimple/polylang-pro/lewebsimple-polylang-pro-v3.7.7-e381d8.zip",
"reference": "f13d2bf308d50713f5de50e7734b505e239d068b",
"shasum": "ab06adf3c74f74cf08ec02200943ef1079c723c3"
},
"type": "wordpress-plugin",
"time": "2026-02-09T14:11:16+00:00"
},
{ {
"name": "lewebsimple/wp-offload-ses", "name": "lewebsimple/wp-offload-ses",
"version": "v1.6.8", "version": "v1.6.8",
@@ -260,16 +277,16 @@
"packages-dev": [ "packages-dev": [
{ {
"name": "dealerdirect/phpcodesniffer-composer-installer", "name": "dealerdirect/phpcodesniffer-composer-installer",
"version": "v1.2.0", "version": "v1.2.1",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/PHPCSStandards/composer-installer.git", "url": "https://github.com/PHPCSStandards/composer-installer.git",
"reference": "845eb62303d2ca9b289ef216356568ccc075ffd1" "reference": "963f0c67bffde0eac41b56be71ac0e8ba132f0bd"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/PHPCSStandards/composer-installer/zipball/845eb62303d2ca9b289ef216356568ccc075ffd1", "url": "https://api.github.com/repos/PHPCSStandards/composer-installer/zipball/963f0c67bffde0eac41b56be71ac0e8ba132f0bd",
"reference": "845eb62303d2ca9b289ef216356568ccc075ffd1", "reference": "963f0c67bffde0eac41b56be71ac0e8ba132f0bd",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@@ -352,7 +369,7 @@
"type": "thanks_dev" "type": "thanks_dev"
} }
], ],
"time": "2025-11-11T04:32:07+00:00" "time": "2026-05-06T08:26:05+00:00"
}, },
{ {
"name": "lewebsimple/wp-phpcs-ruleset", "name": "lewebsimple/wp-phpcs-ruleset",

View File

@@ -44,10 +44,40 @@ declare global {
} }
} }
// WP's PHP serializer omits empty ACF fields, so sections coming from the CMS can
// be missing title/body/etc. Treat those missing-or-empty values as "fall back to
// the local content" instead of letting them blow up the React render.
function isEmptyValue(v: unknown): boolean {
if (v === null || v === undefined) return true;
if (typeof v === "string") return v === "";
if (Array.isArray(v)) return v.length === 0;
if (typeof v === "object") {
const obj = v as Record<string, unknown>;
if ("fr" in obj && "en" in obj) return !obj.fr && !obj.en;
}
return false;
}
function mergeSection(local: SectionBlock | undefined, wp: SectionBlock): SectionBlock {
if (!local || local.type !== wp.type) return wp;
const merged: Record<string, unknown> = { ...local };
for (const [key, val] of Object.entries(wp)) {
if (!isEmptyValue(val)) merged[key] = val;
}
return merged as unknown as SectionBlock;
}
export function PageRenderer({ page }: { page: PageContent }) { export function PageRenderer({ page }: { page: PageContent }) {
const { t, locale } = useLocale(); const { t, locale } = useLocale();
const wpPage = window.__CASCA_PAGE__; const wpPage = window.__CASCA_PAGE__;
const renderedPage = wpPage?.sections?.length ? ({ ...page, ...wpPage } as PageContent) : page; const wpSections = wpPage?.sections;
const renderedPage = wpSections?.length
? ({
...page,
...wpPage,
sections: wpSections.map((wpSec, i) => mergeSection(page.sections[i], wpSec)),
} as PageContent)
: page;
// Per-page SEO (title + description). React 19 will hoist these to <head>. // Per-page SEO (title + description). React 19 will hoist these to <head>.
useEffect(() => { useEffect(() => {