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