Woocommerce:在所有商店

时间:2016-02-13 14:35:31

标签: php wordpress woocommerce checkout

首次购买任何产品后,有没有办法阻止登录用户购买任何产品?

我想限制每个订阅只购买一个产品,然后在任何产品上都没有商店,只有新订阅。

我发现了一个过滤器几乎可以满足我的需求,但每个产品只能限制一个,

add_filter('woocommerce_add_to_cart_validation','rei_woocommerce_add_to_cart_validation',20, 2);
function rei_woocommerce_add_to_cart_validation($valid, $product_id){
    $current_user = wp_get_current_user();
    if ( wc_customer_bought_product( $current_user->user_email, $current_user->ID, $product_id)) {
        wc_add_notice( __( 'Purchased', 'woocommerce' ), 'error' );
        $valid = false;
    }
    return $valid;
}

但我需要在首次购买订阅后锁定所有其他产品。

也许最好的方法是当用户点击在结账页面支付产品时(此时他需要登录)并检查他是否已经购买过任何产品..如果是的话,他不能支付,只有新订阅...

我对编码很难看。有人可以帮我解决这个问题吗?

3 个答案:

答案 0 :(得分:1)

这里是一种解决方案,用于每个购物车一个订阅,如果您将订阅用作产品,则为成员资格。希望我知道可以归功于谁,但我已经在魔术包中放了一段时间了。

/**
 * c.)
 * @return (bool)
 */
add_filter( 'woocommerce_add_to_cart_validation','wpso35381172_validate_block_one_sub', 10, 2 );
function wpso35381172_validate_block_one_sub( $valid, $product_id ) {
// Get the current product
$current_product = wc_get_product( $product_id );
// See if the current product user's are viewing is a subscription product
if ( $current_product instanceof WC_Product_Subscription || 
     $current_product instanceof WC_Product_Variable_Subscription ) {
    foreach( WC()->cart->get_cart() as $cart_item_key => $values ) {
        // Loop through all products in the cart
        $_product = $values['data'];
        // Check if current item is a subscription type
        if( $_product instanceof WC_Product_Subscription || 
            $_product instanceof WC_Product_Subscription_Variation ) {
            // Display a notice and cancel the addition of item to cart
 wc_add_notice( "Only one Subscription or Membership plan can be purchased." );
                return false;
            }
        }
    }
    return $valid;
}

这适用于WC 3.0及更高版本,并使用WCS_类的实例。

答案 1 :(得分:0)

对于那些正在寻找相同答案的人来说,这就是我所做的:

// Get all customer orders
$customer_orders = get_posts( array(
    'numberposts' => -1,
    'meta_key'    => '_customer_user',
    'meta_value'  => get_current_user_id(),
    'post_type'   => wc_get_order_types(),
    'post_status' => array( 'wc-pending', 'wc-processing', 'wc-on-hold', 'wc-completed' ),

) );

// Order count
$order_count = 1;

if ( count( $customer_orders ) >= $order_count ) {
    add_filter( 'woocommerce_is_purchasable', false );
}

答案 2 :(得分:0)

我在阅读OP的要求略有不同。也就是说,每个用户一次只能拥有一个订阅。为此,这是我的解决方案:

add_filter( 'woocommerce_add_to_cart_validation','so_validate_block_one_sub', 10, 2 );
function so_validate_block_one_sub( $valid, $product_id ) {
    $has_sub = wcs_user_has_subscription( '', '', 'active' );
    if ( $has_sub ) {
        wc_add_notice( __("You can not have more than one subscription.", "so-additions") );

        return false;
    }

}