*/ namespace ThemeAtelier\Darkify\Admin; use ThemeAtelier\Darkify\Admin\TADiscountPage\TADiscountPage; use ThemeAtelier\Darkify\Admin\ReviewNotice\ReviewNotice; use ThemeAtelier\Darkify\Admin\Views\DarkifyOptions; use ThemeAtelier\Darkify\Includes\DarkifyExternalSupport; use ThemeAtelier\Darkify\Includes\DarkifyUtils; use ThemeAtelier\Darkify\Admin\DBUpdates; use ThemeAtelier\Darkify\Admin\ReviewNotice\ThemeAtelier_Offer_Banner; /** * The admin class */ class Admin { /** * The slug of this plugin. * * @since 1.0.0 * @access private * @var string $plugin_slug The slug of this plugin. */ private $plugin_slug; /** * The min of this plugin. * * @since 1.0.0 * @access private * @var string $min The slug of this plugin. */ private $min; /** * The version of this plugin. * * @since 1.0.0 * @access private * @var string $version The current version of this plugin. */ private $version; public $utils; public $settings; public $external_support; public $unique_id; private $plugin_name; /** * The class constructor. * * @param string $plugin_slug The slug of the plugin. * @param string $version Current version of the plugin. */ function __construct($plugin_slug, $version) { $this->utils = new DarkifyUtils($this); $this->external_support = new DarkifyExternalSupport($this); if (function_exists('wp_rand')) { $this->unique_id = wp_rand(); } $options = get_option('darkify'); $enable_admin_panel_dark_mode = isset($options['enable_admin_panel_dark_mode']) ? $options['enable_admin_panel_dark_mode'] : false; $this->plugin_name = $plugin_slug; $this->min = (apply_filters('darkify_dev_mode', false) || WP_DEBUG) ? '' : '.min'; if ($enable_admin_panel_dark_mode) { add_action('admin_bar_menu', array($this, 'darkify_admin_bar_switch'), 9999); add_action('admin_print_scripts', array($this, 'darkify_admin_header_script'), 1); add_action('admin_footer', array($this, 'darkify_admin_footer_script')); } add_action( 'admin_menu', array( $this, 'admin_menu' ), 10 ); add_action('after_setup_theme', array($this, 'init_components')); add_filter('autoptimize_filter_js_exclude', array($this, 'darkify_exclude_js_from_cache_plugins')); add_action('admin_init', [$this, 'load_classic_editor_scripts']); add_action('plugin_loaded', [$this, 'init']); new ReviewNotice(); new DBUpdates(); if ( ! defined( 'THEMEATELIER_OFFER_BANNER_LOADED' ) ) { define( 'THEMEATELIER_OFFER_BANNER_LOADED', true ); ThemeAtelier_Offer_Banner::instance(); } $active_plugins = get_option('active_plugins'); foreach ($active_plugins as $active_plugin) { $_temp = strpos($active_plugin, 'darkify.php'); if (false != $_temp) { add_filter('plugin_action_links_' . DARKIFY_BASENAME, array($this, 'add_plugin_action_links'), 10, 2); add_filter( 'plugin_row_meta', array( $this, 'after_darkify_row_meta' ), 10, 4 ); } } add_filter( 'admin_footer_text', array( $this, 'darkify_admin_footer' ), 1, 2 ); } public function init_components() { DarkifyOptions::options('darkify'); } public function darkify_exclude_js_from_cache_plugins($excludes) { $excludes .= ',client_main.js,client_main.min.js'; return $excludes; } public function enqueue_styles($hook) { if($hook === 'toplevel_page_darkify') { wp_enqueue_style('darkify-help-page', DARKIFY_DIR_URL . 'src/Admin/HelpPage/assets/css/help-page' . $this->min . '.css', array(), DARKIFY_VERSION, 'all'); } $options = get_option('darkify'); $enable_admin_panel_dark_mode = isset($options["enable_admin_panel_dark_mode"]) ? $options["enable_admin_panel_dark_mode"] : false; if ($enable_admin_panel_dark_mode) { if (!wp_style_is('darkify-admin-switch', 'enqueued')) { wp_enqueue_style('darkify-admin-switch', DARKIFY_DIR_URL . 'src/assets/css/client_main' . $this->min . '.css', array(), DARKIFY_VERSION, 'all'); } } // Review notice CSS wp_enqueue_style('darkify-review-notice', DARKIFY_DIR_URL . 'src/Admin/ReviewNotice/assets/css/review-notice' . $this->min . '.css', array(), DARKIFY_VERSION, 'all'); } public function enqueue_scripts($hook) { $options = get_option('darkify'); $enable_admin_panel_dark_mode = isset($options["enable_admin_panel_dark_mode"]) ? $options["enable_admin_panel_dark_mode"] : false; if ($enable_admin_panel_dark_mode) { wp_enqueue_script('darkify-admin-client-main', DARKIFY_DIR_URL . 'src/assets/js/client_main' . $this->min . '.js', array(), DARKIFY_VERSION); } if($hook === 'toplevel_page_darkify') { wp_enqueue_script('darkify-help-page', DARKIFY_DIR_URL . 'src/Admin/HelpPage/assets/js/help-page' . $this->min . '.js', array('darkify-plugins'), DARKIFY_VERSION, true); } } /* Dequeue Darkify scripts and styles on specific admin pages (e.g., MainWP pages) */ public function admin_dequeue_for_specefic_pages() { $page = isset( $_GET['page'] ) ? sanitize_text_field( wp_unslash( $_GET['page'] ) ) : ''; $dequeue_pages = array( 'mainwp_tab', 'managesites', 'ManageClients', 'CostSummary', 'InsightsOverview', 'Extensions', 'RESTAPI', 'mainwp-setup', 'ThemesManage', 'PluginsManage', 'InsightsManage', 'ManageGroups', 'UpdatesManage', 'PluginsInstall', 'PluginsAutoUpdate', 'PluginsIgnore', 'PluginsAbandoned', 'PluginsIgnoredAbandoned', 'ThemesInstall', 'ThemesAutoUpdate', 'ThemesIgnore', 'ThemesAbandoned', 'ThemesIgnoredAbandoned', 'UserBulkManage', 'UserBulkAdd', 'BulkImportUsers', 'UpdateAdminPasswords', 'PostBulkManage', 'Extensions-Mainwp-Backups', 'Extensions-Mainwp-Security', 'Extensions-Mainwp-Analytics', 'Mainwp-Monitoring', 'Extensions-Mainwp-Agency', 'Extensions-Mainwp-Administrative', 'Extensions-Mainwp-Development', 'Extensions-Mainwp-Performance', 'ClientAddNew', 'ClientImport', 'ManageCostTracker', 'CostTrackerAdd', 'AddApiKeys', ); if ( in_array( $page, $dequeue_pages, true ) ) { wp_deregister_style( 'darkify-admin-switch' ); wp_dequeue_script( 'darkify-admin-client-main' ); } } /** * Review Text. * * @param string $text text. * * @return string */ public function darkify_admin_footer( $text ) { $screen = get_current_screen(); if ( 'toplevel_page_darkify' === $screen->id ) { $text = sprintf( /* translators: 1: start strong tag, 2: close strong tag. 3: start link 4: close link */ __( 'Enjoying %1$sDarkify?%2$s Please rate us %3$sWordPress.org%4$s. Your positive feedback will help us grow more. Thank you! 😊', 'darkify' ), '', '', '★★★★★ ', '' ); } return $text; } // Plugin settings in plugin list public function add_plugin_action_links(array $links) { $new_links = array( sprintf('' . esc_html__('Settings', 'darkify') . ''), sprintf('' . esc_html__('Support', 'darkify') . ''), // sprintf('' . esc_html__('Go Pro', 'darkify') . ''), ); $links[] = sprintf( '%s', esc_html__( 'Go Pro!', 'darkify' )); return array_merge($new_links, $links); } /** * Add plugin row meta link. * * @since 2.0 * * @param array $plugin_meta . * @param string $file . * * @return array */ public function after_darkify_row_meta( $plugin_meta, $file ) { if ( DARKIFY_BASENAME === $file ) { $plugin_meta[] = '' . __( 'Live Demo', 'darkify' ) . ''; } return $plugin_meta; } public function darkify_admin_bar_switch($wp_admin_bar) { $args = array( 'parent' => 'top-secondary', 'id' => 'darkify_admin_bar_switch_container', 'meta' => array( 'class' => 'darkify_admin_bar_switch_container', 'onclick' => 'darkify_switch_trigger()', ) ); $wp_admin_bar->add_node($args); } public function darkify_admin_header_script() { include_once DarkifyUtils::darkify_locate_template('header_script.php'); } public function darkify_admin_footer_script() { include_once DarkifyUtils::darkify_locate_template('footer_script.php'); } public function admin_menu() { // global $menu, $admin_page_hooks; $capability = apply_filters( 'darkify_ui_permission', 'manage_options' ); $menu_icon = 'data:image/svg+xml;base64,' . base64_encode(' '); // This page will be under "Settings" add_menu_page( esc_html__('Darkify', 'darkify'), esc_html__('Darkify', 'darkify'), $capability, 'darkify', [$this, 'darkify_settings'], $menu_icon, 60 ); add_submenu_page( 'darkify', __( 'Upgrade To Pro! 👑', 'darkify' ), sprintf('%s', __('Upgrade To Pro! 👑', 'darkify')), 'manage_options', 'https://darkifywp.com/pricing/?utm_source=darkify_plugin&utm_medium=submenu_page&utm_campaign=regular' ); } public function darkify_settings() {} /** * Load classic editor scripts. * * @since 5.0.0 */ public function load_classic_editor_scripts() { $options = get_option('darkify'); $classic_editor_dark_mode = isset($options['classic_editor_dark_mode']) ? $options['classic_editor_dark_mode'] : ''; if (! current_user_can('edit_posts') && ! current_user_can('edit_pages')) { return; } if (get_user_option('rich_editing') !== 'true') { return; } // Bail if admin_classic_editor is not enabled. if (! wp_validate_boolean($classic_editor_dark_mode)) { return; } add_filter('mce_external_plugins', function ($plugins) { $plugins['darkify_button'] = plugins_url('src/assets/js/admin-classic-editor.js', DARKIFY_FILE); return $plugins; }); add_filter('mce_buttons', function ($buttons) { $buttons[] = 'darkify_button'; return $buttons; }); } /** * Register WP Ajax actions. */ public static function init() { $options = get_option('darkify'); $block_editor_dark_mode = isset($options['block_editor_dark_mode']) ? $options['block_editor_dark_mode'] : ''; if (is_admin() && function_exists('register_block_type') && $block_editor_dark_mode) { if ( substr($_SERVER['PHP_SELF'], '-8') == 'post.php' || substr($_SERVER['PHP_SELF'], '-12') == 'post-new.php' ) { if (self::isGutenbergActive()) { /** @var static $class */ $class = get_called_class(); add_action('enqueue_block_editor_assets', function () use ($class) { self::registerBlockType(); }); } } } } /** * Check if Block Editor is active. * * @return bool */ public static function isGutenbergActive() { // Gutenberg plugin is installed and activated. $gutenberg = !(false === has_filter('replace_editor', 'gutenberg_init')); // Block editor since 5.0. $block_editor = version_compare($GLOBALS['wp_version'], '5.0-beta', '>'); if (!$gutenberg && !$block_editor) { return false; } if (self::isClassicEditorPluginActive()) { $editor_option = get_option('classic-editor-replace'); $block_editor_active = array('no-replace', 'block'); return in_array($editor_option, $block_editor_active, true); } // Fix for conflict with Avada - Fusion builder and gutenberg blocks // Fix for Gutenberg blocks when Avada's post/page types are disabled if (class_exists('FusionBuilder') && !(isset($_GET['gutenberg-editor']))) { $postTypes = \FusionBuilder::allowed_post_types(); return count(array_intersect(['page', 'post'], $postTypes)) < 2; } // Fix for conflict with WooCommerce product page if (class_exists('WooCommerce') && (isset($_GET['post_type'])) && ($_GET['post_type']) == "product") { return false; } // Fix for conflict with Disable Gutenberg plugin if (class_exists('DisableGutenberg')) { return false; } return true; } /** * Check if Classic Editor plugin is active * * @return bool */ public static function isClassicEditorPluginActive() { if (!function_exists('is_plugin_active')) { include_once ABSPATH . 'wp-admin/includes/plugin.php'; } if (is_plugin_active('classic-editor/classic-editor.php')) { return true; } return false; } /** * Register block for gutenberg */ public static function registerBlockType() { wp_enqueue_script( 'darkify-gutenberg-block', plugins_url('src/assets/js/admin-gutenberg-block.js', DARKIFY_FILE), array('wp-blocks', 'wp-components', 'wp-element', 'wp-editor') ); wp_localize_script( 'darkify-gutenberg-block', 'darkify', array( 'title' => 'Darkify', 'description' => 'Darkify dark mode plugin.', 'data' => self::getAllTablesAndChartsForPageBuilders('gutenberg', 'charts') ) ); } /** * Helper function for getting all tables and charts from the database for page builders * * @param $builder * @param $type * * @return array */ public static function getAllTablesAndChartsForPageBuilders($builder, $type) { $selectedType = substr($type, 0, -1); global $wpdb; $returnData = []; $table_name = $wpdb->prefix . 'wpdata' . $type; // Check whether the table exists to avoid DB errors when the related plugin/table is absent. $table_exists = $wpdb->get_var( $wpdb->prepare( "SHOW TABLES LIKE %s", $table_name ) ); if ( ! $table_exists ) { return $returnData; } $query = "SELECT id, title FROM {$table_name} ORDER BY id"; $allItems = $wpdb->get_results( $query, ARRAY_A ); if ($builder === 'avada' || $builder === 'elementor' || $builder === 'divi') { $returnData[0] = esc_attr__('Select a ' . $selectedType, 'darkify'); } else if ($builder === 'bakery') { $returnData[__('Select a ' . $selectedType, 'darkify')] = ''; } if ($allItems != null) { foreach ($allItems as $item) { switch ($builder) { case 'gutenberg': $returnData[] = [ 'name' => $item['title'], 'id' => $item['id'], ]; break; case 'avada': case 'elementor': case 'divi': $returnData[$item['id']] = $item['title'] . ' (id: ' . $item['id'] . ')'; break; case 'bakery': $returnData[$item['title']] = $item['id']; break; } } } return $returnData; } }