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();
?>