38217-vm/wp-content/plugins/mainwp-child/class/class-mainwp-child-db-updater-elementor.php
2026-02-05 17:08:59 +03:00

314 lines
8.6 KiB
PHP

<?php
/**
* MainWP Database Updater Elementor.
*
* @package MainWP\Child
*/
namespace MainWP\Child;
/**
* Class MainWP_Child_DB_Updater_Elementor.
*
* MainWP Database Updater extension handler.
*/
class MainWP_Child_DB_Updater_Elementor {
/**
* Public static variable to hold the single instance of the class.
*
* @var mixed Default null
*/
public static $instance = null;
/**
* Public variable to hold the infomration if the WooCommerce plugin is installed on the child site.
*
* @var bool If WooCommerce intalled, return true, if not, return false.
*/
public static $is_plugin_elementor_installed = false;
/**
* Method instance()
*
* Create a public static instance.
*
* @return mixed Class instance.
*/
public static function instance() {
if ( null === static::$instance ) {
static::$instance = new self();
}
return static::$instance;
}
/**
* Constructor.
*
* Run any time class is called.
*
* @return void
*/
public function __construct() {
require_once ABSPATH . 'wp-admin/includes/plugin.php'; // NOSONAR - WP compatible.
if ( defined( 'ELEMENTOR_VERSION' ) && is_plugin_active( 'elementor/elementor.php' ) ) {
static::$is_plugin_elementor_installed = true;
}
if ( static::$is_plugin_elementor_installed ) {
add_filter( 'mainwp_child_db_updater_sync_data', array( $this, 'hook_db_updater_sync_data' ), 10, 1 );
}
}
/**
* Get sync data.
*
* @param array $db_upgrades Input sync data.
*
* @return array $db_upgrades Return data array.
*/
public function hook_db_updater_sync_data( $db_upgrades ) {
if ( ! static::$is_plugin_elementor_installed ) {
return $db_upgrades;
}
if ( ! is_array( $db_upgrades ) ) {
$db_upgrades = array();
}
if ( $this->should_upgrade() ) {
$db_upgrades['elementor/elementor.php'] = array(
'update' => $this->get_needs_db_update(),
'Name' => 'Elementor',
'db_version' => $this->get_current_version(),
);
}
if ( static::has_pro() && $this->should_upgrade( true ) ) {
$db_upgrades['elementor-pro/elementor-pro.php'] = array(
'update' => $this->get_needs_db_update( true ),
'Name' => 'Elementor Pro',
'db_version' => $this->get_current_version( true ),
);
}
return $db_upgrades;
}
/**
* Is a DB update needed?
*
* @param bool $pro Pro version or not.
*
* @since 3.2.0
* @return boolean
*/
public function get_needs_db_update( $pro = false ) {
if ( $pro ) {
$db_versions = array(
'new_db_version' => '',
'slug' => 'elementor-pro/elementor-pro.php',
);
$new_db_version = $this->get_new_version( true );
if ( $this->should_upgrade( true ) ) {
$db_versions['new_db_version'] = $new_db_version;
}
} else {
$db_versions = array(
'new_db_version' => '',
'slug' => 'elementor/elementor.php',
);
$new_db_version = $this->get_new_version();
if ( $this->should_upgrade() ) {
$db_versions['new_db_version'] = $new_db_version;
}
}
return $db_versions;
}
/**
* Method should_upgrade().
*
* Get should upgrade.
*
* @param bool $pro Pro version or not.
*
* @return bool version compare result.
*/
public function should_upgrade( $pro = false ) {
$current_version = $this->get_current_version( $pro );
// It's a new install.
if ( ! $current_version ) {
return false;
}
return version_compare( $this->get_new_version( $pro ), $current_version, '>' );
}
/**
* Method has_pro().
*
* Has pro version.
*/
public static function has_pro() {
return defined( 'ELEMENTOR_PRO_VERSION' );
}
/**
* Method get_current_version().
*
* Get current version.
*
* @param bool $pro Pro version or not.
*
* @return string version result.
*/
public function get_current_version( $pro = false ) {
return get_option( $this->get_version_option_name( $pro ) );
}
/**
* Method get_new_version().
*
* Get new elementor version.
*
* @param bool $pro Pro version or not.
*
* @return string version result.
*/
public function get_new_version( $pro = false ) {
return $pro ? ELEMENTOR_PRO_VERSION : ELEMENTOR_VERSION;
}
/**
* Method get_version_option_name().
*
* Get version option name.
*
* @param bool $pro Pro version or not.
*
* @return string option name.
*/
public function get_version_option_name( $pro = false ) {
return $pro ? 'elementor_pro_version' : 'elementor_version';
}
/**
* Method update_db()
*
* Update Elementor DB.
*
* @param bool $pro Pro version or not.
*
* @return array Action result.
*/
public function update_db( $pro = false ) {
if ( ! static::$is_plugin_elementor_installed ) {
return false;
}
try {
return $this->do_db_upgrade( $pro );
} catch ( MainWP_Exception $e ) {
error_log( $e->getMessage() ); // phpcs:ignore
return false;
}
}
/**
* Method get_update_db_manager_class()
*
* Get update db manager class.
*
* @param bool $pro Pro version or not.
*
* @return array Action result.
*/
protected function get_update_db_manager_class( $pro = false ) {
if ( $pro ) {
return '\ElementorPro\Core\Upgrade\Manager';
}
return '\Elementor\Core\Upgrade\Manager';
}
/**
* Method do_db_upgrade()
*
* Do DB upgrade.
*
* @param bool $pro Pro version or not.
*
* @return array Action result.
*/
protected function do_db_upgrade( $pro = false ) { // phpcs:ignore -- NOSONAR - multi return.
$manager_class = $this->get_update_db_manager_class( $pro );
MainWP_Helper::instance()->check_classes_exists( array( $manager_class, '\Elementor\Plugin' ) );
// core\upgrade\manager.php.
// var \Elementor\Core\Upgrade\Manager $manager.
$manager = new $manager_class();
if ( ! $this->check_parent_method( $manager, 'get_task_runner' ) || ! $this->check_parent_method( $manager, 'should_upgrade' ) ) {
return false;
}
$updater = $manager->get_task_runner();
if ( ! $manager->should_upgrade() ) {
return true;
}
if ( ! $this->check_parent_method( $updater, 'handle_immediately' ) || ! $this->check_parent_method( $manager, 'get_upgrade_callbacks' ) || ! $this->check_parent_method( $manager, 'get_plugin_label' ) || ! $this->check_parent_method( $manager, 'get_current_version' ) || ! $this->check_parent_method( $manager, 'get_new_version' ) || ! $this->check_parent_method( $manager, 'on_runner_complete' ) ) {
return false;
}
$callbacks = $manager->get_upgrade_callbacks();
$did_tasks = false;
if ( ! empty( $callbacks ) ) {
\Elementor\Plugin::$instance->logger->get_logger()->info(
'Update DB has been started',
array(
'meta' => array(
'plugin' => $manager->get_plugin_label(),
'from' => $manager->get_current_version(),
'to' => $manager->get_new_version(),
),
)
);
$updater->handle_immediately( $callbacks );
$did_tasks = true;
}
$manager->on_runner_complete( $did_tasks );
return true;
}
/**
* Method check_parent_method().
*
* Check parent method.
*
* @param mixed $obj Object to check.
* @param string $func Function to check.
*
* @return array Action result.
*/
public function check_parent_method( $obj, $func ) {
if ( method_exists( $obj, $func ) ) {
return true;
}
$parent_cls = get_parent_class( $obj );
if ( empty( $parent_cls ) || ! method_exists( $parent_cls, $func ) ) {
return false;
}
return true;
}
}