oont-contents/plugins/jetpack-boost/app/modules/optimizations/page-cache/class-page-cache.php
2025-04-06 08:34:48 +02:00

128 lines
4.4 KiB
PHP

<?php
namespace Automattic\Jetpack_Boost\Modules\Optimizations\Page_Cache;
use Automattic\Jetpack\Schema\Schema;
use Automattic\Jetpack\Status\Host;
use Automattic\Jetpack\WP_JS_Data_Sync\Data_Sync;
use Automattic\Jetpack_Boost\Contracts\Feature;
use Automattic\Jetpack_Boost\Contracts\Has_Data_Sync;
use Automattic\Jetpack_Boost\Contracts\Has_Deactivate;
use Automattic\Jetpack_Boost\Contracts\Needs_To_Be_Ready;
use Automattic\Jetpack_Boost\Contracts\Optimization;
use Automattic\Jetpack_Boost\Modules\Optimizations\Page_Cache\Data_Sync\Page_Cache_Entry;
use Automattic\Jetpack_Boost\Modules\Optimizations\Page_Cache\Data_Sync_Actions\Clear_Page_Cache;
use Automattic\Jetpack_Boost\Modules\Optimizations\Page_Cache\Data_Sync_Actions\Deactivate_WPSC;
use Automattic\Jetpack_Boost\Modules\Optimizations\Page_Cache\Data_Sync_Actions\Run_Setup;
use Automattic\Jetpack_Boost\Modules\Optimizations\Page_Cache\Pre_WordPress\Boost_Cache;
use Automattic\Jetpack_Boost\Modules\Optimizations\Page_Cache\Pre_WordPress\Boost_Cache_Settings;
use Automattic\Jetpack_Boost\Modules\Optimizations\Page_Cache\Pre_WordPress\Filesystem_Utils;
use Automattic\Jetpack_Boost\Modules\Optimizations\Page_Cache\Pre_WordPress\Logger;
class Page_Cache implements Feature, Has_Deactivate, Has_Data_Sync, Optimization, Needs_To_Be_Ready {
/**
* @var array - The errors that occurred when removing the cache.
*/
private $removal_errors = array();
/**
* The signature used to identify the advanced-cache.php file owned by Jetpack Boost.
*/
const ADVANCED_CACHE_SIGNATURE = 'Boost Cache Plugin';
/**
* The full signature including the current version, to verify the Advanced-cache file is current.
*/
const ADVANCED_CACHE_VERSION = 'v0.0.3';
/**
* @var Boost_Cache_Settings - The settings for the page cache.
*/
private $settings;
public function __construct() {
$this->settings = Boost_Cache_Settings::get_instance();
}
public function setup() {
Garbage_Collection::setup();
add_action( 'jetpack_boost_page_output_changed', array( $this, 'handle_page_output_change' ) );
}
public function register_data_sync( Data_Sync $instance ) {
$page_cache_schema = Schema::as_assoc_array(
array(
'bypass_patterns' => Schema::as_array( Schema::as_string() ),
'logging' => Schema::as_boolean(),
)
);
$page_cache_error_schema = Schema::as_assoc_array(
array(
'code' => Schema::as_string(),
'message' => Schema::as_string(),
'dismissed' => Schema::as_boolean()->fallback( false ),
)
)->nullable();
$instance->register_readonly( 'cache_debug_log', Schema::as_unsafe_any(), array( Logger::class, 'read' ) );
$instance->register_readonly( 'cache_engine_loading', Schema::as_unsafe_any(), array( Boost_Cache::class, 'is_loaded' ) );
$instance->register( 'page_cache', $page_cache_schema, new Page_Cache_Entry() );
// Page Cache error
$instance->register( 'page_cache_error', $page_cache_error_schema );
$instance->register_action( 'page_cache', 'run-setup', Schema::as_void(), new Run_Setup() );
$instance->register_action( 'page_cache', 'clear-page-cache', Schema::as_void(), new Clear_Page_Cache() );
$instance->register_action( 'page_cache', 'deactivate-wpsc', Schema::as_void(), new Deactivate_WPSC() );
}
public function handle_page_output_change() {
$this->invalidate_cache();
// Remove the action so it doesn't run again during the same request.
remove_action( 'jetpack_boost_page_output_changed', array( $this, 'handle_page_output_change' ) );
}
private function invalidate_cache() {
$cache = new Boost_Cache();
$cache->get_storage()->invalidate( home_url(), Filesystem_Utils::DELETE_ALL );
}
/**
* Runs cleanup when the feature is deactivated.
*/
public static function deactivate() {
Garbage_Collection::deactivate();
Boost_Cache_Settings::get_instance()->set( array( 'enabled' => false ) );
Page_Cache_Setup::delete_advanced_cache();
}
/**
* The module is active if cache engine is loaded.
*
* @return bool
*/
public function is_ready() {
return Boost_Cache::is_loaded();
}
public static function is_available() {
// Disable Page Cache on WoA and WP Cloud clients.
// They already have caching enabled.
if ( ( new Host() )->is_woa_site() || ( new Host() )->is_atomic_platform() ) {
if ( Page_Cache_Setup::can_run_cache() ) {
return true;
}
return false;
}
return true;
}
public static function get_slug() {
return 'page_cache';
}
}