简体   繁体   English

Woocommerce每周允许购买一次

[英]One purchase allowed per week in Woocommerce

I am creating an e-commerce website. 我正在创建一个电子商务网站。 What can I add to the functions.php file of my theme to allow a customer to purchase only one product from the store and then disable any other purchases for 1 week? 我可以添加到我的主题的functions.php文件中,以允许客户只从商店购买一个产品,然后禁用任何其他购买1周?

The customer can buy any product but after the purchase, no further purchase of any sort can be done for one week. 顾客可以购买任何产品,但购买后,一周内不能再进行任何购买。 The customer can make any other purchases after one week only. 客户只能在一周后进行任何其他购买。

I could only disable purchases made for a product using this code: 我只能使用此代码禁用对产品的购买:

add_filter( 'woocommerce_add_cart_item_data', 'woo_allow_one_item_only' );

function woo_allow_one_item_only( $cart_item_data ) {

global $woocommerce;
$woocommerce->cart->empty_cart();

// Do nothing with the data and return
return $cart_item_data;

} 

$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 );
}

Update from July 2018 - Enhanced lighter and more effective version code 从20187月更新 - 增强了更轻,更有效的版本代码

  • Simplified product add to cart validation 简化的产品添加到购物车验证
  • Better and much more lighter way to check if user has purchased in the passed week (embeded in a reusable conditional function) . 检查用户是否在过去的一周中购买了更好,更轻松的方法(嵌入在可重复使用的条件函数中)
  • Added cart and checkout validation. 添加了购物车和结帐验证。

The following code will allow costumer to add only one item to cart and will allow only one purchase by week , displaying error notices when needed, avoiding any prohibited purchases. 以下代码将允许客户仅向购物车添加一个商品,并且每周仅允许一次购买 ,在需要时显示错误通知,避免任何禁止购买。

The code: 代码:

// Utility conditional function (Check if user has purchased in the passed week)
function has_week_purshases( $user_id = 0 ){
    global $wpdb;

    $customer_id = $user_id > 0 ? $user_id : get_current_user_id();

    $count = $wpdb->get_var( "
        SELECT COUNT(p.ID)
        FROM {$wpdb->prefix}posts as p
        INNER JOIN {$wpdb->prefix}postmeta as pm ON p.ID = pm.post_id
        WHERE p.post_type LIKE 'shop_order'
        AND pm.meta_key LIKE '_customer_user'
        AND pm.meta_value = $customer_id
        AND UNIX_TIMESTAMP(p.post_date) >= (UNIX_TIMESTAMP(NOW()) - (86400 * 7))
    " );

    return $count > 0 ? true : false;
}

// product add to cart validation
add_filter( 'woocommerce_add_to_cart_validation', 'conditionally_allowing_product_added_to_cart', 10, 3 );
function conditionally_allowing_product_added_to_cart( $passed, $product_id, $quantity) {
    // If cart is not empty, customer will not be allowed and a notice will be displayed
    if ( ! WC()->cart->is_empty() ){
        // Display an error notice if there is already an item in cart
        wc_add_notice( __("You can only add an item to cart"), 'error' );
        $passed = false; // Not Allowed
    } elseif ( is_user_logged_in() && has_week_purshases() ) {
        // Display an error notice when customer is not allowed yet
        wc_add_notice( __("You are not allowed yet to add any product in cart"), 'error' );
        $passed = false; // Not Allowed
    }
    return $passed;
}

// Cart and checkout validation
add_action( 'woocommerce_check_cart_items', 'conditionally_allowing_checkout' );
add_action( 'woocommerce_checkout_process', 'conditionally_allowing_checkout' );
function conditionally_allowing_checkout() {
    if ( sizeof(WC()->cart->get_cart()) > 1 ) {
        // Display an error notice if there is more than 1 item in cart
        wc_add_notice( _("You can only have only one item in cart"), 'error' );
    } elseif ( is_user_logged_in() && has_week_purshases() ) {
        // Display an error notice when customer is not allowed yet
        wc_add_notice( __("You are not allowed yet to make purchases"), 'error' );
    }
}

The code goes in function.php file of your active child theme (or active theme). 代码放在活动子主题(或活动主题)的function.php文件中。 Tested and works. 经过测试和工作。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM