File "class-setup.php"

Full Path: /home/rrterraplen/public_html/wp-content-20241221212636/plugins/ultimate-dashboard-pro/class-setup.php
File size: 11.12 KB
MIME-type: text/x-php
Charset: utf-8

<?php
/**
 * Setup Ultimate Dashboard PRO plugin.
 *
 * @package Ultimate_Dashboard_Pro
 */

namespace UdbPro;

defined( 'ABSPATH' ) || die( "Can't access directly" );

use UdbPro\Helpers\Content_Helper;
use UdbPro\Helpers\Multisite_Helper;

/**
 * Class to setup Ultimate Dashboard PRO plugin.
 */
class Setup {

	/**
	 * The class instanace
	 *
	 * @var object
	 */
	public static $instance = null;

	/**
	 * Get the class instance.
	 *
	 * @return object
	 */
	public static function get_instance() {
		if ( null === self::$instance ) {
			self::$instance = new self();
		}

		return self::$instance;
	}

	/**
	 * Init the class setup.
	 */
	public static function init() {

		add_action( 'plugins_loaded', array( self::get_instance(), 'setup' ) );

	}

	/**
	 * Setup the class.
	 */
	public function setup() {

		$blueprint = get_site_option( 'udb_multisite_blueprint' );

		// Declare glolbal variables.
		$GLOBALS['blueprint'] = $blueprint ? (int) $blueprint : 0;

		// Enable multisite support.
		add_filter( 'udb_pro_ms_support', '__return_true' );

		require __DIR__ . '/helpers/class-multisite-helper.php';
		register_deactivation_hook( ULTIMATE_DASHBOARD_PRO_PLUGIN_FILE, array( $this, 'deactivation' ) );

		// Check whether Ultimate Dashboard free active status & version.
		if ( ! defined( 'ULTIMATE_DASHBOARD_PLUGIN_VERSION' ) || version_compare( ULTIMATE_DASHBOARD_PLUGIN_VERSION, '3.0', '<' ) ) {

			require __DIR__ . '/modules/instant-install/class-instant-install-module.php';
			InstantInstall\Instant_Install_Module::init();

			// Stop if Ultimate Dashboard free is not active or it's version is lower than 3.0.
			return;

		}

		$this->load_helpers();
		Backwards_Compatibility::init();

		add_action( 'init', array( $this, 'load_textdomain' ) );

		$prefix = is_network_admin() ? 'network_admin_' : '';
		add_filter( $prefix . 'plugin_action_links_' . ULTIMATE_DASHBOARD_PRO_PLUGIN_FILE, array( $this, 'action_links' ) );

		add_action( 'init', array( self::get_instance(), 'check_activation_meta' ) );
		add_filter( 'admin_body_class', array( $this, 'admin_body_class' ), 30 );

		// Pro version filters.
		add_filter( 'udb_saved_modules', array( $this, 'saved_modules' ) );
		add_filter( 'udb_modules', array( $this, 'load_modules' ) );
		add_filter( 'udb_content_editor', array( $this, 'get_content_editor' ), 10, 2 );

	}

	/**
	 * Load Ultimate Dashboard Pro helper classes.
	 *
	 * Note: the multisite helper has been loaded in the setup method above
	 * because it will be used as part of plugin de-activation process.
	 */
	public function load_helpers() {

		require __DIR__ . '/helpers/class-video-helper.php';
		require __DIR__ . '/helpers/class-content-helper.php';
		require __DIR__ . '/helpers/class-widget-helper.php';
		require __DIR__ . '/helpers/class-branding-helper.php';
		require __DIR__ . '/helpers/class-placeholder-helper.php';

	}

	/**
	 * Load textdomain.
	 */
	public function load_textdomain() {
		load_plugin_textdomain( 'ultimatedashboard', false, plugin_basename( dirname( __FILE__ ) ) . '/languages' );
	}

	/**
	 * Add action links displayed in plugins page.
	 *
	 * @param array $links The action links array.
	 * @return array The modified action links array.
	 */
	public function action_links( $links ) {

		$multisite_settings = array();
		$settings           = array( '<a href="' . admin_url( 'edit.php?post_type=udb_widgets&page=udb_settings' ) . '">' . __( 'Settings', 'ultimatedashboard' ) . '</a>' );

		if ( apply_filters( 'udb_pro_ms_support', false ) ) {
			$multisite_settings = is_multisite() ? array( '<a href="' . network_admin_url( 'settings.php?page=ultimate-dashboard-multisite' ) . '">' . __( 'Network Settings', 'ultimatedashboard' ) . '</a>' ) : array();
		}

		return array_merge( $links, $settings, $multisite_settings );

	}

	/**
	 * Plugin deactivation.
	 */
	public function deactivation() {

		$ms_helper = new Multisite_Helper();

		if ( $ms_helper->multisite_supported() ) {
			global $blueprint;

			$site_ids = get_sites(
				array(
					'fields' => 'ids',
				)
			);

			if ( $blueprint ) {
				// When blueprint is set, we get the data removal option from the blueprint site only.
				$settings    = get_blog_option( $blueprint, 'udb_settings', array() );
				$remove_data = isset( $settings['remove-on-uninstall'] ) ? true : false;

				if ( $remove_data ) {
					foreach ( $site_ids as $site_id ) {
						$this->delete_udb_pro_data( $site_id );
					}
				}
			} else {
				// When blueprint is not set, we check the data removal option per-site id.
				foreach ( $site_ids as $site_id ) {
					$settings    = get_blog_option( $site_id, 'udb_settings', array() );
					$remove_data = isset( $settings['remove-on-uninstall'] ) ? true : false;

					if ( $remove_data ) {
						$this->delete_udb_pro_data( $site_id );
					}
				}
			}
		} else {
			$settings    = get_option( 'udb_settings' );
			$remove_data = isset( $settings['remove-on-uninstall'] ) ? true : false;

			if ( $remove_data ) {
				$this->delete_udb_pro_data();
			}
		}

	}

	/**
	 * Delete pro-related options on plugin deactivation.
	 *
	 * But `udb_multisite_blueprint` won't be deleted on both free & pro versions deactivation.
	 * So that it wouldn't be a problem if user deactivate free version first or pro version first.
	 * Both versions will be able to get the blueprint value.
	 *
	 * So yea, `udb_multisite_blueprint` will stays in the database.
	 *
	 * @param int|null $site_id The site id or null.
	 */
	public function delete_udb_pro_data( $site_id = null ) {

		if ( $site_id ) {
			delete_blog_option( $site_id, 'udb_admin_menu' );
			delete_blog_option( $site_id, 'udb_admin_bar' );

			delete_blog_option( $site_id, 'udb_compat_branding_meta' );

			delete_blog_option( $site_id, 'udb_pro_widget_order' );
			delete_blog_option( $site_id, 'udb_multisite_exclude' );
			delete_blog_option( $site_id, 'udb_multisite_widget_order' );
			delete_blog_option( $site_id, 'udb_multisite_capability' );

			delete_blog_option( $site_id, 'udb_pro_site_url' );
			delete_blog_option( $site_id, 'udb_pro_plugin_activated' );

			// In case free version was deactivated first, we need to delete the restored settings option.
			if ( ! defined( 'ULTIMATE_DASHBOARD_PLUGIN_VERSION' ) ) {
				delete_blog_option( $site_id, 'udb_settings' );
			}
		} else {
			delete_option( 'udb_admin_menu' );
			delete_option( 'udb_admin_bar' );

			delete_option( 'udb_compat_branding_meta' );

			delete_option( 'udb_pro_widget_order' );
			delete_option( 'udb_multisite_exclude' );
			delete_option( 'udb_multisite_widget_order' );
			delete_option( 'udb_multisite_capability' );

			delete_option( 'udb_pro_site_url' );
			delete_option( 'udb_pro_plugin_activated' );

			// In case free version was deactivated first, we need to delete the restored settings option.
			if ( ! defined( 'ULTIMATE_DASHBOARD_PLUGIN_VERSION' ) ) {
				delete_option( 'udb_settings' );
			}
		}

	}

	/**
	 * Check plugin activation meta.
	 */
	public function check_activation_meta() {

		if ( ! current_user_can( 'activate_plugins' ) || get_option( 'udb_pro_plugin_activated' ) ) {
			return;
		}

		update_option( 'udb_pro_site_url', $_SERVER['SERVER_NAME'] );
		update_option( 'udb_pro_plugin_activated', 1 );

	}

	/**
	 * Admin body class.
	 *
	 * @param string $classes The class names.
	 */
	public function admin_body_class( $classes ) {

		$ms_helper = new Multisite_Helper();

		if ( ! $ms_helper->multisite_supported() ) {
			return $classes;
		}

		if ( is_network_admin() ) {
			$classes .= ' udb-is-network-admin';
		}

		if ( is_main_site() ) {
			$classes .= ' udb-is-main-site';
		} else {
			$classes .= ' udb-is-subsite';
		}

		$classes .= ' udb-site-' . get_current_blog_id();

		return $classes;

	}

	/**
	 * Filter the "get_content_editor" value of Content_Helper class in the free version.
	 *
	 * @param string $editor The editor name from free version.
	 * @param int    $post_id ID of the post being checked.
	 *
	 * @return string The content editor name from pro version.
	 */
	public function get_content_editor( $editor, $post_id ) {

		$content_helper = new Content_Helper();
		return $content_helper->get_content_editor( $post_id );

	}

	/**
	 * Get saved/default modules.
	 *
	 * Helper function, similar to what we have in the free version but with multisite support in mind.
	 * Also used to filter "udb_saved_modules" in the free version.
	 *
	 * @return array The saved/default modules.
	 */
	public function saved_modules() {

		$defaults = array(
			'white_label'       => 'true',
			'login_customizer'  => 'true',
			'login_redirect'    => 'true',
			'admin_pages'       => 'true',
			'admin_menu_editor' => 'true',
			'admin_bar_editor'  => 'true',
		);

		$saved_modules = get_option( 'udb_modules', $defaults );

		$ms_helper = new Helpers\Multisite_Helper();

		if ( $ms_helper->needs_to_switch_blog() ) {
			global $blueprint;

			// If we need to switch blog, let's grab udb_modules from the blueprint.
			$saved_modules = get_blog_option( $blueprint, 'udb_modules', $defaults );
		}

		return $saved_modules;

	}

	/**
	 * Load Ultimate Dashboard Pro modules.
	 *
	 * @param array $modules The modules being loaded.
	 * @return array $modules The modules being loaded.
	 */
	public function load_modules( $modules ) {

		$modules['UdbPro\\Widget\\Widget_Module']   = __DIR__ . '/modules/widget/class-widget-module.php';
		$modules['UdbPro\\Setting\\Setting_Module'] = __DIR__ . '/modules/setting/class-setting-module.php';

		$saved_modules = $this->saved_modules();

		if ( isset( $saved_modules['white_label'] ) && 'true' === $saved_modules['white_label'] ) {
			$modules['UdbPro\\Branding\\Branding_Module'] = __DIR__ . '/modules/branding/class-branding-module.php';
		}

		if ( isset( $saved_modules['login_customizer'] ) && 'true' === $saved_modules['login_customizer'] ) {
			$modules['UdbPro\\LoginCustomizer\\Login_Customizer_Module'] = __DIR__ . '/modules/login-customizer/class-login-customizer-module.php';
		}

		if ( isset( $saved_modules['login_redirect'] ) && 'true' === $saved_modules['login_redirect'] ) {
			$modules['UdbPro\\LoginRedirect\\Login_Redirect_Module'] = __DIR__ . '/modules/login-redirect/class-login-redirect-module.php';
		}

		if ( isset( $saved_modules['admin_pages'] ) && 'true' === $saved_modules['admin_pages'] ) {
			$modules['UdbPro\\AdminPage\\Admin_Page_Module'] = __DIR__ . '/modules/admin-page/class-admin-page-module.php';
		}

		if ( isset( $saved_modules['admin_menu_editor'] ) && 'true' === $saved_modules['admin_menu_editor'] ) {
			$modules['UdbPro\\AdminMenu\\Admin_Menu_Module'] = __DIR__ . '/modules/admin-menu/class-admin-menu-module.php';
		}

		if ( version_compare( ULTIMATE_DASHBOARD_PLUGIN_VERSION, '3.2.1', '>' ) ) {
			if ( 'true' === $saved_modules['admin_bar_editor'] ) {
				$modules['UdbPro\\AdminBar\\Admin_Bar_Module'] = __DIR__ . '/modules/admin-bar/class-admin-bar-module.php';
			}
		}

		$modules['UdbPro\\Tool\\Tool_Module']       = __DIR__ . '/modules/tool/class-tool-module.php';
		$modules['UdbPro\\License\\License_Module'] = __DIR__ . '/modules/license/class-license-module.php';

		$ms_helper = new Helpers\Multisite_Helper();

		if ( $ms_helper->multisite_supported() ) {
			$modules['UdbPro\\Multisite\\Multisite_Module'] = __DIR__ . '/modules/multisite/class-multisite-module.php';
		}

		return $modules;

	}

}