检测当前用户是否具有有效订阅

时间:2017-02-22 22:52:22

标签: php wordpress woocommerce orders woocommerce-subscriptions

我正在使用WooCommerce在WordPress中开发一个网站。我正在使用额外的WC Paid ListingsWooCommerce Subscriptions插件来处理我的工作。

问题是当具有“订阅者”角色的用户具有活动订阅登录并且每次他/她必须选择包时尝试发布内容,即使他具有活动订阅。

有没有人知道如何检测用户是否有有效订阅,如果它返回true则会跳过选择包的步骤?

感谢。

2 个答案:

答案 0 :(得分:9)

更新(2019年)

  • 使用WooCommerce订阅wcs_user_has_subscription()的新条件函数。
  • 使用更轻的代码版本(SQL查询)的新条件函数。
  • 基于改进的WP_Query的原始增强条件函数。

以下自定义条件函数具有可选参数$user_id (已定义的user_id),并将在当前用户(或>当前用户)返回 true 已定义的用户)具有有效订阅。

所以现在可以使用3种不同方式完成此操作 (做同样的事情)

1)使用WooCommerce订阅专用条件函数wcs_user_has_subscription()

function has_active_subscription( $user_id='' ) {
    // When a $user_id is not specified, get the current user Id
    if( '' == $user_id && is_user_logged_in() ) 
        $user_id = get_current_user_id();
    // User not logged in we return false
    if( $user_id == 0 ) 
        return false;

    return wcs_user_has_subscription( $user_id, '', 'active' );
}

2)同样轻松的SQL查询(2019年3月添加)

function has_active_subscription( $user_id=null ) {
    // When a $user_id is not specified, get the current user Id
    if( null == $user_id && is_user_logged_in() ) 
        $user_id = get_current_user_id();
    // User not logged in we return false
    if( $user_id == 0 ) 
        return false;

    global $wpdb;

    // Get all active subscriptions count for a user ID
    $count_subscriptions = $wpdb->get_var( "
        SELECT count(p.ID)
        FROM {$wpdb->prefix}posts as p
        JOIN {$wpdb->prefix}postmeta as pm 
            ON p.ID = pm.post_id
        WHERE p.post_type = 'shop_subscription' 
        AND p.post_status = 'wc-active'
        AND pm.meta_key = '_customer_user' 
        AND pm.meta_value > 0
        AND pm.meta_value = '$user_id'
    " );

    return $count_subscriptions == 0 ? false : true;
}

代码放在活动子主题(或主题)的function.php文件中,或者放在任何插件文件中。

3)原始的增强代码,也会做同样的事情:

function has_active_subscription( $user_id=null ) {
    // When a $user_id is not specified, get the current user Id
    if( null == $user_id && is_user_logged_in() ) 
        $user_id = get_current_user_id();
    // User not logged in we return false
    if( $user_id == 0 ) 
        return false;

    // Get all active subscriptions for a user ID
    $active_subscriptions = get_posts( array(
        'numberposts' => 1, // Only one is enough
        'meta_key'    => '_customer_user',
        'meta_value'  => $user_id,
        'post_type'   => 'shop_subscription', // Subscription post type
        'post_status' => 'wc-active', // Active subscription
        'fields'      => 'ids', // return only IDs (instead of complete post objects)
    ) );

    return sizeof($active_subscriptions) == 0 ? false : true;
}

代码放在活动子主题(或主题)的function.php文件中,或者放在任何插件文件中。

更新使用情况:

1)当前用户的使用情况:

if( has_active_subscription() ){ // Current user has an active subscription 
    // do something … here goes your code

    // Example of displaying something
    echo '<p>I have active subscription</p>';
}

2)定义用户ID的使用:

if( has_active_subscription(26) ){ // Defined User ID has an active subscription 
    // do something … here goes your code

    // Example of displaying something
    echo '<p>User ID "26" have an active subscription</p>';
}

此代码经过测试且有效

相关答案:

答案 1 :(得分:3)

使用wcs_user_has_subscription()

$has_sub = wcs_user_has_subscription( '', '', 'active' );

if ( $has_sub) {
    // User have active subscription
}