WooCoomerce成员资格-管理员当前没有成员资格

时间:2018-07-12 11:16:44

标签: php wordpress woocommerce

我正在尝试将WooCommerce会员资格与一些自定义高级自定义字段代码和Timber / Twig Wordpress设置集成在一起。我发现good function here用于检查用户是否可以访问内容。不幸的是,当我的管理员角色甚至没有访问权限时,我遇到了一些困难。在调试中,我发现使用当前用户ID调用wc_memberships_get_user_memberships时,它将在我的管理员用户上返回NULL。此后,我添加了一项检查,以查看用户是shop_manager还是管理员,并始终为他们返回true。

function can_user_access_content($user_id,$post_id){

    // bail if Memberships isn't active
    if ( ! function_exists( 'wc_memberships' ) ) {
        return true;
    }

    $user = get_user_by('id',$user_id);
    if ( in_array( 'administrator', (array) $user->roles ) || in_array( 'shop_manager', (array) $user->roles ) ) {
        //The user has the "administrator" or "shop manager" role
        return true;
    }

    //check if there's a force public on this content
    if(get_post_meta($post_id,'_wc_memberships_force_public',true)=='yes') return true;

    $args = array( 'status' => array( 'active' ));

    $plans = wc_memberships_get_user_memberships( $user_id, $args );

    $user_plans = array();

    foreach($plans as $plan){
        array_push($user_plans,$plan->plan_id);
    }
    $rules = wc_memberships()->get_rules_instance()->get_post_content_restriction_rules( $post_id );

    if(!count($rules)) {
        return true;
    }

    foreach($rules as $rule){
        if(in_array($rule->get_membership_plan_id(), $user_plans)){
            return true;
        }
    }
    return false;
}

这是实现此目标的正确方法吗?我也在努力寻找一种方法来检索要显示的页面/帖子/产品的相应“内容不可用”消息。如果内容受限制,我将回到常规的帖子内容显示中,这些内容通常会在我的WC会员资格中过滤掉消息,但这似乎并不总是有效。会喜欢一些更简单的方法。

任何帮助将不胜感激!

2 个答案:

答案 0 :(得分:0)

该插件已经为此提供了功能:

https://docs.woocommerce.com/document/woocommerce-memberships-function-reference/#wc_memberships_is_product_viewing_restricted

function wc_memberships_is_product_viewing_restricted( $post_id = null )

似乎他们已经处理了管理员逻辑,因为在FAQ中,他们指出:

  

作为您网站上的管理员(或商店经理)用户,没有任何内容   将仅限于您,以便您可以轻松地管理自己的网站。

答案 1 :(得分:0)

我直接联系了WooCoomerce开发人员,并得到以下答复:

  

您的方法对我来说看起来不错。不幸的是,你是对的   不是用于检查当前   内容可供当前用户访问。它需要写   作为自定义功能,就像您在此处所做的一样。

     

结合使用以下方法可能还有其他方法   wc_memberships_get_user_memberships()和   wc_memberships_is_user_active_member(),但您采用的方法   对我来说还可以。

因此上述方法似乎还可以。