- WordPress 6.9.4 (es_ES) with Kadence theme - Homepage: Hero, La Asociación, Pilares, Beneficios, Eventos, Miembros, Hazte Miembro, Contacto - Brand identity: #13294b navy, #a12932 burgundy, #c69c48 gold - Fonts: Raleway (headings) + Source Sans 3 (body) + Lato (UI) - Plugins: Kadence Blocks, Polylang, Contact Form 7 - Custom CSS with full brand styling and responsive layout - HTTPS enforced via wp-config.php proxy detection
146 lines
3.1 KiB
PHP
146 lines
3.1 KiB
PHP
<?php declare( strict_types=1 );
|
|
|
|
namespace KadenceWP\KadenceBlocks\Optimizer;
|
|
|
|
use InvalidArgumentException;
|
|
use KadenceWP\KadenceBlocks\Optimizer\Path\Path;
|
|
use KadenceWP\KadenceBlocks\Optimizer\Path\Path_Factory;
|
|
use KadenceWP\KadenceBlocks\Optimizer\Response\WebsiteAnalysis;
|
|
use KadenceWP\KadenceBlocks\Optimizer\Store\Contracts\Store;
|
|
|
|
/**
|
|
* A registry to fetch custom data from the WebsiteAnalysis DTO.
|
|
*
|
|
* @phpstan-type HtmlClassHeightMap array<string, float> Class attribute => height in pixels.
|
|
*/
|
|
class Analysis_Registry {
|
|
|
|
private const SECTIONS = 'sections';
|
|
|
|
/**
|
|
* Memoization cache.
|
|
*
|
|
* @var array<string, mixed>
|
|
*/
|
|
private array $cache = [];
|
|
private ?Path $path = null;
|
|
private ?WebsiteAnalysis $analysis = null;
|
|
private Store $store;
|
|
private bool $is_mobile;
|
|
|
|
public function __construct(
|
|
Store $store,
|
|
Path_Factory $path_factory,
|
|
bool $is_mobile
|
|
) {
|
|
$this->store = $store;
|
|
$this->is_mobile = $is_mobile;
|
|
|
|
try {
|
|
$this->path = $path_factory->make();
|
|
} catch ( InvalidArgumentException $e ) {
|
|
$this->path = null;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Flush the memoization cache.
|
|
*
|
|
* @return void
|
|
*/
|
|
public function flush(): void {
|
|
$this->analysis = null;
|
|
$this->cache = [];
|
|
}
|
|
|
|
/**
|
|
* Build the WebsiteAnalysis DTO based on the current path.
|
|
*
|
|
* @return WebsiteAnalysis|null
|
|
*/
|
|
public function get_analysis(): ?WebsiteAnalysis {
|
|
if ( $this->analysis !== null ) {
|
|
return $this->analysis;
|
|
}
|
|
|
|
if ( ! $this->path ) {
|
|
return null;
|
|
}
|
|
|
|
$this->analysis = $this->store->get( $this->path );
|
|
|
|
return $this->analysis;
|
|
}
|
|
|
|
/**
|
|
* Check if this request is optimized.
|
|
*
|
|
* @return bool
|
|
*/
|
|
public function is_optimized(): bool {
|
|
return $this->get_analysis() instanceof WebsiteAnalysis;
|
|
}
|
|
|
|
/**
|
|
* Get the above the fold background images for the current viewport.
|
|
*
|
|
* @return string[]
|
|
*/
|
|
public function get_background_images(): array {
|
|
$analysis = $this->get_analysis();
|
|
|
|
return $analysis
|
|
? ( $this->is_mobile ? $analysis->mobile->backgroundImages : $analysis->desktop->backgroundImages )
|
|
: [];
|
|
}
|
|
|
|
/**
|
|
* Get the list of the above the fold image URLs.
|
|
*
|
|
* @return string[]
|
|
*/
|
|
public function get_critical_images(): array {
|
|
$analysis = $this->get_analysis();
|
|
|
|
return $analysis
|
|
? ( $this->is_mobile ? $analysis->mobile->criticalImages : $analysis->desktop->criticalImages )
|
|
: [];
|
|
}
|
|
|
|
/**
|
|
* For the current viewport, get all the "below the fold" sections that have a height
|
|
* greater than 0.
|
|
*
|
|
* @return HtmlClassHeightMap
|
|
*/
|
|
public function get_valid_sections(): array {
|
|
if ( isset( $this->cache[ self::SECTIONS ] ) ) {
|
|
return $this->cache[ self::SECTIONS ];
|
|
}
|
|
|
|
$analysis = $this->get_analysis();
|
|
|
|
if ( ! $analysis ) {
|
|
$this->cache[ self::SECTIONS ] = [];
|
|
|
|
return [];
|
|
}
|
|
|
|
$sections = $this->is_mobile
|
|
? $analysis->mobile->getBelowTheFoldSections()
|
|
: $analysis->desktop->getBelowTheFoldSections();
|
|
|
|
$results = [];
|
|
|
|
foreach ( $sections as $section ) {
|
|
if ( $section->height > 0 ) {
|
|
$results[ $section->className ] = $section->height;
|
|
}
|
|
}
|
|
|
|
$this->cache[ self::SECTIONS ] = $results;
|
|
|
|
return $this->cache[ self::SECTIONS ];
|
|
}
|
|
}
|