Ẩn điểm cuối tài khoản WooCommerce theo vai trò của người dùng

Tìm hiểu cách ẩn các điểm cuối WooCommerce cụ thể và các mục menu tài khoản của chúng, dựa trên vai trò của người dùng.

Theo mặc định, WooCommerce sẽ thêm người dùng mới vào vai trò “Khách hàng” nếu họ được tạo tại điểm bán hàng. Với tư cách là chủ sở hữu / nhà phát triển trang web, tài khoản của bạn có thể ở vai trò “Quản trị viên”. Trong hướng dẫn này, chúng tôi sẽ ẩn một số mục menu “tài khoản của tôi” cho người dùng “khách hàng”. Chúng tôi cũng sẽ thêm một số móc để nếu khách hàng cố gắng truy cập vào một điểm cuối mà họ không được phép truy cập, chúng tôi sẽ chuyển hướng họ trở lại trang chủ chính của tài khoản của họ.

Chúng tôi sẽ không sử dụng bất kỳ trình cắm thêm nào để làm điều này - chỉ là một vài hàm PHP đơn giản.

Nó sẽ hoạt động như thế nào

Có hai hành động chúng ta cần sửa đổi:
  • Thay đổi danh sách các mục menu nếu chúng tôi phát hiện thấy người dùng không được phép xem một số mục trong số đó.
  • Phát hiện khi người dùng cố gắng truy cập vào một điểm cuối bị hạn chế và triển khai chuyển hướng.
Chúng tôi sẽ thực hiện việc này bằng cách kết nối với woocommerce_account_menu_items (bộ lọc) và template_redirect (hành động).

Trước khi bắt đầu, hãy đảm bảo rằng bạn đang sử dụng một chủ đề con tùy chỉnh để bạn có một nơi nào đó để đặt các hàm PHP tùy chỉnh.

Thiết lập mã

Trong thư mục của chủ đề con tùy chỉnh của bạn, hãy tạo một tệp mới có tên là functions-wc-account.php và dán phần sau vào đó.
/**
 * functions-wc-account.php
 * Modify some WooCommerce account functions.
 */
// Block direct access.
if (!defined('WPINC')) {
   exit('Do NOT access this file directly.');
}
// Our functions will go in here...
// ...
Điều đó sẽ hoạt động như một trình giữ chỗ - chúng tôi sẽ quay lại với nó sau một phút. Tiếp theo, chúng ta cần liên kết tệp này với tệp functions.php chính, vì vậy… hãy mở tệp functions.php chính của chủ đề con tùy chỉnh của bạn và dán phần sau vào đó.
/**
 * WooCommerce Account Functions
 */
require_once 'functions-wc-account.php';
Đó là những điều cơ bản tại chỗ. Bây giờ chúng ta có thể triển khai hai hook và thực hiện một chút thử nghiệm. Chúng tôi sẽ bắt đầu bằng cách tạo chuyển hướng khi người dùng cố gắng truy cập vào một trang bị hạn chế.

Chuyển hướng người dùng trái phép

Quay lại tệp functions-wc-account.php của bạn và thêm hàm sau vào đó.
function custom_template_redirect() {
   if (is_user_logged_in() && function_exists('WC') && !is_admin() && is_account_page()) {
      $user = wp_get_current_user();
      $is_access_blocked = false;
      // Restrict "downloads" and "payment-methods" to the "administrator" and "editor" roles.
      if (is_wc_endpoint_url('downloads') || is_wc_endpoint_url('payment-methods')) {
         $allowed_roles = array('administrator', 'editor');
         if (!array_intersect($allowed_roles, $user->roles)) {
            $is_access_blocked = true;
         }
      }
      // More endpoint restrictions can go in here...
      // ...
      if ($is_access_blocked) {
         // Redirect to the user's main "my account" page - probably their dashboard.
         wp_safe_redirect(wc_get_page_permalink('myaccount'));
         exit;
      }
   }
}
add_action('template_redirect', 'custom_template_redirect', 5);
Hãy chia nhỏ điều này một chút.

thông tin Các hành động có mức độ ưu tiên thấp hơn được gọi trước đó so với các hành động có mức độ ưu tiên cao hơn.

Lời gọi add_action () nối template_redirecthành động với mức độ ưu tiên là 5 và gọi custom_template_redirect()hàm của chúng ta . Hầu hết các hook sử dụng mức độ ưu tiên là 10. Bằng cách nối template_redirect với mức độ ưu tiên là 5, chúng tôi đảm bảo rằng mã của chúng ta được gọi trước hầu hết các hook khác.

  • Nếu người dùng đã đăng nhập, WooCommerce đã được cài đặt, chúng tôi không ở trong khu vực quản trị WP và chúng tôi đang cố gắng tải một trang tài khoản…
    • Nếu chúng tôi đang cố gắng xem một trong các điểm cuối bị hạn chế và người dùng không có vai trò được phép…
      • bộ $is_access_blocked = true
    • Có thể kiểm tra thêm các hạn chế điểm cuối…
      • có thể thiết lập $is_access_blocked = true
    • Nếu $ is_access_blocked là true…
      • Gọi hàm wp_safe_redirect () chuẩn của WordPress để chuyển người dùng trở lại trang “tài khoản của tôi” chính của họ.
Đó là tất cả những gì liên quan đến bit chuyển hướng. Lưu tệp và kiểm tra bằng cách đăng nhập vào trang web của bạn với tư cách khách hàng. Nếu mọi thứ hoạt động bình thường, khi bạn nhấp vào mục menu “Tải xuống” hoặc “Phương thức thanh toán”, bạn sẽ được chuyển hướng đến Trang tổng quan.

Xóa / ẩn các mục trong menu

Phần này hoạt động rất giống với chức năng trước đó, nhưng thay vì chỉ “thực hiện một hành động”, chúng tôi sẽ lọc một loạt các mục menu đến và loại bỏ ( unset(), trong PHP) bất kỳ mục menu nào mà người dùng không được phép. truy cập.

Trong tệp functions-wc-account.php của bạn , hãy thêm phần sau.

function custom_woocommerce_account_menu_items($items, $endpoints) {
   if (is_user_logged_in() && !is_admin() && is_account_page()) {
      $user = wp_get_current_user();
      // Restrict "downloads" and "payment-methods" to "administrator" and "editor" roles.
      if (!array_intersect(array('administrator', 'editor'), $user->roles)) {
         unset($items['downloads']);
         unset($items['payment-methods']);
      }
      // Do more checks and remove more menu items here, if you want.
   }
   return $items;
}
add_filter('woocommerce_account_menu_items', 'custom_woocommerce_account_menu_items', 10, 2);

Sự cố tương tự như custom_template_redirect()chức năng của chúng tôi . Lưu ý rằng chúng tôi không có function_exists(‘WC’)trong if()câu lệnh đầu tiên của mình - bộ lọc woocommerce_account_menu_items chỉ được gọi bởi chính WooCommerce.

Lưu, Kiểm tra và… Tất cả đã hoàn tất

Thats tất cả để có nó. Bạn chắc chắn có thể sử dụng các trình cắm thêm để làm những việc này, nhưng mã ở đây là phẫu thuật… Nó thực hiện chính xác những gì chúng ta cần và nó thực hiện nó chỉ trong một vài dòng mã. Nó dễ đọc và cũng dễ mở rộng.

Hãy vui vẻ khi tùy chỉnh khu vực tài khoản WooCommerce của bạn!