web-dev-qa-db-ja.com

WooCommerceサブスクリプション-ユーザーに1つのアクティブなサブスクリプションのみを許可する

私は私のクライアントのためにメンバーシップ/サブスクリプションベースのサイトを構築中です。彼らはwoocommerceサブスクリプションを使用しています( https://woocommerce.com/products/woocommerce-subscriptions )。問題は、クライアントが基本的にユーザーがアップグレードを購入できるようにするいくつかのプロモーションページを作成していることです。これで問題ありませんが、クライアントは一度に1つのサブスクリプション(および関連するメンバーシップ[ https://woocommerce.com/products/woocommerce-memberships/] )のみを顧客に要求します。

したがって、合意された解決策は、新しいサブスクリプション/製品の購入時に、他のすべてのサブスクリプションをキャンセルすることです。関連するすべてのメンバーシップは削除/キャンセルされ、最新のサブスクリプションのみが、付随するメンバーシップと共にアクティブなままになります。

だから私はこのソリューションを構築しようとしましたが、うまくいかないので、アドバイス/指示は大歓迎です!

function wp56908_new_order_Housekeeping ($order_id)
{
    $args = array(
        'subscriptions_per_page' => -1,
        'customer_id'            => get_current_user_id(),
    );

    $subscriptions = wcs_get_subscriptions($args);

    foreach ($subscriptions as $subscription) {
        $s_order_id = method_exists( $subscription, 'get_parent_id' ) ? $subscription->get_parent_id() : $subscription->order->id;
        if ($s_order_id != $order_id) {
            $cancel_note = 'Customer purchased new subscription in order #' . $order_id;
            $subscription->update_status( 'cancelled', $cancel_note );
        }
    }
}
1
Johan Rheeder

誤解がない限り、WCサブスクリプションには既にこの機能があります。

まず、サブスクリプション製品を複数の個別製品ではなく、可変またはグループ化するように設定します。

サブスクリプション製品を設定して購入を制限します。 https://docs.woocommerce.com/document/subscriptions/store-manager-guide/#limit-subscription

次に、切り替えの許可を有効にします。 https://docs.woocommerce.com/document/subscriptions/switching-guide/#section-2

役立つことを願っています

3
Peter HvD

私はこの問題に直面していたので、カートに何かを入れる前にユーザーがアクティブなサブスクリプションを持っているかどうかを確認します。

woocommerce_add_to_cart_validationというフックがあります。

そのため、次のようなフィルターを追加できます。

add_filter( 'woocommerce_add_to_cart_validation', 'check_subscriptions', 10, 2 );

ユーザーが次のようなアクティブなサブスクリプションを持っているかどうかを確認するよりも:

$user_id = get_current_user_id();

$active_subscriptions = get_posts( array(
'numberposts' => -1,
'meta_key' => '_customer_user',
'meta_value' => $user_id,
'post_type' => 'shop_subscription',
'post_status' => 'wc-active',

) );
if(!empty($active_subscriptions)) return true;
else return false;

私は彼について初心者向けの読みやすい小さなブログ記事を書きました: http://robinhenniges.com/woocommerce-subscription-allow-only-one-active-subscription/

1
Rob Anderson