38217-vm/wp-content/themes/Avada/includes/lib/inc/class-fusion-patcher-checker.php
2026-02-05 17:08:59 +03:00

211 lines
4.4 KiB
PHP

<?php
/**
* The Patcher checker implementation.
*
* @package Fusion-Library
* @subpackage Fusion-Patcher
*/
/**
* Periodically checks for patches and adds admin bubbles in menu.
*
* @since 1.0.0
*/
class Fusion_Patcher_Checker {
/**
* How often to check for updates.
* (in seconds)
*
* @access private
* @since 1.0.0
* @var int
*/
private $period = DAY_IN_SECONDS;
/**
* The transient name.
*
* @static
* @access public
* @since 1.0.0
* @var string
*/
public static $transient_name = 'fusion_patcher_check_num';
/**
* An instance of the Fusion_Patcher class.
*
* @access private
* @since 1.0.0
* @var Object
*/
private $patcher = [];
/**
* The patches.
*
* @access protected
* @since 1.0.0
* @var array
*/
protected $patches = [];
/**
* The patches that have already been applied.
*
* @access protected
* @since 1.0.0
* @var array
*/
protected $applied_patches = [];
/**
* How many new patches do we have?
*
* @access protected
* @since 1.0.0
* @var int
*/
private $new_patches = 0;
/**
* Have we already checked the number of patches?
*
* @access protected
* @since 1.0.0
* @var bool
*/
private $checked = false;
/**
* Constructor.
*
* @access public
* @param object $patcher The Fusion_Patcher instance.
*/
public function __construct( $patcher ) {
$this->patcher = $patcher;
if ( $this->patcher->is_bundled() ) {
return;
}
if ( ! is_customize_preview() ) {
add_action( 'admin_enqueue_scripts', [ $this, 'admin_scripts' ] );
}
}
/**
* Adds a script to the admin footer so that counters are added in the menus.
*
* @access public
* @since 1.0.0
* @return void
*/
public function admin_scripts() {
global $fusion_library_latest_version;
wp_enqueue_script(
'fusion-patcher-checker',
FUSION_LIBRARY_URL . '/assets/min/js/general/fusion-patcher-admin-menu-notices.js',
[ 'jquery', 'underscore' ],
$fusion_library_latest_version,
true
);
$args = [
'patches' => $this->get_cache(),
'display_counter' => apply_filters( 'fusion_patches_counter', 'both' ), // Allowed values are both|top_level|sub_level|none.
'args' => [],
'patch_applied_text' => __( 'Patch Applied', 'Avada' ),
'patch_dismiss_notice_text' => __( 'Dismiss Notice', 'Avada' ),
'admin_url' => esc_url( admin_url() ),
];
$args['args'][] = $this->patcher->get_args();
wp_localize_script( 'fusion-patcher-checker', 'patcherVars', $args );
}
/**
* Get & Update the Cache.
*
* @access public
* @since 1.0.0
*/
public function get_cache() {
$cache = get_site_transient( self::$transient_name );
if ( ! is_array( $cache ) ) {
$cache = [];
}
$context = $this->patcher->get_args( 'context' );
if ( ! isset( $cache[ $context ] ) ) {
$cache[ $context ] = $this->get_new_patches_num();
set_site_transient( self::$transient_name, $cache, $this->period );
}
return $cache;
}
/**
* Check how many new patches exist.
*
* @access private
* @since 1.0.0
* @return int
*/
private function get_new_patches_num() {
$args = $this->patcher->get_args();
$bundles = $this->patcher->get_args( 'bundled' );
if ( ! $bundles ) {
$bundles = [];
}
$contexts = $bundles;
$contexts[] = $this->patcher->get_args( 'context' );
$this->patches = Fusion_Patcher_Client::get_patches( $args );
// Get an array of the already applied patches.
$this->applied_patches = get_site_option( 'fusion_applied_patches', [] );
if ( $this->checked ) {
return (int) $this->new_patches;
}
foreach ( $this->patches as $patch_id => $patch ) {
$valid_patch = false;
if ( ! isset( $patch['patch'] ) || empty( $patch['patch'] ) ) {
continue;
}
foreach ( $patch['patch'] as $file_patch ) {
if ( $valid_patch ) {
continue;
}
if ( in_array( $file_patch['context'], $contexts ) ) { // phpcs:ignore WordPress.PHP.StrictInArray.MissingTrueStrict
$valid_patch = true;
}
}
if ( $valid_patch && ! in_array( $patch_id, $this->applied_patches ) ) { // phpcs:ignore WordPress.PHP.StrictInArray.MissingTrueStrict
$this->new_patches++;
}
}
$this->checked = true;
return (int) $this->new_patches;
}
/**
* Resets the cache.
*
* @static
* @access public
* @since 1.0.0
*/
public static function reset_cache() {
delete_site_transient( self::$transient_name );
}
}