2017-04-04 26 views
1

私は、毎週のようなカレンダーから特定の日付の食品を注文するためのWooCommerceプラグインを開発しています。特定のカートアイテムを条件付きで削除する

ご注文の期限がありますが、明日は14:00まで毎日ご注文いただけます。それはあなたが項目を注文することができるページで動作します(制限に達するとカートに追加ボタンは表示されません)。しかし、カートにはすでに商品があり、利用不可能な場合は14:00以降に注文できます。

私はそのようなアクションのためのアクションフックがあると読んでいるので、私はそれを理解しようとしましたが、固まってしまいました。

どのように動作するかについて少し紹介します。カートに追加ボタンをクリックすると、カスタムメタタグ付きカートにアイテムが作成されます。メニューには、MenuCode-Year-WeekOfYear-DayOfWeekの形式で必要な情報が含まれています。

注文金額が指定された金額未満の場合、wc_noticeを表示するコードも含まれているため、機能名はwc_minimum_order_amountです。この部分は以下のコードから削除されました。なぜなら、それはその質問とは無関係であり、動作するからです。ここ

とは、フックと私が使用するコードです:

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

ここで私はどこでも動作するはずだけwoocommerce_before_calculate_totalsアクションフックを、使用しています。私はあなたのコード内のいくつかの小さな変更を行った

add_action('woocommerce_before_calculate_totals', 'wc_minimum_order_amount', 10, 1); 
function wc_minimum_order_amount($cart_obj) { 

    // 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_obj->get_cart() as $cart_item_key => $cart_item_values) { 
     $custom_options = $cart_item_values['_custom_options']; 
     // Applying code below only if "_custom_options" is defined 
     if(empty($custom_options)){ 

      $date = explode('-', $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_obj->remove_cart_item($cart_item_key); 
      } 
     } 
    } 
} 

をコードは、どのプラグインファイルでも、あなたのアクティブな子テーマ(またはテーマ)のfunction.phpファイルになりますか。

これは非常に具体的なのでテストできませんが、これはうまくいくはずです。

関連する問題