*/
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;
}
}