根据WooCommerce 3+中的用户角色添加自定义我的帐户菜单项 [英] Add custom my account menu item based on user role in WooCommerce 3+
问题描述
我正在使用WordPress和WooCommerce,并且已关注本文
如上所述,我已经添加了新菜单并执行了该页面,并根据用户角色 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');函数my_account_redirect(){if(is_page('my-account')){wp_die('fg');}}
但是随后它会检查所有 my-account
页.我只希望检查内部页,例如 client
或 children
.
有人可以指导我如何实现此目标.
谢谢
您的代码中仍然存在一些小错误,缺少一些东西,并且自WooCommerce 3以来,第2步中针对我的帐户"端点进行了一些相关更改.有些事情也可以简化.
为避免不允许的用户角色访问某些禁止的部分或端点,您可以使用挂钩在 template_redirect
钩子中的自定义函数,该函数会将用户重定向到允许的部分./p>
这是完整的代码:
//自定义功能,可根据用户角色获取我的帐户"菜单项数据函数get_menu_item_by_user_role(){$ user_roles = wp_get_current_user()-> roles;如果(!empty($ user_roles)){$ menu_item = [];//如果((in_array('mindesk_var_account',$ user_roles)){如果(in_array('mindesk_var_account',$ user_roles)){$ menu_item = ['clients'=>__(客户","woocommerce"));}elseif(in_array('mindesk_owner_account',$ user_roles)){$ menu_item = ['children'=>__("Children","woocommerce"));}}返回$ menu_item;}//步骤1-将链接(Tab)添加到我的帐户"菜单add_filter('woocommerce_account_menu_items','add_mindesk_custom_menu_items',40);函数add_mindesk_custom_menu_items($ menu_items){$ new_item = get_menu_item_by_user_role();如果(!empty($ new_item)){$ menu_items = array_slice($ menu_items,0,5,true)+ $ new_item + array_slice($ menu_items,5,null,true);}返回$ menu_items;}//步骤2-启用端点(和端点永久链接)-从WooCommerce 3开始add_filter('woocommerce_get_query_vars','add_mindesk_menu_item_endpoint');函数add_mindesk_menu_item_endpoint($ query_vars){$ query_vars ['clients'] ='clients';$ query_vars ['children'] ='children';返回$ query_vars;}//步骤3.我的帐户"中的新页面的内容woocommerce_account_ {ENDPOINT NAME} _endpointadd_action('woocommerce_account_clients_endpoint','add_mindesk_account_clients_endpoint_content');函数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');函数add_mindesk_account_children_endpoint_content(){require_once(get_template_directory().'/myaccount/children.php');}//步骤4.端点页面标题add_filter('woocommerce_endpoint_clients_title','set_mindesk_account_clients_endpoint_title',10,2);函数set_mindesk_account_clients_endpoint_title($ title,$ endpoint){$ title = __("Clients","woocommerce");返回$ title;}add_filter('woocommerce_endpoint_children_title','set_mindesk_account_children_endpoint_title',10,2);函数set_mindesk_account_children_endpoint_title($ title,$ endpoint){$ title = __("Children","woocommerce");返回$ title;}//步骤5.如果不允许用户角色,则重定向add_action('template_redirect','redirect_mindesk_account_dashboard');函数redirect_mindesk_account_dashboard(){如果(is_account_page()){全球$ 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));出口();}elseif('clients'== reset($ item_key)&& isset($ wp-> query_vars ['children'])){wp_safe_redirect(get_permalink($ page_id).'clients/');出口();}elseif('children'== reset($ item_key)&& isset($ wp-> query_vars ['clients'])){wp_safe_redirect(get_permalink($ page_id).'children/');出口();}}}//步骤6.FLush重写规则://转到设置>永久链接,然后单击保存更改".
代码进入活动子主题(或活动主题)的functions.php文件中.经过测试,可以正常工作.
I am using WordPress and WooCommerce and I have followed this article https://rudrastyh.com/woocommerce/my-account-menu.html to add new menu items in WooCommerce my account menus.
This is my working code.
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.
And this is my how my new menu called as "Clients" showing.
As you can see above, I have added new menu and executing the page and based on user role mindesk_var_account
I need to show clients
and mindesk_owner_account
I need to show children
.
I have created these 2 php pages at /wp-content/themes/twentytwentyone/myaccount
and its working fine.
However, I want to use wp_die
or something if user with another role try to access one of the page which they are not allowed to.
So for example if logged in user has mindesk_var_account
role then if they try to go to http://localhost/wordpress/my-account/clients/ then i need to use wp_die()
to not execute it.
I tried to use wp_die
inside these new 2 pages but then menus and other things executed. I just want something like this.
I tried to use following code...
add_action( 'template_redirect', 'my_account_redirect' );
function my_account_redirect() {
if( is_page( 'my-account' ) ) {
wp_die('fg');
}
}
But then its checking for all my-account
pages .. and I want it to be checked only for inner pages like client
or children
.
Can someone guide me how can I achieve this what should I do from here on.
Thanks
There are still some little mistakes in your code, some missing things and since WooCommerce 3 there are some related changes within step 2 for My account endpoints. Some things can be simplified too.
To avoid non allowed user roles to access to some prohibited section(s) or endpoint(s) you can use a custom function hooked in template_redirect
hook that will redirect user to an allowed section.
Here is the complete code:
// 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".
Code goes in functions.php file of the active child theme (or active theme). Tested and works.
related: WooCommerce My Account custom endpoint menu item
这篇关于根据WooCommerce 3+中的用户角色添加自定义我的帐户菜单项的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!