根据 WooCommerce 3+ 中的用户角色添加自定义我的帐户菜单项
Posted
技术标签:
【中文标题】根据 WooCommerce 3+ 中的用户角色添加自定义我的帐户菜单项【英文标题】:Add custom my account menu item based on user role in WooCommerce 3+ 【发布时间】:2021-07-15 15:36:00 【问题描述】:我正在使用 WordPress 和 WooCommerce,我已按照这篇文章 https://rudrastyh.com/woocommerce/my-account-menu.html 在我的帐户菜单中添加新菜单项。
这是我的工作代码。
function getUserRolesByUserId( $id )
if ( !is_user_logged_in() ) return false;
$oUser = get_user_by( 'id', $id );
$aUser = get_object_vars( $oUser );
$sRoles = $aUser['roles'];
return $sRoles;
function createMenuBasedonUserRole($userId)
$userRoleIds = getUserRolesByUserId(get_current_user_id());
$urlMenuData = [];
if(!empty($userRoleIds) && in_array('mindesk_var_account',$userRoleIds))
$urlMenuData = [
'pageName' => "Clients",
"pageLink" => "clients"
];
else if(!empty($userRoleIds) && in_array('mindesk_owner_account',$userRoleIds))
$urlMenuData = [
'pageName' => "Children",
"pageLink" => "children"
];
return $urlMenuData;
/*
* Step 1. Add Link (Tab) to My Account menu
*/
add_filter ( 'woocommerce_account_menu_items', 'mindesk_clients_children_link', 40 );
function mindesk_clients_children_link( $menu_links )
$urlData = createMenuBasedonUserRole(get_current_user_id());
if(!empty($urlData))
$menu_links = array_slice( $menu_links, 0, 5, true ) + array( $urlData['pageLink'] => $urlData['pageName'] ) + array_slice( $menu_links, 5, NULL, true );
return $menu_links;
/*
* Step 2. Register Permalink Endpoint
*/
add_action( 'init', 'mindesk_add_menu_endpoint' );
function mindesk_add_menu_endpoint()
add_rewrite_endpoint( 'clients', EP_PAGES );
add_rewrite_endpoint( 'children', EP_PAGES );
/*
* Step 3. Content for the new page in My Account, woocommerce_account_ENDPOINT NAME_endpoint
*/
add_action( 'woocommerce_account_clients_endpoint', 'mindesk_clients_my_account_endpoint_content' );
function mindesk_clients_my_account_endpoint_content()
require_once(get_template_directory() . '/myaccount/clients.php') ;
add_action( 'woocommerce_account_children_endpoint', 'mindesk_children_my_account_endpoint_content' );
function mindesk_children_my_account_endpoint_content()
require_once(get_template_directory() . '/myaccount/children.php') ;
/* Step 4
*/
// Go to Settings > Permalinks and just push "Save Changes" button.
这就是我称为“客户”的新菜单的显示方式。
正如您在上面看到的,我添加了新菜单并执行了页面,并且基于用户角色mindesk_var_account
我需要显示clients
和mindesk_owner_account
我需要显示children
。
我在/wp-content/themes/twentytwentyone/myaccount
创建了这两个 php 页面,并且工作正常。
但是,如果具有其他角色的用户尝试访问他们不允许访问的页面之一,我想使用 wp_die
或其他东西。
例如,如果登录用户具有mindesk_var_account
角色,那么如果他们尝试访问 http://localhost/wordpress/my-account/clients/ 那么我需要使用wp_die()
来不执行它。
我尝试在这两个新页面中使用wp_die
,但随后执行了菜单和其他操作。我只是想要这样的东西。
我尝试使用以下代码...
add_action( 'template_redirect', 'my_account_redirect' );
function my_account_redirect()
if( is_page( 'my-account' ) )
wp_die('fg');
然后它检查所有my-account
页面.. 我希望它只检查内页,如client
或children
。
有人可以指导我如何实现这一目标,从这里开始我应该怎么做。
谢谢
【问题讨论】:
【参考方案1】:您的代码中仍然存在一些小错误,缺少一些内容,并且由于 WooCommerce 3 在第 2 步中对我的帐户端点进行了一些相关更改。有些事情也可以简化。
为避免不允许的用户角色访问某些禁止的部分或端点,您可以使用挂钩在 template_redirect
挂钩中的自定义函数,该函数会将用户重定向到允许的部分。
完整代码如下:
// Custom function that get My account menu item data based on user roles
function get_menu_item_by_user_role()
$user_roles = wp_get_current_user()->roles;
if ( ! empty($user_roles) )
$menu_item = [];
// if ( in_array('mindesk_var_account', $user_roles) )
if ( in_array( 'mindesk_var_account', $user_roles ) )
$menu_item = [ 'clients' => __( "Clients", "woocommerce" ) ];
elseif( in_array( 'mindesk_owner_account', $user_roles ) )
$menu_item = [ 'children' => __( "Children", "woocommerce" ) ];
return $menu_item;
// Step 1 - Add Link (Tab) to My Account menu
add_filter ( 'woocommerce_account_menu_items', 'add_mindesk_custom_menu_items', 40 );
function add_mindesk_custom_menu_items( $menu_items )
$new_item = get_menu_item_by_user_role();
if ( ! empty($new_item) )
$menu_items = array_slice( $menu_items, 0, 5, true ) + $new_item + array_slice( $menu_items, 5, null, true );
return $menu_items;
// Step 2 - Enable endpoint (and endpoint permalink) - Since WooCommerce 3
add_filter( 'woocommerce_get_query_vars', 'add_mindesk_menu_item_endpoint' );
function add_mindesk_menu_item_endpoint( $query_vars )
$query_vars['clients'] = 'clients';
$query_vars['children'] = 'children';
return $query_vars;
// Step 3. Content for the new page in My Account, woocommerce_account_ENDPOINT NAME_endpoint
add_action( 'woocommerce_account_clients_endpoint', 'add_mindesk_account_clients_endpoint_content' );
function add_mindesk_account_clients_endpoint_content()
require_once(get_template_directory() . '/myaccount/clients.php') ;
add_action( 'woocommerce_account_children_endpoint', 'add_mindesk_account_children_endpoint_content' );
function add_mindesk_account_children_endpoint_content()
require_once(get_template_directory() . '/myaccount/children.php') ;
// Step 4. Endpoint page title
add_filter( 'woocommerce_endpoint_clients_title', 'set_mindesk_account_clients_endpoint_title', 10, 2 );
function set_mindesk_account_clients_endpoint_title( $title, $endpoint )
$title = __("Clients", "woocommerce" );
return $title;
add_filter( 'woocommerce_endpoint_children_title', 'set_mindesk_account_children_endpoint_title', 10, 2 );
function set_mindesk_account_children_endpoint_title( $title, $endpoint )
$title = __( "Children", "woocommerce" );
return $title;
// Step 5. Redirect if not allowed user role
add_action( 'template_redirect', 'redirect_mindesk_account_dashboard' );
function redirect_mindesk_account_dashboard()
if ( is_account_page() )
global $wp;
$item_key = array_keys(get_menu_item_by_user_role());
$page_url = get_permalink( get_option('woocommerce_myaccount_page_id') );
if ( empty($item_key) && ( isset($wp->query_vars['children']) || isset($wp->query_vars['clients']) ) )
wp_safe_redirect( get_permalink($page_id) );
exit();
elseif ( 'clients' == reset($item_key) && isset($wp->query_vars['children']) )
wp_safe_redirect( get_permalink($page_id) . 'clients/' );
exit();
elseif ( 'children' == reset($item_key) && isset($wp->query_vars['clients']) )
wp_safe_redirect( get_permalink($page_id) . 'children/' );
exit();
// Step 6. FLush rewrite rules:
// Go to Settings > Permalinks and click on "Save Changes".
代码位于活动子主题(或活动主题)的functions.php 文件中。经过测试并且可以工作。
相关:WooCommerce My Account custom endpoint menu item
【讨论】:
您能否帮助我或支持我解决此问题***.com/questions/67999061/… 如果您只看一次,任何指导将不胜感激。谢谢以上是关于根据 WooCommerce 3+ 中的用户角色添加自定义我的帐户菜单项的主要内容,如果未能解决你的问题,请参考以下文章
根据 Woocommerce 中的用户角色更改 COD 支付网关的默认订单状态
WooCommerce 根据用户角色更改 BACS 订单状态
如何根据用户角色隐藏具有给定类别的 WooCommerce 产品