From b50200b1bc1b1786627eb08e56d8a89d528a9070 Mon Sep 17 00:00:00 2001 From: Duncan McClean Date: Thu, 2 Jul 2026 10:34:46 +0100 Subject: [PATCH 1/2] Cache Site Defaults origins lookup `SiteDefaults::origins()` rebuilt the addon settings from disk (YAML parse + Antlers over every stored value) on every call, and it's called once per site while building the page. On installs with many sites this made the Site Defaults page take 30s+ to load. Memoize the getter with Blink::once, matching how `get()` is already cached, and invalidate it alongside the existing cache when origins are saved. Co-Authored-By: Claude Opus 4.8 (1M context) --- src/SiteDefaults/SiteDefaults.php | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/src/SiteDefaults/SiteDefaults.php b/src/SiteDefaults/SiteDefaults.php index edb0894b..b64a1d2c 100644 --- a/src/SiteDefaults/SiteDefaults.php +++ b/src/SiteDefaults/SiteDefaults.php @@ -32,15 +32,18 @@ public static function get(): Collection public static function origins($origins = null): Collection|bool { if (func_num_args() === 0) { - return Site::all() - ->mapWithKeys(fn ($site) => [$site->handle() => null]) - ->merge(Addon::get('statamic/seo-pro')->settings()->get('site_defaults_sites', [])) - ->map(fn ($origin) => empty($origin) ? null : $origin); + return Blink::once('seo-pro::site-defaults-origins', function () { + return Site::all() + ->mapWithKeys(fn ($site) => [$site->handle() => null]) + ->merge(Addon::get('statamic/seo-pro')->settings()->get('site_defaults_sites', [])) + ->map(fn ($origin) => empty($origin) ? null : $origin); + }); } Addon::get('statamic/seo-pro')->settings()->set('site_defaults_sites', $origins)->save(); Blink::forget('seo-pro::site-defaults'); + Blink::forget('seo-pro::site-defaults-origins'); return true; } @@ -67,6 +70,7 @@ public static function save(LocalizedSiteDefaults $localized): bool Addon::get('statamic/seo-pro')->settings()->set('site_defaults', $data)->save(); Blink::forget('seo-pro::site-defaults'); + Blink::forget("seo-pro::site-defaults.augmented.{$localized->locale()}"); return true; } From 0ba7f36ac6f332ed89320f01454a8d764defe8d8 Mon Sep 17 00:00:00 2001 From: Duncan McClean Date: Thu, 2 Jul 2026 10:34:51 +0100 Subject: [PATCH 2/2] Cache augmented Site Defaults values `LocalizedSiteDefaults::augmented()` ran two full blueprint augmentation passes on every call with no memoization, which is repeated per-item in the sitemap, reporting and GraphQL paths. Wrap it in Blink::once per locale, matching the section defaults equivalent, and invalidate it when defaults are saved. Co-Authored-By: Claude Opus 4.8 (1M context) --- src/SiteDefaults/LocalizedSiteDefaults.php | 37 ++++++++++++---------- 1 file changed, 20 insertions(+), 17 deletions(-) diff --git a/src/SiteDefaults/LocalizedSiteDefaults.php b/src/SiteDefaults/LocalizedSiteDefaults.php index 494a65c8..c0b6f66d 100644 --- a/src/SiteDefaults/LocalizedSiteDefaults.php +++ b/src/SiteDefaults/LocalizedSiteDefaults.php @@ -4,6 +4,7 @@ use Illuminate\Support\Collection; use Statamic\Data\HasOrigin; +use Statamic\Facades\Blink; use Statamic\Facades\Blueprint; use Statamic\Facades\Site; use Statamic\SeoPro\Events\SiteDefaultsSaved; @@ -98,23 +99,25 @@ public function blueprint(): \Statamic\Fields\Blueprint public function augmented(): array { - $contentValues = Blueprint::make() - ->setContents(['tabs' => ['main' => ['sections' => Fields::new()->getConfig()]]]) - ->fields() - ->addValues($this->values()->all()) - ->augment() - ->values(); - - $siteDefaultValues = $this->blueprint() - ->fields() - ->addValues($this->values()->all()) - ->augment() - ->values(); - - return $siteDefaultValues - ->merge($contentValues) - ->only($this->keys()->all()) - ->all(); + return Blink::once("seo-pro::site-defaults.augmented.{$this->locale}", function () { + $contentValues = Blueprint::make() + ->setContents(['tabs' => ['main' => ['sections' => Fields::new()->getConfig()]]]) + ->fields() + ->addValues($this->values()->all()) + ->augment() + ->values(); + + $siteDefaultValues = $this->blueprint() + ->fields() + ->addValues($this->values()->all()) + ->augment() + ->values(); + + return $siteDefaultValues + ->merge($contentValues) + ->only($this->keys()->all()) + ->all(); + }); } public function editUrl(): string