web-dev-qa-db-ja.com

現在のユーザーがアクティブなサブスクリプションを持っているかどうかを検出する

WordPress with WooCommerceでウェブサイトを開発しています。さらに WC有料リストWooCommerceサブスクリプション プラグインを使用して作業を処理しています。

問題は、アクティブなサブスクリプションログインを持つ「サブスクライバー」ロールを持つユーザーが、アクティブなサブスクリプションを持っていても、パッケージを選択する必要があるたびにコンテンツを投稿しようとする場合です。

ユーザーがアクティブなサブスクリプションを持っているかどうかを検出する、trueが返された場合、パッケージを選択する手順をスキップする方法を知っている人はいますか?

ありがとう。

9
Knight

更新(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>';
}
_

このコードはテストされ、機能します


関連する回答:

11
LoicTheAztec

wcs_user_has_subscription()を使用する

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

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