#2838
Vladimir
Keymaster

Try this variant. I removed the “Account Details” from the left menu items too, as it’s the only available my account endpoint and it’s not sense to place the link on the same page.


add_filter('woocommerce_account_menu_items', 'filter_wc_my_account_menu');
add_action('template_redirect', 'redirect_for_blocked_wc_pages');

function filter_wc_my_account_menu($items) {
    if (!current_user_can('subscriber')) {
        return $items;
    }
    if (isset($items['dashboard'])) {
        unset($items['dashboard']);
    }
    if (isset($items['orders'])) {
        unset($items['orders']);
    }
    if (isset($items['downloads'])) {
        unset($items['downloads']);
    }
    if (isset($items['edit-address'])) {
        unset($items['edit-address']);
    }
    if (isset($items['edit-account'])) {
        unset($items['edit-account']);
    }
    if (isset($items['payment-methods'])) {
        unset($items['payment-methods']);
    }

    return $items;
}

function redirect_from_blocked_url() {
    $my_account_url = wc_get_endpoint_url('edit-account');
    wp_redirect($my_account_url);
    die;    
}

function check_end_point_url($end_point, $current_url) {
    $blocked_url = wc_get_endpoint_url($end_point);
    if ($current_url==$blocked_url) {
        redirect_from_blocked_url();
    }
}

function redirect_for_blocked_wc_pages() {
    global $wp, $wp_query;
           
    if (!current_user_can('subscriber')) {
        return;
    }
    
    if (is_account_page() && !is_wc_endpoint_url()) {
        // block Woo My Account Dashboard;
        redirect_from_blocked_url();
    }
            
    $current_url = trailingslashit(home_url($wp->request));
    $blocked_end_points = array('dashboard', 'orders', 'downloads', 'edit-address', 'payment-methods');
    foreach($blocked_end_points as $bep) {
        check_end_point_url($bep, $current_url);
    }
    
}