【问题标题】:Conditionally remove specific cart items in Woocommerce有条件地删除 Woocommerce 中的特定购物车项目
【发布时间】:2017-08-29 07:40:00
【问题描述】:

我正在开发一个 WooCommerce 插件,用于从日历(如每周列表)中订购特定日期的食物。

下单有时间限制,您可以在每天的明天14:00之前下单。它适用于您可以订购商品的页面(如果达到限制,添加到购物车按钮将不会显示),但如果您的购物车中已有商品不可用,您可以在 14:00 之后订购.

我在某处读到此类动作有一个动作挂钩,所以我试图自己弄清楚但卡住了。

简单介绍一下它的工作原理。当您单击添加到购物车按钮时,将在购物车中创建带有自定义元标记的商品,其中包含我需要的以下格式的信息:MenuCode-Year-WeekOfYear-DayOfWeek。

函数的名称是wc_minimum_order_amount,因为它还包含一段代码,用于在订单金额小于指定金额时显示 wc_notice。这部分已从以下代码中删除,因为它与问题无关,并且有效。

这是我使用的钩子和代码:

add_action('woocommerce_checkout_process', 'wc_minimum_order_amount' );
add_action('woocommerce_before_cart' , 'wc_minimum_order_amount' );
function wc_minimum_order_amount() {
    $cart = WC()->cart->get_cart();
    foreach($cart as $item => $values) {
        $co   = explode('-', $values['_custom_options']);
        $year = $co[1];
        $week = $co[2];
        $day  = $co[3];
        $hour = date('H');

        if($year < date('Y')) {
            WC()->cart->remove_cart_item($item);
        }
        else if($year == date('Y') && $week < date('W')) {
            WC()->cart->remove_cart_item($item);
        }
        else if($year == date('Y') && $week == date('W') && $day < date('w')) {
            WC()->cart->remove_cart_item($item);
        }
        else if($year == date('Y') && $week == date('W') && $day == date('w') && $hour >= 14) {
            WC()->cart->remove_cart_item($item);
        }
    }
}

但它并没有像我预期的那样从购物车中删除商品。

我怎样才能让它工作?

谢谢

【问题讨论】:

    标签: php wordpress woocommerce cart custom-fields


    【解决方案1】:

    这里我只使用 woocommerce_before_calculate_totals 动作钩子,它应该可以在任何地方工作。

    我对你的代码做了一些小改动:

    add_action('woocommerce_before_calculate_totals', 'wc_minimum_order_amount', 10, 1 );
    function wc_minimum_order_amount( $cart ) {
    
        if ( is_admin() && ! defined( 'DOING_AJAX' ) )
            return;
    
        if ( did_action( 'woocommerce_before_calculate_totals' ) >= 2 )
            return;
    
        // Set here the time offset (in hours)
        $hours_offset = 14;
    
        $now_year      = date('Y');
        $now_year_week = date('W');
        $now_day_week  = date('w');
        $now_hour      = date('H');
    
        foreach($cart->get_cart() as $cart_item_key => $cart_item ) {
           if( isset($cart_item['_custom_options']) && ! empty($cart_item['_custom_options']) ){
                $date = explode('-', $cart_item['_custom_options']);
                $date_year      = $date[1];
                $date_year_week = $date[2];
                $date_day_week  = $date[3];
    
    
                if( $date_year < $now_year ) {
                    $remove_cart_item = true;
                    wc_add_notice( __( 'CASE1', 'woocommerce' ), 'notice' ); // Just for testing (to be removed)
                }
                elseif( $date_year == $now_year && $date_year_week < $now_year_week ) {
                    $remove_cart_item = true;
                    wc_add_notice( __( 'CASE2', 'woocommerce' ), 'notice' ); // Just for testing (to be removed)
                }
                elseif( $date_year == $now_year && $date_year_week == $now_year_week && $date_day_week < $now_day_week ) {
                    $remove_cart_item = true;
                    wc_add_notice( __( 'CASE3', 'woocommerce' ), 'notice' ); // Just for testing (to be removed)
                }
                elseif( $date_year == $now_year && $date_year_week == $now_year_week && $date_day_week == $now_day_week && $now_hour >= $hours_offset ) {
                    $remove_cart_item = true;
                    wc_add_notice( __( 'CASE4', 'woocommerce' ), 'notice' ); // Just for testing (to be removed)
                }
                else {
                    $remove_cart_item = false;
                    wc_add_notice( __( 'CASE0', 'woocommerce' ), 'notice' ); // Just for testing (to be removed)
                }
    
                if($remove_cart_item) {
                    $cart->remove_cart_item($cart_item_key);
                }
            }
        }
    }
    

    代码位于您的活动子主题(或主题)的 function.php 文件中或任何插件文件中。

    我无法测试它,因为这是非常具体的,但这应该可以。

    【讨论】:

    • 我不再做这个项目了,但是我在测试环境中尝试过,它工作,所以我接受了。它可能会帮助其他有同样问题的人......
    • @BalázsVarga 希望 18 个月后 :) ... 迟到总比没有好。谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-07-11
    • 1970-01-01
    • 1970-01-01
    • 2020-10-13
    • 1970-01-01
    • 1970-01-01
    • 2018-08-29
    相关资源
    最近更新 更多