settings = get_option('adminbarnova_settings', $this->get_default_settings()); // Hook into WordPress add_action('init', array($this, 'load_textdomain')); add_action('admin_menu', array($this, 'add_admin_menu')); add_action('admin_enqueue_scripts', array($this, 'enqueue_admin_scripts')); add_action('wp_enqueue_scripts', array($this, 'enqueue_frontend_scripts')); // Admin bar control add_action('template_redirect', array($this, 'control_admin_bar')); add_action('wp_before_admin_bar_render', array($this, 'modify_admin_bar'), 999); add_action('admin_bar_menu', array($this, 'add_custom_admin_bar_items'), 999); // AJAX handlers add_action('wp_ajax_adminbarnova_save_settings', array($this, 'ajax_save_settings')); add_action('wp_ajax_adminbarnova_reset_settings', array($this, 'ajax_reset_settings')); add_action('wp_ajax_adminbarnova_export_settings', array($this, 'ajax_export_settings')); add_action('wp_ajax_adminbarnova_import_settings', array($this, 'ajax_import_settings')); // Register activation/deactivation hooks register_activation_hook(ADMINBARNOVA_FILE, array($this, 'activate')); register_deactivation_hook(ADMINBARNOVA_FILE, array($this, 'deactivate')); // Custom styling add_action('wp_head', array($this, 'custom_admin_bar_styles')); add_action('admin_head', array($this, 'custom_admin_bar_styles')); // Add settings link add_filter('plugin_action_links', [$this, 'adminbarnova_settings_link'], 10, 2); /** * Summary of adminbarnova_activation_redirect * @param mixed $plugin */ add_action('activated_plugin', function ($plugin) { if (plugin_basename(ADMINBARNOVA_FILE) == $plugin) { wp_safe_redirect(admin_url('admin.php?page=adminbarnova')); die(); } }); } /** * Summary of adminbarnova_settings_link * @param mixed $plugin_actions * @param mixed $plugin_file */ public function adminbarnova_settings_link($plugin_actions, $plugin_file) { $new_actions = array(); if (plugin_basename(ADMINBARNOVA_FILE) === $plugin_file) { $new_actions['adminbarnova_settings'] = sprintf('%s', esc_url(admin_url('admin.php?page=adminbarnova')), __('Settings', 'adminbarnova')); } return array_merge($new_actions, $plugin_actions); } /** * Get default settings */ private function get_default_settings() { return array( 'enable_plugin' => true, 'default_visibility' => 'show', 'hide_by_roles' => array(), 'hide_by_users' => array(), 'device_targeting' => array( 'desktop' => true, 'tablet' => true, 'mobile' => true ), 'time_schedule' => array( 'enabled' => false, 'start_time' => '', 'end_time' => '', 'days' => array() ), 'hide_menu_items' => array(), 'custom_style' => array( 'enabled' => false, 'background_color' => '#23282d', 'text_color' => '#eee', 'hover_color' => '#32373c', 'logo_image' => '', 'branding_text' => 'AdminBarNova' ) ); } /** * Load text domain */ public function load_textdomain() { load_plugin_textdomain('adminbarnova', false, dirname(plugin_basename(ADMINBARNOVA_FILE)) . '/languages'); } /** * Plugin activation */ public function activate() { if (!get_option('adminbarnova_settings')) { add_option('adminbarnova_settings', $this->get_default_settings()); } } /** * Plugin deactivation */ public function deactivate() { // Clean up if needed } /** * Add admin menu */ public function add_admin_menu() { add_menu_page( __('AdminBarNova', 'adminbarnova'), __('AdminBarNova', 'adminbarnova'), 'manage_options', 'adminbarnova', array($this, 'render_admin_page'), 'dashicons-visibility', 30 ); } /** * Enqueue admin scripts */ public function enqueue_admin_scripts($hook) { if ('toplevel_page_adminbarnova' !== $hook) { return; } wp_enqueue_style('wp-color-picker'); wp_enqueue_style('adminbarnova-admin', ADMINBARNOVA_ASSETS . '/css/admin.css', array(), ADMINBARNOVA_VERSION); wp_enqueue_style('font-awesome', 'https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css'); wp_enqueue_media(); wp_enqueue_script('wp-color-picker'); wp_enqueue_script('adminbarnova-admin', ADMINBARNOVA_ASSETS . '/js/admin.js', array('jquery', 'wp-color-picker'), ADMINBARNOVA_VERSION, true); wp_enqueue_script('adminbarnova-chart', 'https://cdn.jsdelivr.net/npm/chart.js', array(), '3.9.1', true); // Get statistics for chart $stats = $this->get_statistics(); wp_localize_script('adminbarnova-admin', 'adminbarnova_ajax', array( 'ajax_url' => admin_url('admin-ajax.php'), 'nonce' => wp_create_nonce('adminbarnova_nonce'), 'stats' => array( 'visible' => max(0, $stats['total_users'] - $stats['hidden_by_role'] - $stats['hidden_by_user']), 'hidden_by_role' => $stats['hidden_by_role'], 'hidden_by_user' => $stats['hidden_by_user'], 'hidden_items' => $stats['hidden_items'] ), 'i18n' => array( 'confirm_reset' => __('Are you sure you want to reset all settings?', 'adminbarnova'), 'confirm_import' => __('Importing will overwrite all current settings. Are you sure?', 'adminbarnova'), 'saving' => __('Saving...', 'adminbarnova'), 'saved' => __('Settings saved successfully!', 'adminbarnova'), 'error' => __('An error occurred. Please try again.', 'adminbarnova'), 'save' => __('Save Settings', 'adminbarnova'), 'exporting' => __('Exporting...', 'adminbarnova'), 'importing' => __('Importing...', 'adminbarnova'), 'import_success' => __('Settings imported successfully!', 'adminbarnova'), 'export_success' => __('Settings exported successfully!', 'adminbarnova'), 'invalid_file' => __('Invalid file format. Please upload a valid JSON file.', 'adminbarnova'), 'no_file' => __('Please select a file to import.', 'adminbarnova') ) )); } /** * Enqueue frontend scripts */ public function enqueue_frontend_scripts() { if (is_admin_bar_showing()) { wp_enqueue_style('adminbarnova-frontend', ADMINBARNOVA_ASSETS . '/css/frontend.css', array(), ADMINBARNOVA_VERSION); } } /** * Control admin bar visibility */ public function control_admin_bar() { if (is_admin() || !is_user_logged_in()) { return; } if (!$this->settings['enable_plugin']) { return; } $user_id = get_current_user_id(); $user = wp_get_current_user(); $roles = $user->roles; // Check default visibility if ($this->settings['default_visibility'] === 'hide') { $this->hide_admin_bar(); return; } // Check device targeting if (!$this->check_device_targeting()) { $this->hide_admin_bar(); return; } // Check time schedule if ($this->settings['time_schedule']['enabled'] && !$this->check_time_schedule()) { $this->hide_admin_bar(); return; } // Check user role visibility foreach ($roles as $role) { if (in_array($role, $this->settings['hide_by_roles'])) { $this->hide_admin_bar(); return; } } // Check specific user visibility if (in_array($user_id, $this->settings['hide_by_users'])) { $this->hide_admin_bar(); return; } } /** * Hide admin bar */ private function hide_admin_bar() { add_filter('show_admin_bar', '__return_false'); add_action('wp_head', function () { echo ''; }); } /** * Check device targeting */ private function check_device_targeting() { $device = $this->get_device_type(); $targeting = $this->settings['device_targeting']; switch ($device) { case 'desktop': return isset($targeting['desktop']) && $targeting['desktop']; case 'tablet': return isset($targeting['tablet']) && $targeting['tablet']; case 'mobile': return isset($targeting['mobile']) && $targeting['mobile']; default: return true; } } /** * Get device type */ private function get_device_type() { $user_agent = $_SERVER['HTTP_USER_AGENT']; $tablet_pattern = '/(tablet|ipad|playbook|kindle|silk)/i'; $mobile_pattern = '/(mobile|android|iphone|ipod|blackberry|windows phone)/i'; if (preg_match($tablet_pattern, $user_agent)) { return 'tablet'; } elseif (preg_match($mobile_pattern, $user_agent)) { return 'mobile'; } else { return 'desktop'; } } /** * Check time schedule */ private function check_time_schedule() { $schedule = $this->settings['time_schedule']; if (!$schedule['enabled']) { return true; } $current_time = current_time('timestamp'); $current_day = strtolower(date('l', $current_time)); // Check day if (!empty($schedule['days']) && !in_array($current_day, $schedule['days'])) { return true; // Show bar if day not in schedule } // Check time range if (!empty($schedule['start_time']) && !empty($schedule['end_time'])) { $current_hour = date('H:i', $current_time); $start_time = $schedule['start_time']; $end_time = $schedule['end_time']; if ($current_hour >= $start_time && $current_hour <= $end_time) { return false; // Hide during scheduled time } } return true; } /** * Modify admin bar items */ public function modify_admin_bar() { global $wp_admin_bar; if (!is_user_logged_in() || !is_object($wp_admin_bar)) { return; } // Hide specific menu items $hide_items = $this->settings['hide_menu_items']; foreach ($hide_items as $item) { $wp_admin_bar->remove_node($item); } } /** * Add custom admin bar items */ public function add_custom_admin_bar_items($wp_admin_bar) { if (!is_user_logged_in() || !$this->settings['custom_style']['enabled']) { return; } $branding = $this->settings['custom_style']['branding_text']; $logo = $this->settings['custom_style']['logo_image']; if ($logo) { $wp_admin_bar->add_node(array( 'id' => 'adminbarnova-branding', 'title' => '' . esc_html($branding), 'href' => home_url(), 'meta' => array( 'class' => 'adminbarnova-branding' ) )); } } /** * Custom admin bar styles */ public function custom_admin_bar_styles() { if (!is_user_logged_in()) { return; } $style = $this->settings['custom_style']; if (!$style['enabled']) { return; } $css = ''; echo $css; } /** * AJAX Save Settings */ public function ajax_save_settings() { // Verify nonce if (!isset($_POST['nonce']) || !wp_verify_nonce($_POST['nonce'], 'adminbarnova_nonce')) { wp_send_json_error(array('message' => __('Security check failed.', 'adminbarnova'))); } if (!current_user_can('manage_options')) { wp_send_json_error(array('message' => __('You do not have sufficient permissions.', 'adminbarnova'))); } if (!isset($_POST['settings']) || !is_array($_POST['settings'])) { wp_send_json_error(array('message' => __('Invalid settings data.', 'adminbarnova'))); } $settings = $this->sanitize_settings($_POST['settings']); update_option('adminbarnova_settings', $settings); $this->settings = $settings; wp_send_json_success(array( 'message' => __('Settings saved successfully!', 'adminbarnova') )); } /** * AJAX Reset Settings */ public function ajax_reset_settings() { // Verify nonce if (!isset($_POST['nonce']) || !wp_verify_nonce($_POST['nonce'], 'adminbarnova_nonce')) { wp_send_json_error(array('message' => __('Security check failed.', 'adminbarnova'))); } if (!current_user_can('manage_options')) { wp_send_json_error(array('message' => __('You do not have sufficient permissions.', 'adminbarnova'))); } $defaults = $this->get_default_settings(); update_option('adminbarnova_settings', $defaults); $this->settings = $defaults; wp_send_json_success(array( 'message' => __('Settings reset successfully!', 'adminbarnova') )); } /** * AJAX Export Settings */ public function ajax_export_settings() { // Verify nonce if (!isset($_POST['nonce']) || !wp_verify_nonce($_POST['nonce'], 'adminbarnova_nonce')) { wp_send_json_error(array('message' => __('Security check failed.', 'adminbarnova'))); } if (!current_user_can('manage_options')) { wp_send_json_error(array('message' => __('You do not have sufficient permissions.', 'adminbarnova'))); } $settings = get_option('adminbarnova_settings', $this->get_default_settings()); // Add export metadata $export_data = array( 'plugin' => 'AdminBarNova', 'version' => ADMINBARNOVA_VERSION, 'export_date' => current_time('mysql'), 'site_url' => home_url(), 'settings' => $settings ); wp_send_json_success(array( 'data' => json_encode($export_data, JSON_PRETTY_PRINT), 'filename' => 'adminbarnova-settings-' . date('Y-m-d') . '.json' )); } /** * AJAX Import Settings */ public function ajax_import_settings() { // Verify nonce if (!isset($_POST['nonce']) || !wp_verify_nonce($_POST['nonce'], 'adminbarnova_nonce')) { wp_send_json_error(array('message' => __('Security check failed.', 'adminbarnova'))); } if (!current_user_can('manage_options')) { wp_send_json_error(array('message' => __('You do not have sufficient permissions.', 'adminbarnova'))); } if (!isset($_POST['import_data']) || empty($_POST['import_data'])) { wp_send_json_error(array('message' => __('No import data provided.', 'adminbarnova'))); } $import_data = json_decode(stripslashes($_POST['import_data']), true); if (json_last_error() !== JSON_ERROR_NONE) { wp_send_json_error(array('message' => __('Invalid JSON data.', 'adminbarnova'))); } // Validate import data if (!isset($import_data['settings']) || !is_array($import_data['settings'])) { wp_send_json_error(array('message' => __('Invalid import data structure.', 'adminbarnova'))); } // Check if it's a valid AdminBarNova export if (!isset($import_data['plugin']) || $import_data['plugin'] !== 'AdminBarNova') { wp_send_json_error(array('message' => __('This file was not exported from AdminBarNova.', 'adminbarnova'))); } $settings = $this->sanitize_settings($import_data['settings']); update_option('adminbarnova_settings', $settings); $this->settings = $settings; wp_send_json_success(array( 'message' => __('Settings imported successfully!', 'adminbarnova') )); } /** * Sanitize settings */ private function sanitize_settings($settings) { $sanitized = array(); // General settings $sanitized['enable_plugin'] = isset($settings['enable_plugin']) ? (bool)$settings['enable_plugin'] : true; $sanitized['default_visibility'] = isset($settings['default_visibility']) ? sanitize_text_field($settings['default_visibility']) : 'show'; // Roles $sanitized['hide_by_roles'] = isset($settings['hide_by_roles']) ? array_map('sanitize_text_field', (array)$settings['hide_by_roles']) : array(); // Users $sanitized['hide_by_users'] = isset($settings['hide_by_users']) ? array_map('intval', (array)$settings['hide_by_users']) : array(); // Device targeting $sanitized['device_targeting'] = array( 'desktop' => isset($settings['device_targeting']['desktop']) ? (bool)$settings['device_targeting']['desktop'] : false, 'tablet' => isset($settings['device_targeting']['tablet']) ? (bool)$settings['device_targeting']['tablet'] : false, 'mobile' => isset($settings['device_targeting']['mobile']) ? (bool)$settings['device_targeting']['mobile'] : false ); // Time schedule $sanitized['time_schedule'] = array( 'enabled' => isset($settings['time_schedule']['enabled']) ? (bool)$settings['time_schedule']['enabled'] : false, 'start_time' => isset($settings['time_schedule']['start_time']) ? sanitize_text_field($settings['time_schedule']['start_time']) : '', 'end_time' => isset($settings['time_schedule']['end_time']) ? sanitize_text_field($settings['time_schedule']['end_time']) : '', 'days' => isset($settings['time_schedule']['days']) ? array_map('sanitize_text_field', (array)$settings['time_schedule']['days']) : array() ); // Menu items $sanitized['hide_menu_items'] = isset($settings['hide_menu_items']) ? array_map('sanitize_text_field', (array)$settings['hide_menu_items']) : array(); // Custom styling $sanitized['custom_style'] = array( 'enabled' => isset($settings['custom_style']['enabled']) ? (bool)$settings['custom_style']['enabled'] : false, 'background_color' => isset($settings['custom_style']['background_color']) ? sanitize_hex_color($settings['custom_style']['background_color']) : '#23282d', 'text_color' => isset($settings['custom_style']['text_color']) ? sanitize_hex_color($settings['custom_style']['text_color']) : '#eee', 'hover_color' => isset($settings['custom_style']['hover_color']) ? sanitize_hex_color($settings['custom_style']['hover_color']) : '#32373c', 'logo_image' => isset($settings['custom_style']['logo_image']) ? esc_url_raw($settings['custom_style']['logo_image']) : '', 'branding_text' => isset($settings['custom_style']['branding_text']) ? sanitize_text_field($settings['custom_style']['branding_text']) : 'AdminBarNova' ); return $sanitized; } /** * Render admin page */ public function render_admin_page() { $settings = $this->settings; $stats = $this->get_statistics(); ?>
AdminBarNova

v

get_names(); $hidden_roles = $settings['hide_by_roles'] ?? array(); foreach ($roles as $role_key => $role_name): ?>

array('icon' => 'desktop', 'label' => __('Desktop', 'adminbarnova')), 'tablet' => array('icon' => 'tablet-alt', 'label' => __('Tablet', 'adminbarnova')), 'mobile' => array('icon' => 'mobile-alt', 'label' => __('Mobile', 'adminbarnova')) ); $targeting = $settings['device_targeting'] ?? array(); foreach ($devices as $key => $device): ?>

array('icon' => 'wordpress', 'label' => __('WordPress Logo', 'adminbarnova')), 'site-name' => array('icon' => 'home', 'label' => __('Site Name', 'adminbarnova')), 'updates' => array('icon' => 'sync-alt', 'label' => __('Updates', 'adminbarnova')), 'comments' => array('icon' => 'comments', 'label' => __('Comments', 'adminbarnova')), 'new-content' => array('icon' => 'plus-circle', 'label' => __('New Content', 'adminbarnova')), 'search' => array('icon' => 'search', 'label' => __('Search', 'adminbarnova')), 'customize' => array('icon' => 'paint-brush', 'label' => __('Customize', 'adminbarnova')), 'my-account' => array('icon' => 'user', 'label' => __('My Account', 'adminbarnova')), 'user-info' => array('icon' => 'user-circle', 'label' => __('User Info', 'adminbarnova')), 'logout' => array('icon' => 'sign-out-alt', 'label' => __('Logout', 'adminbarnova')) ); $hidden_items = $settings['hide_menu_items'] ?? array(); foreach ($menu_items as $key => $item): ?>

Logo Preview

count(get_users()), 'hidden_by_role' => count($this->settings['hide_by_roles'] ?? array()), 'hidden_by_user' => count($this->settings['hide_by_users'] ?? array()), 'hidden_items' => count($this->settings['hide_menu_items'] ?? array()) ); } } // Initialize the plugin AdminBarNova_Plugin::get_instance();