network_activated() ) { add_action( 'network_admin_menu', array( $this, 'network_admin_menu' ) ); add_action( 'network_admin_edit_admin_bar_disabler', array( $this, 'network_settings_save' ) ); } } } /** * Admin init */ public function admin_init() { register_setting( 'admin-bar-disabler-settings-group', 'admin_bar_disabler_disable_all' ); register_setting( 'admin-bar-disabler-settings-group', 'admin_bar_disabler_whitelist_roles' ); register_setting( 'admin-bar-disabler-settings-group', 'admin_bar_disabler_whitelist_caps' ); register_setting( 'admin-bar-disabler-settings-group', 'admin_bar_disabler_blacklist_roles' ); register_setting( 'admin-bar-disabler-settings-group', 'admin_bar_disabler_blacklist_caps' ); } /** * Check if plugin is network activated * * @return bool */ public function network_activated() { if ( ! function_exists( 'is_plugin_active_for_network' ) ) { $plugins = get_site_option( 'active_sitewide_plugins', array() ); if ( isset( $plugins[ plugin_basename( __FILE__ ) ] ) ) { return true; } return false; } return is_plugin_active_for_network( plugin_basename( __FILE__ ) ); } /** * Get plugin settings * * @return array */ public function get_settings( $inherit = false ) { $settings = array( 'disable_all' => (boolean) get_option( 'admin_bar_disabler_disable_all', 0 ), 'whitelist_roles' => (array) get_option( 'admin_bar_disabler_whitelist_roles', array() ), 'whitelist_caps' => get_option( 'admin_bar_disabler_whitelist_caps', '' ), 'blacklist_roles' => (array) get_option( 'admin_bar_disabler_blacklist_roles', array() ), 'blacklist_caps' => get_option( 'admin_bar_disabler_blacklist_caps', '' ), ); $settings['whitelist_roles'] = array_map( 'trim', array_unique( array_filter( $settings['whitelist_roles'] ) ) ); $settings['whitelist_caps'] = explode( ',', $settings['whitelist_caps'] ); $settings['whitelist_caps'] = array_map( 'trim', array_unique( array_filter( $settings['whitelist_caps'] ) ) ); $settings['blacklist_roles'] = array_map( 'trim', array_unique( array_filter( $settings['blacklist_roles'] ) ) ); $settings['blacklist_caps'] = explode( ',', $settings['blacklist_caps'] ); $settings['blacklist_caps'] = array_map( 'trim', array_unique( array_filter( $settings['blacklist_caps'] ) ) ); // Inherit settings from network settings if ( $inherit && is_multisite() ) { $site_settings = $this->get_site_settings(); foreach ( $site_settings as $setting => $value ) { if ( ! isset( $settings[ $setting ] ) || empty( $settings[ $setting ] ) ) { $settings[ $setting ] = $value; } } } return $settings; } /** * Get plugin settings * * @return array */ public function get_site_settings() { $settings = array( 'disable_all' => (boolean) get_site_option( 'admin_bar_disabler_disable_all', 0 ), 'whitelist_roles' => (array) get_site_option( 'admin_bar_disabler_whitelist_roles', array() ), 'whitelist_caps' => get_site_option( 'admin_bar_disabler_whitelist_caps', '' ), 'blacklist_roles' => (array) get_site_option( 'admin_bar_disabler_blacklist_roles', array() ), 'blacklist_caps' => get_site_option( 'admin_bar_disabler_blacklist_caps', '' ), ); $settings['whitelist_roles'] = array_map( 'trim', array_unique( array_filter( $settings['whitelist_roles'] ) ) ); $settings['whitelist_caps'] = explode( ',', $settings['whitelist_caps'] ); $settings['whitelist_caps'] = array_map( 'trim', array_unique( array_filter( $settings['whitelist_caps'] ) ) ); $settings['blacklist_roles'] = array_map( 'trim', array_unique( array_filter( $settings['blacklist_roles'] ) ) ); $settings['blacklist_caps'] = explode( ',', $settings['blacklist_caps'] ); $settings['blacklist_caps'] = array_map( 'trim', array_unique( array_filter( $settings['blacklist_caps'] ) ) ); return $settings; } /** * Disable admin bar based on settings * * @return bool */ public function init() { $settings = $this->get_settings( true ); if ( $settings['disable_all'] ) { return $this->disable(); } $whitelist_roles = $settings['whitelist_roles']; $user = new WP_User( get_current_user_id() ); if ( ! empty( $whitelist_roles ) ) { if ( ! is_array( $whitelist_roles ) ) { $whitelist_roles = array( $whitelist_roles ); } foreach ( $whitelist_roles as $role ) { if ( in_array( $role, $user->roles, true ) ) { return false; } } return $this->disable(); } $whitelist_caps = $settings['whitelist_caps']; if ( ! empty( $whitelist_caps ) ) { foreach ( $whitelist_caps as $cap ) { if ( $user->has_cap( $cap ) ) { return false; } } return $this->disable(); } $blacklist_roles = $settings['blacklist_roles']; if ( ! empty( $blacklist_roles ) ) { if ( ! is_array( $blacklist_roles ) ) { $blacklist_roles = array( $blacklist_roles ); } foreach ( $blacklist_roles as $role ) { if ( in_array( $role, $user->roles, true ) ) { return $this->disable(); } } } $blacklist_caps = $settings['blacklist_caps']; if ( ! empty( $blacklist_caps ) ) { foreach ( $blacklist_caps as $cap ) { if ( $user->has_cap( $cap ) ) { return $this->disable(); } } } return false; } /** * Disable admin bar * * @return bool */ public function disable() { if ( ! is_admin() ) { add_filter( 'show_admin_bar', '__return_false', 999 ); } else { // WP 3.x support remove_action( 'personal_options', '_admin_bar_preferences' ); // Disable option on user edit screen add_action( 'admin_print_styles-user-edit.php', array( $this, 'disable_personal_option' ) ); // Disable option on profile screen add_action( 'admin_print_styles-profile.php', array( $this, 'disable_personal_option' ) ); } return true; } /** * Disable personal option row for Admin Bar preferences via inline CSS */ public function disable_personal_option() { echo ''; } /** * Add menu item */ public function admin_menu() { add_options_page( __( 'Admin Bar Disabler', 'admin-bar-disabler' ), __( 'Admin Bar Disabler', 'admin-bar-disabler' ), 'manage_options', 'admin_bar_disabler', array( $this, 'settings_page', ) ); } /** * Add network menu item */ public function network_admin_menu() { add_submenu_page( 'settings.php', __( 'Admin Bar Disabler', 'admin-bar-disabler' ), __( 'Admin Bar Disabler', 'admin-bar-disabler' ), 'manage_network_options', 'admin_bar_disabler', array( $this, 'settings_page', ) ); } /** * Save network settings */ public function network_settings_save() { check_admin_referer( 'admin_bar_disabler' ); $settings = $this->get_site_settings(); foreach ( $settings as $field => $value ) { if ( isset( $_POST[ 'admin_bar_disabler_' . $field ] ) && ! empty( $_POST[ 'admin_bar_disabler_' . $field ] ) ) { update_site_option( 'admin_bar_disabler_' . $field, $_POST[ 'admin_bar_disabler_' . $field ] ); } else { delete_site_option( 'admin_bar_disabler_' . $field ); } } wp_redirect( 'settings.php?page=admin_bar_disabler&settings-updated=1' ); die(); } /** * Admin settings page */ public function settings_page() { $settings = $this->get_settings(); $is_network_admin = is_multisite() && is_network_admin(); $action = 'options.php'; if ( $is_network_admin ) { $settings = $this->get_site_settings(); $action = 'edit.php?action=admin_bar_disabler'; } global $wp_roles; if ( ! isset( $wp_roles ) ) { $wp_roles = new WP_Roles(); } $roles = $wp_roles->get_names(); if ( $is_network_admin && isset( $_GET['settings-updated'] ) ) { ?>

/>