Skip to content

Adds ability to hide disabled users from All Users #9

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 13 commits into
base: master
Choose a base branch
from
320 changes: 314 additions & 6 deletions init.php
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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
Expand All @@ -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' ) );

}

/**
Expand Down Expand Up @@ -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 = '<a href="?" title="' . $title . '">*</a>';
} else {
// user has not overridden. make the link point to override
$toggle_link = '<a href="?toggle_disabled=1" title="' . $title . '">*</a>';
}
$defaults['ja_user_disabled'] = __( 'Disabled' . $toggle_link, 'ja_disable_users' );
return $defaults;
}

Expand Down Expand Up @@ -197,5 +227,283 @@ public function manage_users_column_content( $empty, $column_name, $user_ID ) {
public function manage_users_css() {
echo '<style type="text/css">.column-ja_user_disabled { width: 80px; }</style>';
}

/**
* 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' => '<a href="' . $base_page . '">' . __( 'Settings', 'ja-disable-users-settings') . '</a>'
)
);
}

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";
}
?>
<div class="wrap" >

<h2 >Disable Users - Settings</h2 >

<form method="post" action="<?php echo $action?>" >
<?php
settings_fields( 'ja-disable-users-settings-group' );
do_settings_sections( 'ja-disable-users-settings' );
submit_button();
?>
</form >
</div >
<?php
}

/**
* Network admin pages don't have some settings APIs available, so saving must be done manually.
* @since 1.1.2
*/
public function save_network_settings_page(){
if ($_REQUEST['ja-disable-users-setting-hide-disabled']) {
// user has set the checkbox. Hide disabled users by default.
$this->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 <input type="text" id=option_key name="option_group_name[option_key]" />.
// 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 .= '<input type="hidden" id="' . $args[ 'id' ] . '" name="' . $args[ 'id' ] . '" value=""/>';
$html .= '<input type="checkbox" id="' . $args[ 'id' ] . '" name="' . $args[ 'id' ] . '" value="' . ( $args[ 'id' ] ) . '" ' . $checked . '/>';

// Here, we will take the first argument of the array and add it to a label next to the input
$html .= '<label for="' . $args[ 'id' ] . '"> ' . $args[ 'label' ] . '</label>';
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();
Loading