2016-07-09 18 views
1

Ich versuche, die zugehörige Bestellung (die Bestell-ID) von einer der Werbebuchungs-ID abzurufen.Woocommerce Holen Sie sich die order_id von einem der item_id?

Ein Fall zum Beispiel: Wenn eine Bestellung bearbeiten, und eine Position Löschen (done von Ajax) die WooCommerce liefern nur den Haken "woocommerce_before_delete_order_item" und übergibt nur $item_id. (Die Woo-Funktion führt sql und nicht die WP-Umgebung aus). Ich brauche die "gehörende" Order-ID, um etwas zu tun!

Meine bisherige Lösung besteht darin, alle Bestellungen zu durchlaufen und die Artikel-ID zu vergleichen und die Auftrags-ID zu brechen und zurückzugeben, wenn die Übereinstimmung auftritt.

Dies ist viel zu langsam, oder "sperrig ungeschickt", wenn 10000 Bestellungen und mehr im aktuellen Shop lebendig zu halten.

funktioniert das nicht:

wp_get_post_parent_id ($item_id)

Aber Im Hoffnung, es einen ähnlichen Anruf ist, oder muss ich eine DB SQL Suche machen? Jede Antwort mit mySQL, bitte machen Sie es "Kopieren und Einfügen bereit". Ich bin großartig in PHP, aber nicht handle oder nie mein eigenes SQL schreiben.

Danke für jede Hilfe! Im Folgenden finden Sie meine Lösung so weit:

$order_id = my_wc_get_order_from_item_id($item_id); 

function my_wc_get_order_from_item_id($id) { 

    $orders = get_posts('post_type=shop_order&numberposts=-1&post_status=publish'); 
    foreach($orders as $obj) { 
     $order = new WC_Order($obj->ID); 
     if (count($order->get_items('line_item')) > 0) { 
      foreach($order->get_items('line_item') as $item_id => $item) { 
       if($item_id == $id) $return_value = $obj->ID; 
       if(isset($return_value)) break; 
      } 
     } 
     unset($order); 
     if(isset($return_value)) break; 
    } 

    if(isset($return_value)) return $return_value; 
     else return 0; 
} 

Antwort

1

Ihr Ansatz hat nicht funktioniert, weil Auftragspositionen in der wp_posts Tabelle keine Beiträge sind, so dass sie nicht eine post_parent haben.

Allerdings ist nicht alles verloren und das war einfacher als ich erwartet hatte, da mein SQL nicht so stark ist. Mit Blick auf die woocommerce_order_item Tabelle in der Datenbank können Sie sehen, dass order_id und order_item_id sind beide dort: woocommerce_order_item table

so lieh ich mir ein wenig SQL-Anweisung aus WooCommerce und modifiziert sie die order_id eine bestimmte order_item_id Reihe gegeben zu finden. Lass mich wissen, wie das geht.

function so_38286531_get_order_item_order_id($item_id) { 
    global $wpdb; 

    $order_id = $wpdb->get_var($wpdb->prepare(
     "SELECT order_id FROM {$wpdb->prefix}woocommerce_order_items 
     WHERE order_item_id = %d", 
     $item_id 
    )); 

    return $order_id; 
} 
+0

Ausgezeichnet: https://docs.woothemes.com/wc-apidocs/source-class-WC_Abstract_Order.html#1239 – LoicTheAztec

+0

Dank! Was ist der Link zu? Die Zeilennummer zeigt auf "line_tax", was nicht mit dieser Frage/Antwort zusammenhängt. – helgatheviking

+0

Anscheinend haben sie ein Problem mit Zeilennummern auf WC API DOCS. Weil, wenn Sie auf meine URL schauen, zeigt Linie 1239, aber es zeigt Linie 1277 ... Linie 1239 ist Ihrem Code sehr ähnlich und ist verwandt mit get_items() Funktion – LoicTheAztec

Verwandte Themen