setup();
}
/**
* Set up various actions, filters, and other items.
*
* @since 1.1
* @access public
*/
public function setup() {
$this->maybe_map_old_settings();
$this->settings = array(
'access_switch' => get_option( 'rda_access_switch', 'manage_options' ),
'access_cap' => get_option( 'rda_access_cap', 'manage_options' ),
'enable_profile' => get_option( 'rda_enable_profile', 1 ),
'redirect_url' => get_option( 'rda_redirect_url', home_url() ),
'login_message' => get_option( 'rda_login_message', esc_html__( 'This site is in maintenance mode.', 'remove_dashboard_access' ) ),
);
// Translation.
add_action( 'init', array( $this, 'load_textdomain' ) );
// Settings.
add_action( 'admin_menu', array( $this, 'options_page' ) );
add_action( 'admin_init', array( $this, 'settings' ) );
add_action( 'admin_head-settings_page_dashboard-access', array( $this, 'access_switch_js' ) );
// Settings link in plugins list.
add_filter( 'plugin_action_links', array( $this, 'settings_link' ), 10, 2 );
// Login message.
add_filter( 'login_message', array( $this, 'output_login_message' ) );
}
/**
* Load the plugin text domain for translation.
*
* @since 1.2.1
*/
public function load_textdomain() {
load_plugin_textdomain( 'remove_dashboard_access', false, dirname( plugin_basename( __FILE__ ) ) . '/languages/' );
}
/**
* (maybe) Map old settings (1.0-) to the new ones (1.1+).
*
* @since 1.1
* @access public
*/
public function maybe_map_old_settings() {
// If the settings aren't there, bail.
if ( false == $old_settings = get_option( 'rda-settings' ) ) {
return;
}
$new_settings = array();
if ( ! empty( $old_settings ) && is_array( $old_settings ) ) {
// Access Switch.
$new_settings['rda_access_switch'] = empty( $old_settings['access_switch'] ) ? 'manage_options' : $old_settings['access_switch'];
// Access Cap.
$new_settings['rda_access_cap'] = ( 'capability' == $new_settings['access_switch'] ) ? 'manage_options' : $new_settings['rda_access_switch'];
// Redirect URL.
$new_settings['rda_redirect_url'] = empty( $old_settings['redirect_url'] ) ? home_url() : $old_settings['redirect_url'];
// Enable Profile.
$new_settings['rda_enable_profile'] = empty( $old_settings['enable_profile'] ) ? true : $old_settings['enable_profile'];
// Login Message.
$new_settings['rda_login_message'] = '';
}
foreach ( $new_settings as $key => $value ) {
update_option( $key, $value );
}
delete_option( 'rda-settings' );
}
/**
* Activation Hook.
*
* Setup default options on activation.
*
* @since 1.0
* @access public
*
* @see $this->setup()
*/
public function activate() {
$settings = array(
'rda_access_switch' => 'manage_options',
'rda_access_cap' => 'manage_options',
'rda_redirect_url' => home_url(),
'rda_enable_profile' => 1,
'rda_login_message' => '',
);
foreach ( $settings as $key => $value ) {
add_option( $key, $value );
}
}
/**
* Options page: Remove Access
*
* @since 1.1.1
*
* @uses add_options_page() to add a sub-menu under 'Settings'
*/
function options_page() {
add_options_page(
esc_html__( 'Dashboard Access Settings', 'remove_dashboard_access' ),
esc_html__( 'Dashboard Access', 'remove_dashboard_access' ),
'manage_options',
'dashboard-access',
array( $this, 'options_page_cb' )
);
}
/**
* Options page: callback
*
* Outputs the form for the 'Remove Access' submenu
*
* @since 1.1.1
*/
function options_page_cb() {
?>
setup()
*/
public function settings() {
// Dashboard Access Controls section.
add_settings_section( 'rda_options', esc_html__( 'Dashboard Access Controls', 'remove_dashbord_access' ), array( $this, 'settings_section' ), 'dashboard-access' );
// Settings.
$sets = array(
'rda_access_switch' => array(
'label' => esc_html__( 'Dashboard User Access:', 'remove_dashboard_access' ),
'callback' => 'access_switch_cb',
),
'rda_access_cap' => array(
'label' => '',
'callback' => 'access_cap_dropdown',
),
'rda_redirect_url' => array(
'label' => esc_html__( 'Redirect URL:', 'remove_dashboard_access' ),
'callback' => 'url_redirect_cb',
),
'rda_enable_profile' => array(
'label' => esc_html__( 'User Profile Access:', 'remove_dashboard_access' ),
'callback' => 'profile_enable_cb',
),
'rda_login_message' => array(
'label' => esc_html__( 'Login Message', 'remove_dashboard_access' ),
'callback' => 'login_message_cb',
),
);
foreach ( $sets as $id => $settings ) {
add_settings_field( $id, $settings['label'], array( $this, $settings['callback'] ), 'dashboard-access', 'rda_options' );
// Pretty lame that we need separate sanitize callbacks for everything.
$sanitize_callback = str_replace( 'rda', 'sanitize', $id );
register_setting( 'dashboard-access', $id, array( $this, $sanitize_callback ) );
};
// Debug info "setting".
if ( ! empty( $_GET['rda_debug'] ) ) { // phpcs:ignore WordPress.Security.NonceVerification
add_settings_field( 'rda_debug_mode', esc_html__( 'Debug Info', 'remove_dashboard_access' ), array( $this, '_debug_mode' ), 'dashboard-access', 'rda_options' );
}
}
/**
* Dashboard Access Controls display callback.
*
* @since 1.1
* @access public
*/
public function settings_section() {
esc_html_e( 'Dashboard access can be restricted to users of certain roles only or users with a specific capability.', 'remove_dashboard_access' );
}
/**
* Access Controls 2 of 2.
*
* Output the capability drop-down.
*
* @since 1.1
* @access public
*/
public function access_cap_dropdown() {
$switch = $this->settings['access_switch'];
?>
_output_caps_dropdown(); ?>
%2$s',
esc_url( 'http://codex.wordpress.org/Roles_and_Capabilities' ),
esc_html__( 'Roles & Capabilities', 'remove_dashboard_access' )
)
); ?>
setup()
*/
public function access_switch_js() {
wp_enqueue_script( 'rda-settings', plugin_dir_url( __FILE__ ) . 'js/settings.js', array( 'jquery' ), '1.0' );
}
/**
* Enable/Disable radio toggle display callback.
*
* @since 1.1
* @access public
*
* @see $this->options_setup()
*/
public function plugin_toggle_cb() {
printf( '%2$s',
checked( esc_attr( $this->settings['toggle_plugin_off'] ), true, false ),
esc_html__( ' Disable access controls and redirection', 'remove_dashboard_access' )
);
}
/**
* Capability-type radio switch display callback.
*
* Displays the radio button switch for choosing which
* capability users need to access the Dashboard. Mimics
* 'Page on front' UI in options-reading.php for a more
* integrated feel.
*
* @since 1.0
* @access public
*
* @see $this->caps_dropdown()
*/
public function access_switch_cb() {
echo '';
$switch = $this->settings['access_switch'];
/**
* Filter the capability defaults for admins, editors, and authors.
*
* @since 1.1
*
* @param array $capabilities {
* Default capabilities for various roles.
*
* @type string $admin Capability to use for administrators only. Default 'manage_options'.
* @type string $editor Capability to use for admins + editors. Default 'edit_others_posts'.
* @type string $author Capability to use for admins + editors + authors. Default 'publish_posts'.
* }
*/
$defaults = apply_filters( 'rda_default_caps_for_role', array(
'admin' => 'manage_options',
'editor' => 'edit_others_posts',
'author' => 'publish_posts',
) );
?>
access_switch_cb()
*/
private function _output_caps_dropdown() {
/** @global WP_Roles $wp_roles */
global $wp_roles;
$capabilities = array();
foreach ( $wp_roles->role_objects as $key => $role ) {
if ( is_array( $role->capabilities ) ) {
foreach ( $role->capabilities as $cap => $grant )
$capabilities[$cap] = $cap;
}
}
// Gather legacy user levels.
$levels = array(
'level_0','level_1', 'level_2', 'level_3',
'level_4', 'level_5', 'level_6', 'level_7',
'level_8', 'level_9', 'level_10',
);
// Remove levels from caps array (Thank you Justin Tadlock).
$capabilities = array_diff( $capabilities, $levels );
// Remove # capabilities (maybe from some plugin, perhaps?).
for ( $i = 0; $i < 12; $i++ ) {
unset( $capabilities[$i] );
}
// Alphabetize for nicer display.
ksort( $capabilities );
if ( ! empty( $capabilities ) ) {
// Start