false, 'enable_frontend_bar' => false ]; if (isset($pl_access_control_settings['enable_access_control']) && (int) $pl_access_control_settings['enable_access_control'] === 1) { // Required functionality: add_filter('user_has_cap', array($this, 'pl_access_control_user_has_cap'), 10, 4); add_filter('map_meta_cap', array($this, 'pl_access_control_filter_map_meta_cap'), 10, 4); add_filter('user_row_actions', array($this, 'pl_access_control_filter_user_row_actions'), 10, 2); add_action('plugins_loaded', array($this, 'pl_access_control_action_plugins_loaded'), 1); add_action('init', array($this, 'pl_access_control_action_init')); add_action('all_admin_notices', array($this, 'pl_access_control_action_admin_notices'), 1); add_action('wp_logout', 'pl_access_control_clear_olduser_cookie'); add_action('wp_login', 'pl_access_control_clear_olduser_cookie'); // Nice-to-haves: add_filter('ms_user_row_actions', array($this, 'pl_access_control_filter_user_row_actions'), 10, 2); add_filter('login_message', array($this, 'pl_access_control_filter_login_message'), 1); add_filter('removable_query_args', array($this, 'pl_access_control_filter_removable_query_args')); add_action('wp_meta', array($this, 'pl_access_control_action_wp_meta')); if ((int) $pl_access_control_settings['enable_frontend_bar'] === 1) { add_action('wp_footer', array($this, 'pl_access_control_action_wp_footer')); add_action('init', array($this, 'pl_access_control_action_init_body_class')); } add_action('personal_options', array($this, 'pl_access_control_action_personal_options')); add_action('admin_bar_menu', array($this, 'pl_access_control_action_admin_bar_menu'), 11); add_action('bbp_template_after_user_details_menu_items', array($this, 'pl_access_control_action_bbpress_button')); add_action('woocommerce_login_form_start', array($this, 'pl_access_control_login_form_start'), 10, 0); add_action('woocommerce_admin_order_data_after_order_details', array($this, 'pl_access_control_action_woocommerce_order_details'), 1); add_filter('woocommerce_account_menu_items', array($this, 'pl_access_control_filter_woocommerce_account_menu_items'), 999); add_filter('woocommerce_get_endpoint_url', array($this, 'pl_access_control_filter_woocommerce_get_endpoint_url'), 10, 2); add_action('pl_access_control_switch_to_user', array($this, 'pl_access_control_forget_woocommerce_session')); add_action("admin_bar_menu", array($this, "pl_access_control_admin_bar_menu"), 500); add_action("wp_ajax_pl_access_control_show_customer_on_demand", array($this, "pl_access_control_show_customer_on_demand")); add_action("wp_ajax_nopriv_pl_access_control_show_customer_on_demand", array($this, "pl_access_control_show_customer_on_demand")); } } public function pl_access_control_admin_bar_menu(WP_Admin_Bar $wp_admin_bar) { $access_control_options = get_option("pl_access_control_permissions", [ "enable_shop_manager" => false, ]); $manage_options = 'manage_options'; if (isset($access_control_options['enable_shop_manager']) && sanitize_text_field(wp_unslash($access_control_options['enable_shop_manager']))) $manage_options = 'manage_woocommerce'; if (!current_user_can($manage_options)) { return; } //add top level menu item $wp_admin_bar->add_menu(array( 'id' => 'access-control-switch-as-customer', 'title' => '' . __('Access Control', 'access-control') . '', 'icon' => 'dashicons-before dashicons-admin-post' )); $wp_admin_bar->add_menu(array( 'parent' => 'access-control-switch-as-customer', 'id' => 'access-control-form-in-admin-bar', 'title' => '
' )); $wp_admin_bar->add_menu(array( 'parent' => 'access-control-switch-as-customer', 'id' => 'access-control-current-user-title', 'title' => 'Current User' )); $current_user = wp_get_current_user(); $wp_admin_bar->add_menu( array( 'parent' => 'access-control-switch-as-customer', 'title' => get_avatar($current_user->ID, 32) . '' . $current_user->display_name . ' (' . ucfirst($current_user->roles[0]) . ')' . '', 'id' => 'access-control-switch-user-current', ) ); $wp_admin_bar->add_menu(array( 'parent' => 'access-control-switch-as-customer', 'id' => 'access-control-recent-users-title', 'title' => 'Recent Users' )); $pl_access_control_latest_switched_user = get_option('pl_access_control_latest_switched_user') ? array_reverse(get_option('pl_access_control_latest_switched_user')) : []; if (in_array('shop_manager', (array) $current_user->roles, true)) { // Current user is a shop_manager, so filter out shop_manager users from the array $filtered_users = array_filter($pl_access_control_latest_switched_user, function ($user_id) { $user = get_userdata($user_id); return $user && !in_array('shop_manager', (array) $user->roles, true); }); } else { // If current user is not a shop_manager, no filtering needed $filtered_users = $pl_access_control_latest_switched_user; } if (sizeof($filtered_users)) { $n = 0; foreach ($filtered_users as $user_id) { $user = get_user_by('id', $user_id); $link = self::pl_access_control_maybe_switch_url($user); $user_role = !empty($user->roles) ? ucfirst($user->roles[0]) : 'No role'; $wp_admin_bar->add_menu( array( 'parent' => 'access-control-recent-users-title', 'title' => $user->display_name . ' (' . $user_role . ')', 'id' => 'switch-user-' . $user->ID, 'href' => $link ) ); $n++; if ($n >= 4) break; } } } // Ajax Callback function public function pl_access_control_show_customer_on_demand() { if (!isset($_POST['nonce']) || !wp_verify_nonce(sanitize_text_field(wp_unslash($_POST['nonce'])), 'access_control_security_nonce')) { wp_send_json_error('Nonce validation failed.'); die(); } $html = ''; $userQuery = isset($_POST['userQuery']) ? sanitize_text_field(wp_unslash($_POST['userQuery'])) : ''; $requestFrom = isset($_POST['requestFrom']) ? sanitize_text_field(wp_unslash($_POST['requestFrom'])) : ''; $old_user_id = isset($_POST['old_user_id']) ? sanitize_text_field(wp_unslash($_POST['old_user_id'])) : ''; global $wpdb; $wild = '%'; $result = $wpdb->get_results( $wpdb->prepare( "SELECT {$wpdb->prefix}users.ID, {$wpdb->prefix}users.user_email, {$wpdb->prefix}users.user_login, group_concat(CASE {$wpdb->prefix}usermeta.meta_key WHEN '{$wpdb->prefix}capabilities' THEN {$wpdb->prefix}usermeta.meta_value END) {$wpdb->prefix}capabilities FROM {$wpdb->prefix}users LEFT JOIN {$wpdb->prefix}usermeta ON {$wpdb->prefix}users.ID = {$wpdb->prefix}usermeta.user_id WHERE ({$wpdb->prefix}users.ID LIKE %s OR {$wpdb->prefix}users.user_login LIKE %s OR {$wpdb->prefix}users.user_email LIKE %s) AND {$wpdb->prefix}usermeta.meta_value LIKE %s GROUP BY {$wpdb->prefix}users.ID LIMIT 0, 10;", array( $wild . $wpdb->esc_like($userQuery) . $wild, $wild . $wpdb->esc_like($userQuery) . $wild, $wild . $wpdb->esc_like($userQuery) . $wild, $wild . $wpdb->esc_like('customer') . $wild ) ), ); $old_user = isset($_POST['old_user_id']) ? get_user_by('id', $old_user_id) : ''; if (sizeof($result)) { $html .= ''; } die(wp_kses_post($html)); exit(); } public function pl_access_control_action_plugins_loaded() { // User Switching's auth_cookie if (!defined('PL_ACCESS_CONTROL_USER_SWITCHING_COOKIE')) { define('PL_ACCESS_CONTROL_USER_SWITCHING_COOKIE', 'wordpress_user_sw_' . COOKIEHASH); } // User Switching's pl_access_control_secure_auth_cookie if (!defined('PL_ACCESS_CONTROL_USER_SWITCHING_SECURE_COOKIE')) { define('PL_ACCESS_CONTROL_USER_SWITCHING_SECURE_COOKIE', 'wordpress_user_sw_secure_' . COOKIEHASH); } // User Switching's logged_in_cookie if (!defined('PL_ACCESS_CONTROL_USER_SWITCHING_OLDUSER_COOKIE')) { define('PL_ACCESS_CONTROL_USER_SWITCHING_OLDUSER_COOKIE', 'wordpress_user_sw_olduser_' . COOKIEHASH); } } public function pl_access_control_action_personal_options(WP_User $user) { $link = self::pl_access_control_maybe_switch_url($user); if (!$link) { return; } ?> $cookie_life); } public function pl_access_control_action_init_body_class() { $old_user = self::pl_access_control_get_old_user(); if ($old_user instanceof WP_User) { add_filter('body_class', function ($classes) { $classes[] = 'access-control-enabled'; return $classes; }); } } public function pl_access_control_action_init() { if (!isset($_REQUEST['action'])) { return; } // Allow only known actions to be handled $allowed_actions = array( 'pl_access_control_switch_to_user', 'switch_to_olduser', 'switch_off', 'customer_to_customer', ); $action = sanitize_text_field(wp_unslash($_REQUEST['action'])); if (!in_array($action, $allowed_actions, true)) { return; } $current_user = is_user_logged_in() ? wp_get_current_user() : null; switch ($action) { case 'pl_access_control_switch_to_user': if ( !isset($_REQUEST['user_id']) || !isset($_REQUEST['_wpnonce']) ) { wp_die(esc_html__('Invalid request.', 'access-control'), 400); } $user_id = absint($_REQUEST['user_id']); check_admin_referer("pl_access_control_switch_to_user_{$user_id}"); if (!current_user_can('pl_access_control_switch_to_user', $user_id)) { wp_die(esc_html__('Permission denied.', 'access-control'), 403); } $user = pl_access_control_switch_to_user($user_id, self::remember()); if ($user) { $recent_users = get_option('pl_access_control_latest_switched_user', []); $recent_users = array_diff($recent_users, [$user_id]); $recent_users[] = $user_id; update_option('pl_access_control_latest_switched_user', $recent_users); $redirect_to = esc_url(self::get_redirect($user, $current_user)); $args = array('user_switched' => 'true'); wp_safe_redirect( add_query_arg($args, $redirect_to ?: (current_user_can('read') ? admin_url() : home_url())), 302, self::$application ); exit; } else { wp_die(esc_html__('Could not switch users.', 'access-control'), 404); } break; case 'switch_to_olduser': $old_user = self::pl_access_control_get_old_user(); if (!$old_user || !isset($_REQUEST['_wpnonce'])) { wp_die(esc_html__('Could not switch users.', 'access-control'), 400); } check_admin_referer("switch_to_olduser_{$old_user->ID}"); if (!self::pl_access_control_authenticate_old_user($old_user)) { wp_die(esc_html__('Permission denied.', 'access-control'), 403); } if (pl_access_control_switch_to_user($old_user->ID, self::remember(), false)) { if (!empty($_REQUEST['interim-login']) && function_exists('login_header')) { $GLOBALS['interim_login'] = 'success'; login_header('', ''); exit; } $args = array( 'user_switched' => 'true', 'switched_back' => 'true', ); setcookie('user_switched', 1, time() + DAY_IN_SECONDS * 30, '/'); if (isset($_REQUEST['sw_user'])) { $args['action'] = 'customer_to_customer'; $args['sw_user'] = sanitize_text_field(wp_unslash($_REQUEST['sw_user'])); $args['customer_to_customer_wpnonce'] = wp_create_nonce('customer_to_customer_wpnonce'); } wp_safe_redirect( add_query_arg($args, self::get_redirect($old_user, $current_user) ?: admin_url('index.php')), 302, self::$application ); exit; } else { wp_die(esc_html__('Could not switch users.', 'access-control'), 404); } break; case 'customer_to_customer': if (isset($_REQUEST['sw_user'])) { $sw_user_id = sanitize_text_field(wp_unslash($_REQUEST['sw_user'])); $user = get_user_by('id', $sw_user_id); $link = self::pl_access_control_maybe_switch_url($user); echo '
' . esc_html__('Loading...', 'access-control') . '
'; } break; case 'switch_off': if (!$current_user || !current_user_can('switch_off')) { wp_die(esc_html__('Could not switch off.', 'access-control'), 403); } check_admin_referer("switch_off_{$current_user->ID}"); if (pl_access_control_switch_off_user()) { $args = array('switched_off' => 'true'); $redirect_to = self::get_redirect(null, $current_user); wp_safe_redirect( add_query_arg($args, $redirect_to ?: home_url()), 302, self::$application ); exit; } else { wp_die(esc_html__('Could not switch off.', 'access-control'), 403); } break; } } protected static function get_redirect(WP_User $new_user = null, WP_User $old_user = null) { $nonce = wp_create_nonce('access_control_security_nonce'); if (!wp_verify_nonce(sanitize_text_field(wp_unslash($nonce)), 'access_control_security_nonce')) { wp_send_json_error('Nonce validation failed.'); die(); } $redirect_to = ''; $requested_redirect_to = ''; $redirect_type = null; if (!empty($_REQUEST['redirect_to'])) { // URL $redirect_to = self::remove_query_args(sanitize_text_field(wp_unslash($_REQUEST['redirect_to']))); $requested_redirect_to = esc_url_raw(wp_unslash($_REQUEST['redirect_to'])); $requested_redirect_to = filter_var($requested_redirect_to, FILTER_VALIDATE_URL); $redirect_type = "url"; } elseif (!empty($_GET['redirect_to_post'])) { // Post $post_id = absint($_GET['redirect_to_post']); $redirect_type = 'post'; if (function_exists('is_post_publicly_viewable') && is_post_publicly_viewable($post_id)) { $link = get_permalink($post_id); if (is_string($link)) { $redirect_to = $link; $requested_redirect_to = $link; } } } elseif (!empty($_GET['redirect_to_term'])) { // Term $term = get_term(absint($_GET['redirect_to_term'])); $redirect_type = 'term'; if (($term instanceof WP_Term) && is_taxonomy_viewable($term->taxonomy)) { $link = get_term_link($term); if (is_string($link)) { $redirect_to = $link; $requested_redirect_to = $link; } } } elseif (!empty($_GET['redirect_to_user'])) { // User $user = get_userdata(absint($_GET['redirect_to_user'])); $redirect_type = 'user'; if ($user instanceof WP_User) { $link = get_author_posts_url($user->ID); if (is_string($link)) { $redirect_to = $link; $requested_redirect_to = $link; } } } elseif (!empty($_GET['redirect_to_comment'])) { // Comment $comment = get_comment(absint($_GET['redirect_to_comment'])); $redirect_type = 'comment'; if ($comment instanceof WP_Comment) { if ('approved' === wp_get_comment_status($comment)) { $link = get_comment_link($comment); if (is_string($link)) { $redirect_to = $link; $requested_redirect_to = $link; } } elseif (function_exists('is_post_publicly_viewable') && is_post_publicly_viewable((int) $comment->comment_post_ID)) { $link = get_permalink((int) $comment->comment_post_ID); if (is_string($link)) { $redirect_to = $link; $requested_redirect_to = $link; } } } } if (!$new_user) { $redirect_to = apply_filters('logout_redirect', $redirect_to, $requested_redirect_to, $old_user); } else { $redirect_to = apply_filters('login_redirect', $redirect_to, $requested_redirect_to, $new_user); } return apply_filters('access_control_redirect_to', $redirect_to, $redirect_type, $new_user, $old_user); } public function pl_access_control_action_admin_notices() { $nonce = wp_create_nonce('access_control_security_nonce'); if (!wp_verify_nonce(sanitize_text_field(wp_unslash($nonce)), 'access_control_security_nonce')) { wp_send_json_error('Nonce validation failed.'); die(); } $user = wp_get_current_user(); $old_user = self::pl_access_control_get_old_user(); if ($old_user) { $switched_locale = false; $lang_attr = ''; $locale = get_user_locale($old_user); $switched_locale = switch_to_locale($locale); $lang_attr = str_replace('_', '-', $locale); ?>
', esc_attr($lang_attr) ); } else { echo '

'; } ?> rawurlencode(self::pl_access_control_current_url()), ), self::pl_access_control_switch_back_url($old_user)); $message .= sprintf( ' %s.', esc_url($pl_access_control_switch_back_url), esc_html(self::pl_access_control_switch_back_message($old_user)) ); $message = apply_filters('access_control_switched_message', $message, $user, $old_user, $pl_access_control_switch_back_url, $just_switched); echo wp_kses($message, array( 'a' => array( 'href' => array(), ), )); ?>

ID === $old_user_id); } } return false; } public function pl_access_control_action_admin_bar_menu(WP_Admin_Bar $wp_admin_bar) { if (!is_admin_bar_showing()) { return; } if ($wp_admin_bar->get_node('user-actions')) { $parent = 'user-actions'; } else { return; } $old_user = self::pl_access_control_get_old_user(); if ($old_user) { $wp_admin_bar->add_node(array( 'parent' => $parent, 'id' => 'switch-back', 'title' => esc_html(self::pl_access_control_switch_back_message($old_user)), 'href' => add_query_arg(array( 'redirect_to' => rawurlencode(self::pl_access_control_current_url()), ), self::pl_access_control_switch_back_url($old_user)), )); } if (current_user_can('switch_off')) { $url = self::pl_access_control_switch_off_url(wp_get_current_user()); $redirect_to = is_admin() ? self::pl_access_control_get_admin_redirect_to() : array( 'redirect_to' => rawurlencode(self::pl_access_control_current_url()), ); if (is_array($redirect_to)) { $url = add_query_arg($redirect_to, $url); } } if (!is_admin() && is_author() && (get_queried_object() instanceof WP_User)) { if ($old_user) { $wp_admin_bar->add_node(array( 'parent' => 'edit', 'id' => 'author-switch-back', 'title' => esc_html(self::pl_access_control_switch_back_message($old_user)), 'href' => add_query_arg(array( 'redirect_to' => rawurlencode(self::pl_access_control_current_url()), ), self::pl_access_control_switch_back_url($old_user)), )); } elseif (current_user_can('pl_access_control_switch_to_user', get_queried_object_id())) { $wp_admin_bar->add_node(array( 'parent' => 'edit', 'id' => 'author-switch-to', 'title' => esc_html__('Switch To', 'access-control'), 'href' => add_query_arg(array( 'redirect_to' => rawurlencode(self::pl_access_control_current_url()), ), self::pl_access_control_switch_to_url(get_queried_object())), )); } } } public static function pl_access_control_get_admin_redirect_to() { $nonce = wp_create_nonce('access_control_security_nonce'); if (!wp_verify_nonce(sanitize_text_field(wp_unslash($nonce)), 'access_control_security_nonce')) { wp_send_json_error('Nonce validation failed.'); die(); } if (!empty($_GET['post'])) { // Post return array( 'redirect_to_post' => intval($_GET['post']), ); } elseif (!empty($_GET['tag_ID'])) { // Term return array( 'redirect_to_term' => intval($_GET['tag_ID']), ); } elseif (!empty($_GET['user_id'])) { // User return array( 'redirect_to_user' => intval($_GET['user_id']), ); } elseif (!empty($_GET['c'])) { // Comment return array( 'redirect_to_comment' => intval($_GET['c']), ); } return null; } public function pl_access_control_action_wp_meta() { $old_user = self::pl_access_control_get_old_user(); if ($old_user instanceof WP_User) { $url = add_query_arg(array( 'redirect_to' => rawurlencode(self::pl_access_control_current_url()), ), self::pl_access_control_switch_back_url($old_user)); printf( '
  • %s
  • ', esc_url($url), esc_html(self::pl_access_control_switch_back_message($old_user)) ); } } public function pl_access_control_action_wp_footer() { if (is_admin_bar_showing() || did_action('wp_meta')) { return; } /** * Allows the 'Switch back to {user}' link in the WordPress footer to be disabled. * * @since 1.5.5 * * @param bool $show_in_footer Whether to show the 'Switch back to {user}' link in footer. */ if (!apply_filters('access_control_in_footer', true)) { return; } $old_user = self::pl_access_control_get_old_user(); if ($old_user instanceof WP_User) { add_filter('body_class', function ($classes) { $classes[] = 'access-control-enabled'; return $classes; }); $url = add_query_arg(array( 'redirect_to' => rawurlencode(admin_url()), ), self::pl_access_control_switch_back_url($old_user)); ?>
    display_name) . '"' ?>
      ID); // need to get an admin id $redirect_to = get_permalink(get_option('woocommerce_myaccount_page_id')); $link = self::pl_access_control_switch_back_url($admin, $user_id) . '&redirect_to=' . $redirect_to; echo '
    • ' . esc_html($user->display_name) . '
    • '; $n++; if ($n >= 4) break; } } ?>
    '1', ), $url); } elseif (!empty($_REQUEST['redirect_to'])) { $redirect_to = rawurlencode(sanitize_text_field(wp_unslash($_REQUEST['redirect_to']))); $url = add_query_arg(array( 'redirect_to' => filter_var($redirect_to, FILTER_VALIDATE_URL), ), $url); } $message .= '

    '; $message .= ' '; $message .= sprintf( '%2$s', esc_url($url), esc_html(self::pl_access_control_switch_back_message($old_user)) ); $message .= '

    '; } return $message; } public function pl_access_control_filter_user_row_actions(array $actions, WP_User $user) { $link = self::pl_access_control_maybe_switch_url($user); if (!$link) { return $actions; } $actions['pl_access_control_switch_to_user'] = sprintf( '%s', esc_url($link), esc_html__('Switch To', 'access-control') ); return $actions; } public function pl_access_control_action_bbpress_button() { $user = get_userdata(bbp_get_user_id()); if (!$user) { return; } $link = self::pl_access_control_maybe_switch_url($user); if (!$link) { return; } $link = add_query_arg(array( 'redirect_to' => rawurlencode(bbp_get_user_profile_url($user->ID)), ), $link); echo ''; } public function pl_access_control_filter_removable_query_args(array $args) { return array_merge($args, array( 'user_switched', 'switched_off', 'switched_back', )); } public static function pl_access_control_maybe_switch_url(WP_User $user) { $old_user = self::pl_access_control_get_old_user(); if ($old_user && ($old_user->ID === $user->ID)) { return self::pl_access_control_switch_back_url($old_user); } elseif (current_user_can('pl_access_control_switch_to_user', $user->ID)) { return self::pl_access_control_switch_to_url($user); } else { return false; } } public static function pl_access_control_switch_to_url(WP_User $user) { return wp_nonce_url( add_query_arg( array( 'action' => 'pl_access_control_switch_to_user', 'user_id' => $user->ID, 'nr' => 1, ), wp_login_url() ), "pl_access_control_switch_to_user_{$user->ID}" ); } public static function pl_access_control_switch_back_url(WP_User $user, $user_id = 0) { $arg = array( 'action' => 'switch_to_olduser', 'nr' => 1, ); if ($user_id) $arg['sw_user'] = $user_id; return wp_nonce_url(add_query_arg($arg, wp_login_url()), "switch_to_olduser_{$user->ID}"); } public static function pl_access_control_switch_off_url(WP_User $user) { return wp_nonce_url(add_query_arg(array( 'action' => 'switch_off', 'nr' => 1, ), wp_login_url()), "switch_off_{$user->ID}"); } public static function pl_access_control_switched_to_message(WP_User $user) { $message = sprintf( /* Translators: 1: user display name; 2: username; */ __('Switched to %1$s (%2$s).', 'access-control'), $user->display_name, $user->user_login ); // Removes the user login from this message without invalidating existing translations return str_replace(sprintf( ' (%s)', $user->user_login ), '', $message); } public static function pl_access_control_switch_back_message(WP_User $user) { $message = sprintf( /* Translators: 1: user display name; 2: username; */ __('Switch back to %1$s (%2$s)', 'access-control'), $user->display_name, $user->user_login ); // Removes the user login from this message without invalidating existing translations return str_replace(sprintf( ' (%s)', $user->user_login ), '', $message); } public static function pl_access_control_switched_back_message(WP_User $user) { $img_src = esc_url(PL_ACCESS_CONTROL_URL . 'assets/images/notices.svg'); $message = ''; $message .= '
    '; $message .= '
    '; $message .= '
    '; // translators: 1: Opening h4 tag, 2: User display name, 3: User login, 4: Closing h4 tag, 5: Opening p tag, 6: Closing p tag. $message .= sprintf(__( '%1$sYou have switched back to %2$s (%3$s). Want to view as a customer again?%4$s %5$sIt seems like you have switched back to the admin role. If you wish to back to any customer view, just search from the top bar, type the name and click on it to switch again.%6$s','access-control'), '

    ', $user->display_name, $user->user_login, '

    ', '

    ', '

    ' ); $message .= '
    '; $message .= '' . esc_html__('Switch', 'access-control') . ''; if (current_user_can('manage_options')) { $message .= '' . esc_html__('Settings', 'access-control') . ''; } $message .= '
    '; $message .= '
    '; $message .= '
    '; $message .= ''; return $message; } public static function pl_access_control_current_url() { $request_uri = ''; if (isset($_SERVER['HTTP_HOST']) && isset($_SERVER['REQUEST_URI'])) $request_uri = esc_url_raw((is_ssl() ? 'https://' : 'http://') . sanitize_text_field(wp_unslash($_SERVER['HTTP_HOST'])) . sanitize_text_field(wp_unslash($_SERVER['REQUEST_URI']))); return filter_var($request_uri, FILTER_VALIDATE_URL); } public static function remove_query_args($url) { return remove_query_arg(wp_removable_query_args(), $url); } public static function pl_access_control_secure_olduser_cookie() { return (is_ssl() && ('https' === wp_parse_url(home_url(), PHP_URL_SCHEME))); } public static function pl_access_control_secure_auth_cookie() { return (is_ssl() && ('https' === wp_parse_url(wp_login_url(), PHP_URL_SCHEME))); } public function pl_access_control_login_form_start() { echo wp_kses_post($this->pl_access_control_filter_login_message('')); } public function pl_access_control_action_woocommerce_order_details(WC_Order $order) { $user = $order->get_user(); if (!$user || !current_user_can('pl_access_control_switch_to_user', $user->ID)) { return; } $url = add_query_arg(array( 'redirect_to' => rawurlencode(esc_url($order->get_view_order_url())), ), self::pl_access_control_switch_to_url($user)); printf( '

    %2$s

    ', esc_url($url), esc_html__('Switch To', 'access-control') ); } public function pl_access_control_filter_woocommerce_account_menu_items(array $items) { $old_user = self::pl_access_control_get_old_user(); if (!$old_user) { return $items; } $items['access-control-switch-back'] = self::pl_access_control_switch_back_message($old_user); return $items; } public function pl_access_control_filter_woocommerce_get_endpoint_url($url, $endpoint) { if ('access-control-switch-back' !== $endpoint) { return $url; } $old_user = self::pl_access_control_get_old_user(); if (!$old_user) { return $url; } return self::pl_access_control_switch_back_url($old_user); } public function pl_access_control_forget_woocommerce_session() { if (!function_exists('WC')) { return; } $wc = WC(); if (!property_exists($wc, 'session')) { return; } if (!method_exists($wc->session, 'forget_session')) { return; } $wc->session->forget_session(); } public function pl_access_control_user_has_cap(array $user_caps, array $required_caps, array $args, WP_User $user) { if ('pl_access_control_switch_to_user' === $args[0]) { if (empty($args[2])) { $user_caps['pl_access_control_switch_to_user'] = false; return $user_caps; } if (array_key_exists('switch_users', $user_caps)) { $user_caps['pl_access_control_switch_to_user'] = $user_caps['switch_users']; return $user_caps; } $user_caps['pl_access_control_switch_to_user'] = (user_can($user->ID, 'edit_user', $args[2]) && ($args[2] !== $user->ID)); } elseif ('switch_off' === $args[0]) { if (array_key_exists('switch_users', $user_caps)) { $user_caps['switch_off'] = $user_caps['switch_users']; return $user_caps; } $user_caps['switch_off'] = user_can($user->ID, 'edit_users'); } return $user_caps; } public function pl_access_control_filter_map_meta_cap(array $required_caps, $cap, $user_id, array $args) { if ('pl_access_control_switch_to_user' === $cap) { if (empty($args[0]) || $args[0] === $user_id) { $required_caps[] = 'do_not_allow'; } } return $required_caps; } public static function get_instance() { static $instance; if (!isset($instance)) { $instance = new Pl_Access_Control_Role_Editor(); } return $instance; } } $GLOBALS['access_control'] = Pl_Access_Control_Role_Editor::get_instance(); $GLOBALS['access_control']->pl_access_control_init_hooks();