2017-07-12 2 views
2

Ich versuche, einen geschätzten Liefertermin im Einkaufswagen basierend auf dem Lagerstatus der Produkte im Einkaufswagen auszugeben.Anzeigen eines geschätzten Lieferzeitraums basierend auf dem WooCommerce-Einkaufswagenartikelbestand

Ich war ein bisschen erfolgreich, aber jetzt bin ich fest.

Dies ist, was ich bisher geschrieben habe. Es geht in der function.php

function lieferzeit() { 

    global $woocommerce; 
     $cart_items = $woocommerce->cart->get_cart(); 
     foreach ($cart_items as $variation) { 
      $variation_id = $variation['variation_id']; 
     $variation_obj = new WC_Product_variation($variation_id); 
     $stock = $variation_obj->get_stock_quantity(); 
     } 
echo $stock; //outputs the in stock amount successfully 

} 


add_filter ('woocommerce_cart_collaterals', 'lieferzeit'); 

Jetzt versuche ich, den geschätzten Zeitpunkt hinzufügen, aber hier bin ich

function lieferzeit() { 

    global $woocommerce; 
     $cart_items = $woocommerce->cart->get_cart(); 
     foreach ($cart_items as $variation) { 
      $variation_id = $variation['variation_id']; 
     $variation_obj = new WC_Product_variation($variation_id); 
     $stock = $variation_obj->get_stock_quantity(); 
     } 

     for ($i=0; $i < count($stock) ; $i++) { 
      echo "Voraussichtliche Lieferung Date! "; 


     } 
} 

add_filter ('woocommerce_cart_collaterals', 'lieferzeit'); 

Hier das Datum ausgegeben werden definiert stecken haben. Ab heute +1 Tag bis heute +4 Tage. Aber ich habe keine Idee, wie ich das schaffen soll. Die beste Ausgabe wäre dieses Format:

Voraussichtliche Lieferung 14.7 - Mi. 19,7

ich nicht einmal bin shure wenn

for ($i=0; $i < count($stock) ; $i++) { 

ist der richtige Weg zu gehen.

Ich habe zwei Arten von Produkten, eine kann innerhalb von 1-4 Tagen und die andere innerhalb von 14-21 Tagen versendet werden. Jetzt ist das zweite Problem. Wenn beide Typen im Warenkorb sind, sollte die höhere Lieferzeit gewählt werden.

Gibt es einige Ideen?


Update:

Der Code sollte die Bestandsmenge der einzelnen Elemente im Warenkorb überprüfen. Wenn alle Artikel eine Bestandsmenge größer als 0 haben, sollte eine geschätzte Lieferzeit von 1 bis 4 Arbeitstagen als Datum angegeben werden.

Wenn es einen Artikel im Warenkorb mit einer Lagermenge von 0 oder darunter gibt, sollte eine geschätzte Lieferzeit von 14 - 21 Arbeitstagen als Datum angegeben werden. Auch wenn alle anderen Artikel im Einkaufswagen eine Bestandsmenge größer als 0 haben.

Arbeitstage sollten Montag bis Freitag sein. Sehr ordentlich wäre es, wenn der Code Feiertage erkennt, z.B. Weihnachten, Neujahr etc ..

Dank

Die Lösung von LoicTheAztec funktioniert perfekt. Jetzt habe ich versucht, weitere Optionen hinzuzufügen.

Es wäre schön, wenn der Ausgang der function lieferzeit() würde im Admin um Detailseite angezeigt werden. Um eine benutzerdefinierte Admin-Panel in der Sidebar erstelle ich

gefunden
add_action('add_meta_boxes', 'add_meta_boxes'); 
function add_meta_boxes() 
{ 
    add_meta_box( 
     'woocommerce-order-my-custom', 
     __('Order Custom'), 
     'order_my_custom', 
     'shop_order', 
     'side', 
     'default' 
    ); 
} 

function order_my_custom() 
{ 
    echo $lieferzeit; 
} 

from this post

Das funktioniert so weit und es gibt eine Bestellung Benutzerdefinierte Registerkarte in der Admin-Seite. Jetzt habe ich versucht, die Ausgabe von function lieferzeit() in einer Variablen zu speichern.

$from = str_replace($days_en, $days_ge, $from); 
$to = str_replace($days_en, $days_ge, $to); 

$lieferzeit = array($from, $to); 

Aber es scheint, dass function add_meta_boxes() und function order_my_custom() doen 'T nichts von der variablen $lieferzeit kennen.

Gibt es eine andere Möglichkeit zum Speichern und Abrufen der Ausgabe von function lieferzeit()?

+0

ich Ihre Frage über die Produkte nur noch gesehen haben. Stackoverflow ist ein bisschen chaotisch :) Ich benutze sowohl einzelne als auch variable Produkte. Aber Ihre Lösung funktioniert für beide Typen sehr gut! – Max

+0

** Ich habe meinen Code ** in Bezug auf einfachen und variablen Produktbestand aktualisiert ... ** Es sollte jetzt funktionieren ** ... * Sie könnten auch den Lagerstatus verwenden 'if ($ product_obj-> get_stock_status() ==' instock ') { 'oder' if ($ product_obj-> get_stock_status() == 'outofstock') {'* ... Ich hoffe diese Zeit ist OK – LoicTheAztec

Antwort

2

Update 3(einfache und variable Produkte Handhabung | hinzugefügt Übersetzungsfunktion):

Der folgende Code wird in den Warenkorb gelegt die Bestandsmenge der einzelnen Elemente überprüfen.

1) Wenn alle Artikel "auf Lager" sind, wird eine geschätzte Lieferzeit von 1 bis 4 Arbeitstagen als Datum angezeigt.

2) Wenn ein Artikel "nicht vorrätig" ist, wird eine geschätzte Lieferzeit von 14 bis 21 Werktagen als Datum angezeigt.

Aber ich werde Ferien nicht

erkennen ist hier, dass Code:

add_filter ('woocommerce_cart_collaterals', 'lieferzeit'); 
function lieferzeit() { 

    $all_items_in_stock = true; // initializing 

    // Iterating through cart items (to get the stock info) 
    foreach (WC()->cart->get_cart() as $cart_item) { 

     # HANDLING SIMPLE AND VARIABLE PRODUCTS 

     // Variable products 
     $variation_id = $cart_item['variation_id']; 
     if(0 != $variation_id) { 
      $variation_obj = new WC_Product_variation($variation_id); 
      $stock = $variation_obj->get_stock_quantity(); 
     } else { 
      // Simple products 
      $product_id = $cart_item['product_id']; 
      $product_obj = new WC_Product($product_id); 
      $stock = $product_obj->get_stock_quantity(); 
     } 

     if($stock <= 0){ 
      // if an item is out of stock 
      $all_items_in_stock = false; 
      break; // We break the loop 
     } 
    } 

    // Items "in stock" (1 to 4 week days) 
    if($all_items_in_stock){ 
     for($start=0, $count=-1 ; $count < 4; $start++){ 
      $weekdays = date('w', strtotime("+$start days")); 
      if($weekdays > 0 && $weekdays < 6){ 
       $count++; 
      echo date('D j (w)', strtotime("+$start days")).', '; 
       if($count == 1){ 
        $from = date('D. j/n', strtotime("+$start days")); 
       } elseif($count == 4) { 
        $to = date('D. j/n', strtotime("+$start days")); 
       } 
      } 
     } 
    } else { // 1 is Items Out of stock (14 to 21 week days) 
     for($start=0, $count=-1 ; $count < 21; $start++){ 
      $weekdays = date('w', strtotime("+$start days")); 
      if($weekdays > 0 && $weekdays < 6){ 
       $count++; 
       if($count == 14){ 
        $from = date('D. j/n', strtotime("+$start days")); 
       } elseif($count == 21) { 
        $to = date('D. j/n', strtotime("+$start days")); 
       } 
      } 
     } 
    } 
    ## TRANSLATION ## 

    // DAYS IN ENGLISH (Source) 
    $days_en = array('Mon','Tue','Wed','Thu','Fri'); 

    // TRANSLATE the DAYS in GERMAN (replacement) 
    $days_ge = array('Mmm','Ttt','Www','Thh','Fff'); 

    $from = str_replace($days_en, $days_ge, $from); 
    $to = str_replace($days_en, $days_ge, $to); 

    ## OUTPUT ## 

    echo "<br><br>Estimated shipping $from - $to"; 
} 

-Code geht in function.php Datei Ihrer aktiven Kind Thema (oder Thema) oder auch in jedem Plugin Datei.

Dieser Code ist getestet und arbeitet

+0

Hallo LoicTheAztec, Vielen Dank für Ihre Hilfe !! Das ist unglaublich. Ich weiß nicht, wie viele Tage ich ohne deine Hilfe dafür ausgegeben hätte. Die einzige Sache, die komplizierter scheint, als ich dachte, ist es, eine Ausgabe in Deutsch zu bekommen. Ich mag dieses Format '('D, j.n.', strtotime (" + $ Starttage "))' viel. Aber eine einfache Ergänzung von 'setlocale (LC_TIME," de_DE ");' wird nicht funktionieren. Und ersetzen Sie alle strtotime mit strftime funktioniert nicht auch. Selbst wenn ich das Datumsformat auf '% a,% d.% M' ändere. – Max

+0

Es gibt etwas, das ich erst jetzt entdeckt habe. Ich dachte, es funktioniert mit einzelnen Produkten. Dies ist nur möglich, wenn das einzelne Produkt nicht auf Lager ist. Für ein einzelnes Produkt, das auf Lager ist und die kurze Lieferzeit hat, zeigt es nur die lange Lieferzeit an. Ich habe versucht, dies an den Anfang hinzuzufügen, aber es hat nicht geholfen. '$ einfache_id = $ cart_item ['simple_id']; $ simple_obj = neu WC_Product_simple ($ simple_id); $ stock_simple = $ simple_obj-> get_stock_quantity(); ' Und dann habe ich foeing hinzugefügt. 'if ($ variation_obj-> get_stock_quantity() <= 0 xor $ simple_obj-> get_stock_quantity() <= 0) {' – Max

+0

Es funktioniert jetzt perfekt! Ich habe eine kleine Änderung vorgenommen, so dass auch Produkte mit weniger als 0 Lagerbestand in dem Zustand sind. Ich habe 'if (0 == $ stock)' zu 'if ($ stock <= 0)' geändert – Max

Verwandte Themen