有条件地删除Woocommerce

时间:2017-04-04 08:03:37

标签: php wordpress woocommerce cart custom-fields

我正在开发一个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);
        }
    }
}

但它不会像我期待的那样从购物车中移除物品。

我怎样才能让它发挥作用?

由于

1 个答案:

答案 0 :(得分:2)

此处我仅使用 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文件中,或者放在任何插件文件中。

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