在 WooCommerce 中检查挂钩功能破坏网站上的用户角色
Posted
技术标签:
【中文标题】在 WooCommerce 中检查挂钩功能破坏网站上的用户角色【英文标题】:Checking user role on a hooked function breaking website in WooCommerce 【发布时间】:2021-07-03 12:11:35 【问题描述】:如果存在特定用户,我正在尝试向“我的帐户”页面添加一个选项卡。
我创建了一个check_user_role
函数来检查特定角色是否存在。
如果premium_member
角色存在,则应在“我的帐户”页面中添加一个额外的选项卡。
现在,当我添加 check_user_role
函数时,它会破坏我的网站。
一切都在functions.php
文件中
function check_user_role($roles, $user_id = null)
if ($user_id) $user = get_userdata($user_id);
else $user = wp_get_current_user();
if (empty($user)) return false;
foreach ($user->roles as $role)
if (in_array($role, $roles))
return true;
return false;
// ------------------
// 1. Register new endpoint (URL) for My Account page
// Note: Re-save Permalinks or it will give 404 error
function vehicle_intake_form_endpoint()
add_rewrite_endpoint( 'vehicle-intake-form', EP_ROOT | EP_PAGES );
add_action( 'init', 'vehicle_intake_form_endpoint' );
// ------------------
// 2. Add new query var
function vehicle_intake_form_query_vars( $vars )
$vars[] = 'vehicle-intake-form';
return $vars;
add_filter( 'query_vars', 'vehicle_intake_form_query_vars', 0 );
// ------------------
// 3. Insert the new endpoint into the My Account menu
if(check_user_role(array('premium_member')))
function vehicle_intake_form_link_my_account( $items )
$items['vehicle-intake-form'] = 'Vehicle Intake Form';
return $items;
add_filter( 'woocommerce_account_menu_items', 'vehicle_intake_form_link_my_account' );
// ------------------
// 4. Add content to the new tab
function vehicle_intake_form_content()
echo '<h3>Premium WooCommerce Support</h3><p>Welcome to the WooCommerce support area. As a premium customer, you can submit a ticket should you have any WooCommerce issues with your website, snippets or customization. <i>Please contact your theme/plugin developer for theme/plugin-related support.</i></p>';
//echo do_shortcode( ' /* your shortcode here */ ' );
add_action( 'woocommerce_account_vehicle-intake-form_endpoint', 'vehicle_intake_form_content' );
【问题讨论】:
你检查错误日志了吗?你遇到了什么错误? 【参考方案1】:您的If
语句需要在函数内部,而不是在函数外部。
你可以使用current_user_can()
function,但是在你的钩子函数里面像:
add_filter( 'woocommerce_account_menu_items', 'vehicle_intake_form_link_my_account' );
function vehicle_intake_form_link_my_account( $items )
if( current_user_can('premium_member') )
$items['vehicle-intake-form'] = __('Vehicle Intake Form');
return $items;
或者使用check_user_role()
revisited 函数在你的钩子函数中使用,例如:
function check_user_role( $roles, $user_id = null )
$user = $user_id ? new WP_User( $user_id ) : wp_get_current_user();
if ( is_a($user, 'WP_User') && count( array_intersect($roles, $user->roles) ) > 0 )
return true;
return false;
add_filter( 'woocommerce_account_menu_items', 'vehicle_intake_form_link_my_account' );
function vehicle_intake_form_link_my_account( $items )
if( check_user_role( array('premium_member') ) )
$items['vehicle-intake-form'] = __('Vehicle Intake Form');
return $items;
代码位于活动子主题(或活动主题)的functions.php 文件中。经过测试并且可以工作。
【讨论】:
写完这篇文章后,我想到了这个确切的解决方案。我意识到我做错了什么。以上是关于在 WooCommerce 中检查挂钩功能破坏网站上的用户角色的主要内容,如果未能解决你的问题,请参考以下文章