diff --git a/init.php b/init.php index cafae69..baa6d79 100644 --- a/init.php +++ b/init.php @@ -3,9 +3,9 @@ * Plugin Name: Disable Users * Plugin URI: http://wordpress.org/extend/disable-users * Description: This plugin provides the ability to disable specific user accounts. - * Version: 1.0.5 - * Author: Jared Atchison - * Author URI: http://jaredatchison.com + * Version: 1.1.2 + * Author: Jared Atchison, Stephen Schrauger + * Author URI: http://jaredatchison.com * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -17,8 +17,8 @@ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * - * @author Jared Atchison - * @version 1.0.5 + * @author Jared Atchison, Stephen Schrauger + * @version 1.1.2 * @package JA_DisableUsers * @copyright Copyright (c) 2015, Jared Atchison * @link http://jaredatchison.com @@ -42,11 +42,29 @@ function __construct() { add_action( 'edit_user_profile_update', array( $this, 'user_profile_field_save' ) ); add_action( 'wp_login', array( $this, 'user_login' ), 10, 2 ); add_action( 'manage_users_custom_column', array( $this, 'manage_users_column_content' ), 10, 3 ); + add_action( 'wpmu_users_custom_column', array( $this, 'manage_users_column_content' ), 10, 3 ); add_action( 'admin_footer-users.php', array( $this, 'manage_users_css' ) ); // Filters add_filter( 'login_message', array( $this, 'user_login_message' ) ); add_filter( 'manage_users_columns', array( $this, 'manage_users_columns' ) ); + add_filter( 'wpmu_users_columns', array( $this, 'manage_users_columns' ) ); + + // Plugin Settings + // Register the 'settings' page + if (is_multisite()) { + add_action( 'network_admin_menu', array( $this, 'add_network_plugin_page' ) ); + add_action('network_admin_edit_ja_disable_users_save', array($this, 'save_network_settings_page'), 10, 0); + } + add_action( 'admin_menu', array( $this, 'add_plugin_page' ) ); + add_action( 'admin_init', array( $this, 'admin_settings' ) ); + + // Add a link from the plugin page to this plugin's settings page + add_filter( 'plugin_row_meta', array( $this, 'plugin_action_links' ), 10, 2 ); + + // Modify the All Users query to hide disabled users by default (if preference set) + add_filter('pre_user_query', array($this, 'user_query_exceptions' ) ); + } /** @@ -167,7 +185,19 @@ public function user_login_message( $message ) { */ public function manage_users_columns( $defaults ) { - $defaults['ja_user_disabled'] = __( 'Disabled', 'ja_disable_users' ); + if (esc_attr( $this->get_option( 'ja-disable-users-setting-hide-disabled' )) xor (!empty($_REQUEST['toggle_disabled']))) { + $title = __("Click to show disabled accounts."); + } else { + $title = __("Click to hide disabled accounts."); + } + if (!empty($_REQUEST['toggle_disabled'])){ + // user has overridden. make the link point to default + $toggle_link = '*'; + } else { + // user has not overridden. make the link point to override + $toggle_link = '*'; + } + $defaults['ja_user_disabled'] = __( 'Disabled' . $toggle_link, 'ja_disable_users' ); return $defaults; } @@ -197,5 +227,283 @@ public function manage_users_column_content( $empty, $column_name, $user_ID ) { public function manage_users_css() { echo ''; } + + /** + * Tells WordPress about a new settings page and what function to call to create it + * + * @since 1.2.0 + */ + public function add_plugin_page() { + // This page will be under "Settings" menu. add_options_page is merely a WP wrapper for add_submenu_page specifying the 'options-general' menu as parent + add_options_page( + "Disable Users Settings", // page title + "Disable Users Settings", // menu title + "manage_options", // user capability required to edit these settings + "ja-disable-users-settings", // new page slug + array( + $this, + 'create_settings_page' + ) // since we are putting settings on our own page, we also have to define how to print out the settings + ); + + if (is_multisite() && is_network_admin()) { + $permalink = network_admin_url( 'users.php' ) . '?only_disabled=1'; + } else { + $permalink = admin_url( 'users.php' ) . '?only_disabled=1'; + } + global $submenu; + $submenu['users.php'][] = array( 'Disabled Users', 'ja-disable-user-onlydisabled', $permalink ); + + } + + /** + * Tells WordPress about a new settings page and what function to call to create it + * + * @since 1.2.0 + */ + public function add_network_plugin_page() { + // This page will be under "Settings" menu. add_options_page is merely a WP wrapper for add_submenu_page specifying the 'options-general' menu as parent + add_submenu_page( + "settings.php", + "Disable Users Settings", // page title + "Disable Users Settings", // menu title + "manage_options", // user capability required to edit these settings + "ja-disable-users-settings", // new page slug + array( + $this, + 'create_settings_page' + ) // since we are putting settings on our own page, we also have to define how to print out the settings + ); + + if (is_multisite() && is_network_admin()) { + $permalink = network_admin_url( 'users.php' ) . '?only_disabled=1'; + } else { + $permalink = admin_url( 'users.php' ) . '?only_disabled=1'; + } + global $submenu; + $submenu['users.php'][] = array( 'Disabled Users', 'ja-disable-user-onlydisabled', $permalink ); + + } + + /** + * Adds a link to this plugin's setting page directly on the WordPress plugin list page + * + * @since 1.2.0 + * + * @param $links + * @param $file + * + * @return array + */ + public function plugin_action_links( $links, $file ) { + if (is_multisite() && is_network_admin()){ + $base_page = network_admin_url("settings.php?page=ja-disable-users-settings"); + } else { + $base_page = admin_url('options-general.php?page=ja-disable-users-settings'); + } + if ( strpos( __FILE__, $file ) !== false ) { + $links = array_merge( + $links, + array( + 'settings' => '' . __( 'Settings', 'ja-disable-users-settings') . '' + ) + ); + } + + return $links; + } + + /** + * Tells WordPress how to output the page + * + * @since 1.2.0 + */ + public function create_settings_page() { + if (is_multisite() && is_network_admin()){ + // network admin page doesn't have the luxury of register_setting api, + // so a custom hook must be created and called to save the setting. + $action = "edit.php?action=ja_disable_users_save"; + } else { + $action = "options.php"; + } + ?> +
+ +

Disable Users - Settings

+ +
+ +
+
+ update_site_option('ja-disable-users-setting-hide-disabled', "1"); + } else { + // user has unset the checkbox. Show disabled users by default. + $this->update_site_option('ja-disable-users-setting-hide-disabled', "0"); + } + // after saving, redirect to same page (otherwise, it would auto redirect to the network dashboard) + wp_redirect(add_query_arg(array('page' => 'ja-disable-users-settings', 'updated' => 'true'), network_admin_url('settings.php'))); + exit(); + } + + /** + * WP update_site_option apparently doesn't work if the option isn't already added (unlike update_option, which auto-adds if not exists). + * So this is a wrapper to add the option if it doesn't exist already. + * @since 1.1.2 + * @param $setting_id + * @param $value + */ + public function update_site_option($setting_id, $value){ + $exists = get_site_option($setting_id, -1); + // get_site_option will return false if the option doesn't exist. + // However, it will also return false if it exists and the option's value is false! + // So we define a default of -1 if the option doesn't exist. As long as the return is + // anything other than -1, the option exists and we must update it. Otherwise, + // we must add it. + if ($exists !== -1){ + update_site_option( $setting_id, $value ); + } else { + add_site_option( $setting_id, $value ); + } + } + + /**toggle_disabled + * Adds settings to settings page for this plugin. + * @since 1.2.0 + */ + public function admin_settings() { + add_settings_section( + 'ja-disable-users-settings-section', // unique name of section + 'Disable Users - Settings', // start of section text shown to user + '', // Extra text after section title + 'ja-disable-users-settings' // what page this section is on + ); + + $this->add_setting('ja-disable-users-setting-hide-disabled', __("Hide disabled users by default on All Users")); // adds a checkbox that lets users view All Users minus any disabled users + } + + /** + * Adds a setting + * @since 1.2.0 + * + * @param $setting_name + * @param $label + */ + public function add_setting( $setting_id, $label ) { + // add setting, and register it + add_settings_field( + $setting_id, // Unique ID used to identify the field + $label, // The label to the left of the option. + array($this, 'settings_input_checkbox'), // The function responsible for rendering checkboxes + 'ja-disable-users-settings', // The page on which this option will be displayed + 'ja-disable-users-settings-section', // The name of the section to which this field belongs + array( // The array of arguments to pass to the callback. These 3 are referenced in setting_input_checkbox. + 'id' => $setting_id, + 'label' => $label, + 'value' => esc_attr( $this->get_option( $setting_id )) + ) + ); + register_setting( + 'ja-disable-users-settings-group', + $setting_id + //array( $this, 'sanitize' ) // sanitize function + ); + + } + + /** + * Creates the HTML code that is printed for each setting input + * @since 1.2.0 + * + * @param $args + */ + public function settings_input_checkbox( $args ) { + // Note the ID and the name attribute of the element should match that of the ID in the call to add_settings_field. + // Because we only call register_setting once, all the options are stored in an array in the database. So we + // have to name our inputs with the name of an array. ex . + // WordPress will automatically serialize the inputs that are in this array form and store it under + // the option_group_name field. Then get_option will automatically unserialize and grab the value already set and pass it in via the $args as the 'value' parameter. + if ($args[ 'value' ]) { + $checked = 'checked="checked"'; + } else { + $checked = ''; + } + + $html = ''; + + // create a hidden variable with the same name and no value. if the box is unchecked, the hidden value will be POSTed. + // If the value is checked, only the checkbox will be sent. + // This way, we don't have to uncheck everything server-side and then re-check the POSTed values. + // This is particularly useful to prevent preferences from being deleted if a post type is removed from a theme's code. + // If we just unchecked everything, old post types would lose their preferences; if they are later reactivated, the preference + // would be gone. This way, the preference persists. + $html .= ''; + $html .= ''; + + // Here, we will take the first argument of the array and add it to a label next to the input + $html .= ''; + echo $html; + } + + /** + * Alters the "All Users" page by modifying the SQL query to show or hide disabled users. + * Based on the site's default preferences and override requests, this function can + * * show only disabled users + * * show all users + * * show only enabled users + * @since 1.2.0 + * @param $query_obj + * + * @return mixed + */ + public function user_query_exceptions($query_obj){ + // if preference is set to hide disabled users by default, then alter the All Users query to prevent disabled users from showing up + global $wpdb; + $str_hide_disabled_query = " AND ID NOT IN (SELECT user_id from $wpdb->usermeta WHERE meta_key = 'ja_disable_user' AND meta_value = '1')"; + $str_only_disabled_query = " AND ID IN (SELECT user_id from $wpdb->usermeta WHERE meta_key = 'ja_disable_user' AND meta_value = '1')"; + + + if ( !empty( $_REQUEST[ 'only_disabled' ] ) ) { + $query_obj->query_where .= $str_only_disabled_query; + return $query_obj; // force return here. we don't want the user to select 'only disabled' and 'hide disabled', because they would get an empty list. + } + + if ((esc_attr( $this->get_option( 'ja-disable-users-setting-hide-disabled' ))) xor (!empty( $_REQUEST[ 'toggle_disabled' ] ))) { + // preference set to hide disabled users by default, or is unset but override is active + + $query_obj->query_where .= $str_hide_disabled_query; + } + if ( !empty( $_REQUEST[ 'only_disabled' ] ) ) { + $query_obj->query_where .= $str_only_disabled_query; + } + + return $query_obj; + + } + + /** + * If site is multisite, and page is network admin page, return site option. Otherwise, just regular option. + * @param $setting_id + */ + public function get_option($setting_id){ + if (is_multisite() && is_network_admin()){ + return get_site_option($setting_id); + } else { + return get_option($setting_id); + } + } } new ja_disable_users(); \ No newline at end of file diff --git a/readme.txt b/readme.md similarity index 58% rename from readme.txt rename to readme.md index 0954a4e..ea03d99 100644 --- a/readme.txt +++ b/readme.md @@ -1,15 +1,16 @@ -=== Disable Users === -Contributors: jaredatch -Donate link: https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=AD8KTWTTDX9JL -Tags: users, login, disable -Requires at least: 4.0.0 -Tested up to: 4.3 -Stable tag: trunk -License: GPLv2 +# Disable Users # + +Contributors: jaredatch, schrauger +Donate link: https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=AD8KTWTTDX9JL +Tags: users, login, disable +Requires at least: 4.0.0 +Tested up to: 4.3 +Stable tag: trunk +License: GPLv2 Provides the ability to disable specific user accounts. -== Description == +## Description ## This plugin gives you the ability to disable specific user accounts via a profile setting. @@ -20,41 +21,53 @@ This can be useful in a few situations. * You are working on a site for a client who has an account, but do not want him to login and/or make changes during development. * You have a client who has an unpaid invoice. +Disabled users can also be hidden from the All Users listing, either by default (via the plugin settings page) or manually (by clicking on the link in the Disabled column). A new menu item is added as well, letting you view only disabled users. + **[This plugin is on GitHub!](https://github.com/jaredatch/Disable-Users/)** Pull requests are welcome. If possible please report issues through Github. -== Installation == +## Installation ## 1. Upload `disable-users` to your `/wp-content/plugins/` directory. -1. Edit any user and then look for the "Disable User Account" checkbox. +2. Edit any user and then look for the "Disable User Account" checkbox. -== Frequently Asked Questions == +## Frequently Asked Questions ## -= Can I change the message a disabled user sees? = +### Can I change the message a disabled user sees? ### Yes, there is a filter in place for that, `ja_disable_users_notice`. -== Screenshots == +## Screenshots## 1. User profile setting available to administrators. 2. Message when a disabled user tries to login. -== Changelog == +## Changelog ## + +#### 1.1.2 (04/27/2016) #### +* Fixed network admin pages for multisite installations + +#### 1.1.1 (03/08/2016) #### +* Added menu item to show only disabled users + +#### 1.1.0 (03/08/2016) #### +* Added plugin setting page +** Preference to hide disabled users by default when viewing All Users -= 1.0.5 (11/11/2015) = +#### 1.0.5 (11/11/2015) #### * Added pl_PL transnation - Props Dominik Kocuj -= 1.0.4 (6/21/2015) = +#### 1.0.4 (6/21/2015) #### * Bug fix for Disabled column to manage user screen -= 1.0.3 (6/15/2015) = +#### 1.0.3 (6/15/2015) #### * Added Disabled column to manage user screen. Props @basteln3rk [(flexponsive)](https://www.flexponsive.net). * Cleaned up code slightly and updated README information -= 1.0.2 = +#### 1.0.2 #### * Removed accidental PHP short form -= 1.0.1 = +#### 1.0.1 #### * Fixed notice that would show if WP_DEBUG was on. Props @vegasgeek. -= 1.0.0 = -* Initial launch \ No newline at end of file +#### 1.0.0 #### +* Initial launch