is_themes_page() || $this->is_botiga_dashboard_page() ) { add_action('init', array($this, 'set_settings')); add_action('admin_enqueue_scripts', array($this, 'admin_enqueue_scripts')); } if( $this->is_botiga_dashboard_page() ) { add_filter( 'admin_footer_text', array( $this, 'admin_footer_text' ) ); } add_filter('woocommerce_enable_setup_wizard', '__return_false'); add_action('admin_menu', array($this, 'add_menu_page')); add_action('admin_footer', array($this, 'add_admin_footer_style')); add_action('admin_notices', array($this, 'html_notice')); add_action('wp_ajax_botiga_notifications_read', array($this, 'ajax_notifications_read')); add_action('wp_ajax_botiga_plugin', array($this, 'ajax_plugin')); add_action('wp_ajax_botiga_dismissed_handler', array($this, 'ajax_dismissed_handler')); add_action( 'wp_ajax_botiga_module_activation_handler', array( $this, 'ajax_module_activation_handler' ) ); add_action( 'wp_ajax_botiga_module_activation_all_handler', array( $this, 'ajax_module_activation_all_handler' ) ); add_action('switch_theme', array($this, 'reset_notices')); add_action('after_switch_theme', array($this, 'reset_notices')); } /** * Check if is the themes.php page * */ public function is_themes_page() { global $pagenow; return $pagenow === 'themes.php'; } /** * Check if is the theme dashboard page * */ public function is_botiga_dashboard_page() { global $pagenow; return $pagenow === 'admin.php' && ( isset( $_GET[ 'page' ] ) && $_GET[ 'page' ] === 'botiga-dashboard' ); } /** * Settings * * @param array $settings The settings. */ public function set_settings() { $this->settings = apply_filters('botiga_dashboard_settings', array()); } /** * Add menu page */ public function add_menu_page() { // Add main 'Botiga' page add_menu_page( // phpcs:ignore WPThemeReview.PluginTerritory.NoAddAdminPages.add_menu_pages_add_menu_page esc_html__('Botiga', 'botiga'), esc_html__('Botiga', 'botiga'), 'manage_options', isset( $this->settings['menu_slug'] ) ? $this->settings['menu_slug'] : 'botiga-dashboard', array($this, 'html_dashboard'), get_template_directory_uri() . '/assets/img/admin/botiga-icon.svg', 58.9 ); // Add 'Theme Dashboard' page add_submenu_page( // phpcs:ignore WPThemeReview.PluginTerritory.NoAddAdminPages.add_menu_pages_add_submenu_page 'botiga-dashboard', esc_html__('Theme Dashboard', 'botiga'), esc_html__('Theme Dashboard', 'botiga'), 'manage_options', get_admin_url() . 'admin.php?page=botiga-dashboard', '', -5 ); // Add 'Customize' link $customize_url = add_query_arg( 'return', urlencode( remove_query_arg( wp_removable_query_args(), wp_unslash( $_SERVER['REQUEST_URI'] ) ) ), 'customize.php' ); add_submenu_page( // phpcs:ignore WPThemeReview.PluginTerritory.NoAddAdminPages.add_menu_pages_add_submenu_page 'botiga-dashboard', esc_html__('Customize', 'botiga'), esc_html__('Customize', 'botiga'), 'manage_options', esc_url( $customize_url ), '', -4 ); // Add 'Starter Sites' link add_submenu_page( // phpcs:ignore WPThemeReview.PluginTerritory.NoAddAdminPages.add_menu_pages_add_submenu_page 'botiga-dashboard', esc_html__('Starter Sites', 'botiga'), esc_html__('Starter Sites', 'botiga'), 'manage_options', get_admin_url() . 'admin.php?page=botiga-dashboard&tab=starter-sites', '', -3 ); // Add 'Upgrade' link if( ! defined( 'BOTIGA_PRO_VERSION' ) ) { add_submenu_page( // phpcs:ignore WPThemeReview.PluginTerritory.NoAddAdminPages.add_menu_pages_add_submenu_page 'botiga-dashboard', esc_html__('Upgrade Botiga', 'botiga'), esc_html__('Upgrade Botiga', 'botiga'), 'manage_options', 'https://athemes.com/botiga-upgrade?utm_source=theme_submenu_page&utm_medium=button&utm_campaign=Botiga', '', -2 ); } } /** * Admin footer style. * * @return void */ public function add_admin_footer_style() { ?> admin_url('admin-ajax.php'), 'nonce' => wp_create_nonce( 'nonce-bt-dashboard' ), 'i18n' => array( 'activate' => esc_html__('Activate', 'botiga'), 'deactivate' => esc_html__('Deactivate', 'botiga'), 'installing' => esc_html__('Installing...', 'botiga'), 'activating' => esc_html__('Activating...', 'botiga'), 'deactivating' => esc_html__('Deactivating...', 'botiga'), 'redirecting' => esc_html__('Redirecting...', 'botiga'), 'activated' => esc_html__('Activated', 'botiga'), 'deactivated' => esc_html__('Deactivated', 'botiga'), 'failed_message' => esc_html__('Something went wrong, contact support.', 'botiga'), ), )); } /** * Get plugin status. * * @param string $plugin_path Plugin path. */ public function get_plugin_status($plugin_path) { if (!current_user_can('install_plugins')) { return; } if (!function_exists('is_plugin_active_for_network')) { require_once ABSPATH . 'wp-admin/includes/plugin.php'; // phpcs:ignore WPThemeReview.CoreFunctionality.FileInclude.FileIncludeFound } if (!file_exists(WP_PLUGIN_DIR . '/' . $plugin_path)) { return 'not_installed'; } elseif (in_array($plugin_path, (array) get_option('active_plugins', array()), true) || is_plugin_active_for_network($plugin_path)) { return 'active'; } else { return 'inactive'; } } /** * Get plugin data. * * @param string $plugin_path Plugin path. */ public function get_plugin_data($plugin_path) { if (!current_user_can('install_plugins')) { return; } if (!function_exists('get_plugin_data')) { require_once ABSPATH . 'wp-admin/includes/plugin.php'; // phpcs:ignore WPThemeReview.CoreFunctionality.FileInclude.FileIncludeFound } return get_plugin_data(WP_PLUGIN_DIR . '/' . $plugin_path); } /** * Install a plugin. * * @param string $plugin_slug Plugin slug. */ public function install_plugin($plugin_slug) { if (!current_user_can('install_plugins')) { return; } if (!function_exists('plugins_api')) { require_once ABSPATH . 'wp-admin/includes/plugin-install.php'; // phpcs:ignore WPThemeReview.CoreFunctionality.FileInclude.FileIncludeFound } if (!class_exists('WP_Upgrader')) { require_once ABSPATH . 'wp-admin/includes/class-wp-upgrader.php'; // phpcs:ignore WPThemeReview.CoreFunctionality.FileInclude.FileIncludeFound } if (false === filter_var($plugin_slug, FILTER_VALIDATE_URL)) { $api = plugins_api( 'plugin_information', array( 'slug' => $plugin_slug, 'fields' => array( 'short_description' => false, 'sections' => false, 'requires' => false, 'rating' => false, 'ratings' => false, 'downloaded' => false, 'last_updated' => false, 'added' => false, 'tags' => false, 'compatibility' => false, 'homepage' => false, 'donate_link' => false, ), ) ); $download_link = $api->download_link; } else { $download_link = $plugin_slug; } // Use AJAX upgrader skin instead of plugin installer skin. // ref: function wp_ajax_install_plugin(). $upgrader = new Plugin_Upgrader(new WP_Ajax_Upgrader_Skin()); $install = $upgrader->install($download_link); if (false === $install) { return false; } else { return true; } } /** * Activate a plugin. * * @param string $plugin_path Plugin path. */ public function activate_plugin($plugin_path) { if (!current_user_can('install_plugins')) { return false; } if (!function_exists('activate_plugin')) { require_once ABSPATH . 'wp-admin/includes/plugin.php'; // phpcs:ignore WPThemeReview.CoreFunctionality.FileInclude.FileIncludeFound } $activate = activate_plugin($plugin_path, '', false, true); if (is_wp_error($activate)) { return false; } else { return true; } } /** * Deactivate a plugin. * * @param string $plugin_path Plugin path. */ public function deactivate_plugin($plugin_path) { if (!current_user_can('install_plugins')) { return false; } if (!function_exists('deactivate_plugins')) { require_once ABSPATH . 'wp-admin/includes/plugin.php'; // phpcs:ignore WPThemeReview.CoreFunctionality.FileInclude.FileIncludeFound } $deactivate = deactivate_plugins($plugin_path); if (is_wp_error($deactivate)) { return false; } else { return true; } } /** * Ajax notifications. */ public function ajax_notifications_read() { check_ajax_referer( 'nonce-bt-dashboard', 'nonce' ); $latest_notification_date = ( isset( $_POST[ 'latest_notification_date' ] ) ) ? sanitize_text_field( wp_unslash( $_POST[ 'latest_notification_date' ] ) ) : false; update_user_meta( get_current_user_id(), 'botiga_dashboard_notifications_latest_read', $latest_notification_date ); wp_send_json_success(); } /** * Ajax plugin. */ public function ajax_plugin() { check_ajax_referer( 'nonce-bt-dashboard', 'nonce' ); $plugin_type = (isset($_POST['type'])) ? sanitize_text_field(wp_unslash($_POST['type'])) : ''; $plugin_slug = (isset($_POST['slug'])) ? sanitize_text_field(wp_unslash($_POST['slug'])) : ''; $plugin_path = (isset($_POST['path'])) ? sanitize_text_field(wp_unslash($_POST['path'])) : ''; if ( ! current_user_can('install_plugins') || empty($plugin_slug) || empty($plugin_type) ) { wp_send_json_error( esc_html__( 'Insufficient permissions to install the plugin.', 'botiga' ) ); } if ($plugin_type === 'install' || $plugin_type === 'activate') { if ('not_installed' === $this->get_plugin_status($plugin_path)) { $this->install_plugin($plugin_slug); $this->activate_plugin($plugin_path); } else if ('inactive' === $this->get_plugin_status($plugin_path)) { $this->activate_plugin($plugin_path); } if ('active' === $this->get_plugin_status($plugin_path)) { wp_send_json_success(); } } else if ($plugin_type === 'deactivate') { $this->deactivate_plugin($plugin_path); if ('inactive' === $this->get_plugin_status($plugin_path)) { wp_send_json_success(); } } wp_send_json_error(esc_html__('Failed to initialize or activate importer plugin.', 'botiga')); } /** * Dismissed handler */ public function ajax_dismissed_handler() { check_ajax_referer( 'nonce-bt-dashboard', 'nonce' ); if (isset($_POST['notice'])) { set_transient(sanitize_text_field(wp_unslash($_POST['notice'])), true, 0); wp_send_json_success(); } wp_send_json_error(); } /** * Purified from the database information about notification. */ public function reset_notices() { delete_transient(sprintf('%s_hero_notice', get_template())); } /** * Activate/Deactivate Module Ajax */ public function ajax_module_activation_handler() { check_ajax_referer( 'nonce-bt-dashboard', 'nonce' ); if( ! current_user_can( 'manage_options' ) ) { wp_send_json_error(); } $module = ( isset( $_POST[ 'module' ] ) ) ? sanitize_text_field( wp_unslash( $_POST['module'] ) ) : ''; $activate = ( isset( $_POST[ 'activate' ] ) ) ? sanitize_text_field( wp_unslash( $_POST['activate'] ) ) : ''; // Convert string to boolean $activate = ( $activate === 'true' ) ? true : false; if ( empty( $module ) ) { wp_send_json_error(); } $modules = get_option( 'botiga-modules', array() ); $modules[ $module ] = $activate; update_option( 'botiga-modules', $modules ); wp_send_json_success(); } /** * Activate/Deactivate All Modules Ajax */ public function ajax_module_activation_all_handler() { check_ajax_referer( 'nonce-bt-dashboard', 'nonce' ); if( ! current_user_can( 'manage_options' ) ) { wp_send_json_error(); } $activate = ( isset( $_POST[ 'activate' ] ) ) ? sanitize_text_field( wp_unslash( $_POST['activate'] ) ) : ''; // Convert string to boolean $activate = ( $activate === 'true' ) ? true : false; // Get a list with all modules id's $all_modules_ids = botiga_get_modules_ids(); // Get current modules active/disabled list $current_modules = get_option( 'botiga-modules', array() ); $modules = array(); foreach( $all_modules_ids as $module_id ) { // Skip some modules if( in_array( $module_id, array( 'hf-builder', 'schema-markup', 'adobe-typekit' ) ) ) { $modules[ $module_id ] = $current_modules[ $module_id ]; } else { $modules[ $module_id ] = $activate; } } // Update modules option update_option( 'botiga-modules', $modules ); wp_send_json_success(); } /** * Admin Footer Text */ public function admin_footer_text() { $text = sprintf( /* translators: %s: https://wordpress.org/ */ __( 'Thank you for creating the website with Botiga.', 'botiga' ), 'https://athemes.com/botiga-upgrade/' ); return $text; } /** * Check if the latest notification is read */ public function latest_notification_is_read() { if( ! isset( $this->settings[ 'notifications' ] ) || empty( $this->settings[ 'notifications' ] ) ) { return false; } $user_id = get_current_user_id(); $user_read_meta = get_user_meta( $user_id, 'botiga_dashboard_notifications_latest_read', true ); $last_notification_date = strtotime( is_string( $this->settings[ 'notifications' ][0]->post_date ) ? $this->settings[ 'notifications' ][0]->post_date : '' ); $last_notification_date_ondb = $user_read_meta ? strtotime( $user_read_meta ) : false; if( ! $last_notification_date_ondb ) { return false; } if( $last_notification_date > $last_notification_date_ondb ) { return false; } return true; } /** * HTML Dashboard */ public function html_dashboard() { $user_id = get_current_user_id(); $current_user = wp_get_current_user(); $notification_read = $this->latest_notification_is_read(); $notifications_count = 1; ?>