在 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 中检查挂钩功能破坏网站上的用户角色的主要内容,如果未能解决你的问题,请参考以下文章

Woocommerce 产品自定义评论标签挂钩

WooCommerce订阅 - 续订时未触发动作挂钩

Woocommerce - 创建优惠券时挂钩

WooCommerce 支付完成挂钩

在“woocommerce_package_rates”挂钩中自定义税额

如何防止在 WooCommerce 电子邮件通知中运行挂钩