2017-04-04 7 views
1

Ich entwickle ein WooCommerce-Plugin für die Bestellung von Lebensmitteln für bestimmte Daten aus einem Kalender wie wöchentliche Liste.Bedingte spezifische Warenkorb-Artikel entfernen

Es gibt ein Zeitlimit für Bestellungen, Sie können für morgen jeden Tag bis 14:00 bestellen. Es funktioniert auf der Seite, auf der Sie die Artikel bestellen können (die Schaltflächen zum Hinzufügen zu Einkaufswagen werden nicht angezeigt, wenn das Limit erreicht wurde), aber wenn Sie bereits einen Artikel im Warenkorb haben, der nicht verfügbar ist, können Sie ihn nach 14:00 bestellen .

Ich habe irgendwo gelesen, dass es einen Aktionshaken für solche Aktionen gibt, also habe ich versucht, es selbst herauszufinden, bin aber steckengeblieben.

Eine kleine Einführung, wie es funktioniert. Wenn Sie auf die Schaltfläche "In den Warenkorb" klicken, wird das Objekt im Einkaufswagen mit einem benutzerdefinierten Meta-Tag erstellt, das die benötigten Informationen in diesem Format enthält: MenuCode-Year-WeekOfYear-DayOfWeek.

Der Name der Funktion ist wc_minimum_order_amount, weil es auch ein Stück Code enthält eine wc_notice zu zeigen, wenn der Betrag um weniger als eine bestimmte Menge ist. Dieser Teil wurde aus dem folgenden Code entfernt, da er für die Frage nicht relevant ist und funktioniert.

Und hier ist der Haken und der Code, den ich benutze:

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

Aber es die Elemente aus dem Warenkorb nicht entfernen, wie ich erwartet hatte.

Wie kann ich es funktionieren lassen?

Dank

Antwort

1

Hier bin ich mit woocommerce_before_calculate_totals Aktion Haken nur sollte, dass überall arbeiten.

Ich habe einige kleine Änderungen im Code gemacht:

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

Der Kodex geht in function.php Datei Ihres aktiven Kind Thema (oder Thema) oder auch in jeder Plugin-Datei.

Ich kann es nicht testen, da dies sehr spezifisch ist, aber das sollte funktionieren.

Verwandte Themen