【问题标题】:Show/Hide content based on number of active memberships from user根据用户的活跃会员数量显示/隐藏内容
【发布时间】:2019-10-24 08:26:10
【问题描述】:

使用简码,我需要根据用户拥有的活跃会员数量来显示内容,无论他是哪个会员计划的会员。

我并不是很喜欢 PHP,但我发现 wc_memberships_get_user_memberships 函数存在,所以我想以这种方式开始。但这几乎是我的极限:

add_shortcode('count-active-memberships', 'count_active_memberships');
function count_active_memberships(){
$user_id = get_current_user_id();

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

$active_memberships = count(wc_memberships_get_user_memberships( $user_id, $args ));
}

最后应该是这样的

[count-active-memberships="3"] 拥有 3 个活跃会员的会员的内容 [/count-active-memberships]

感谢您的帮助

【问题讨论】:

    标签: php wordpress woocommerce woocommerce-memberships


    【解决方案1】:

    当您注册一个简码时,您的回调函数 count_active_memberships() 最多接收 2 个参数:

    • 参数数组(传递给简码的参数),以及
    • 短代码中的内容([count-active-memberships] 这是内容 [/count-active-memberships])。

    如果您只想在当前用户拥有 3 个或更多活跃会员时才显示某些内容,您可以这样做:

    add_shortcode('count-active-memberships', 'count_active_memberships');
    function count_active_memberships($atts, $content = ''){
        $user_id = get_current_user_id();
    
        // The user is logged in, check memberships
        if ( $user_id ) {
            $args = array( 
                'status' => 'active'
            );
            $active_memberships = wc_memberships_get_user_memberships($user_id, $args);
    
            if ( is_array($active_memberships) && count($active_memberships) >= 3 ) {
                return $content;
            }
        }
    
        // User is either not logged in or doesn't have enough active memberships
        // so let's return an empty string.
        return '';
    }
    

    现在,如果您希望用户可以配置所需的最低成员数,您需要在注册短代码的函数内定义一个新属性(例如min_memberships)。例如:

    add_shortcode('count-active-memberships', 'count_active_memberships');
    function count_active_memberships($atts, $content = ''){
        // Shortcode attributes
        $atts = shortcode_atts(array(
            'min_memberships' => 3
        ), $atts, 'count-active-memberships');
    
        // Let's make sure that the value passed by the user is a number
        if (
            ! is_numeric($atts['min_memberships']) 
            || $atts['min_memberships'] < 0
        ) {
            $atts['min_memberships'] = 3; // Fallback to minimum 3 memberships
        }
    
        $user_id = get_current_user_id();
    
        // The user is logged in, check memberships
        if ( $user_id ) {
            $args = array( 
                'status' => 'active'
            );
            $active_memberships = wc_memberships_get_user_memberships($user_id, $args);
    
            if (
                is_array($active_memberships) 
                && count($active_memberships) >= $atts['min_memberships']
            ) {
                return $content;
            }
        }
    
        // User is either not logged in or doesn't have enough active memberships
        // so let's return an empty string.
        return '';
    }
    

    然后你就可以做这样的事情了:

    [count-active-memberships min_memberships=5]
    Content visible to users with 5 or more active memberships
    [/count-active-memberships]
    

    【讨论】:

    • 您好 cabrerahector,感谢您的意见,这对我有很大帮助。第二种解决方案看起来不错,但我不需要“超过”部分,前提是会员数量严格等于在短代码中输入的数量。有什么想法吗?
    • 这很简单,只需将:count($active_memberships) &gt;= $atts['min_memberships'] 更改为 count($active_memberships) == $atts['min_memberships']。另外,如果我的回答有帮助,请考虑marking it as accepted
    • 你是我的救星 :) 非常感谢,这太完美了!
    猜你喜欢
    • 2019-10-01
    • 2011-08-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-16
    • 2020-12-02
    • 2011-01-15
    • 1970-01-01
    相关资源
    最近更新 更多