oont-contents/plugins/wp-rocket/inc/Engine/HealthCheck/ActionSchedulerCheck.php
2025-02-08 15:10:23 +01:00

130 lines
3.2 KiB
PHP

<?php
declare(strict_types=1);
namespace WP_Rocket\Engine\HealthCheck;
use ActionScheduler_StoreSchema;
use ActionScheduler_LoggerSchema;
use WP_Rocket\Event_Management\Subscriber_Interface;
use WP_Rocket\Engine\Activation\ActivationInterface;
class ActionSchedulerCheck implements Subscriber_Interface, ActivationInterface {
/**
* Array of events this subscribers listens to
*
* @return array
*/
public static function get_subscribed_events(): array {
$slug = rocket_get_constant( 'WP_ROCKET_SLUG', 'wp_rocket_settings' );
return [
'update_option_' . $slug => [ 'check_on_update_options', 10, 2 ],
'wp_rocket_update' => 'maybe_recreate_as_tables',
];
}
/**
* Actions to perform on plugin activation
*
* @return void
*/
public function activate() {
add_action( 'rocket_activation', [ $this, 'maybe_recreate_as_tables' ] );
}
/**
* Maybe recreate Action Scheduler tables if they are missing
*
* @return bool
*/
public function maybe_recreate_as_tables(): bool {
if ( $this->is_valid_as_tables() ) {
return false;
}
$store_schema = new ActionScheduler_StoreSchema();
$logger_schema = new ActionScheduler_LoggerSchema();
$store_schema->register_tables( true );
$logger_schema->register_tables( true );
return true;
}
/**
* Maybe recreate tables on preload or RUCSS activation
*
* @param mixed $old_value The old option value.
* @param mixed $value The new option value.
*
* @return bool
*/
public function check_on_update_options( $old_value, $value ): bool {
if ( ! isset( $old_value['remove_unused_css'], $value['remove_unused_css'], $old_value['manual_preload'], $value['manual_preload'] ) ) {
return false;
}
if (
$old_value['remove_unused_css'] === $value['remove_unused_css']
&&
$old_value['manual_preload'] === $value['manual_preload']
) {
return false;
}
if (
0 === (int) $value['remove_unused_css']
&&
0 === (int) $value['manual_preload']
) {
return false;
}
if (
(
$old_value['remove_unused_css'] !== $value['remove_unused_css']
&&
1 !== (int) $value['remove_unused_css']
)
||
(
$old_value['manual_preload'] !== $value['manual_preload']
&&
1 !== (int) $value['manual_preload']
)
) {
return false;
}
return $this->maybe_recreate_as_tables();
}
/**
* Check if Action Scheduler tables exists
*
* @return bool
*/
private function is_valid_as_tables(): bool {
$cached_count = get_transient( 'rocket_rucss_as_tables_count' );
if (
false !== $cached_count
&&
! is_admin()
) { // Stop caching in admin UI.
return 4 === (int) $cached_count;
}
global $wpdb;
$exp = "'^" . $wpdb->prefix . "actionscheduler_(logs|actions|groups|claims)$'";
// phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery,WordPress.DB.DirectDatabaseQuery.NoCaching
$found_as_tables = $wpdb->get_col(
// phpcs:ignore WordPress.DB.PreparedSQL.NotPrepared
$wpdb->prepare( 'SHOW TABLES FROM `' . DB_NAME . '` WHERE `Tables_in_' . DB_NAME . '` LIKE %s AND `Tables_in_' . DB_NAME . '` REGEXP ' . $exp, '%actionscheduler%' )
);
set_transient( 'rocket_rucss_as_tables_count', count( $found_as_tables ), rocket_get_constant( 'DAY_IN_SECONDS', 24 * 60 * 60 ) );
return 4 === count( $found_as_tables );
}
}