Meine Frage ist einfach: Wie erhalte ich die Produkt-IDs aus einer Handelsbestellung mit Drupal-Code? Ich habe im Moment so etwas:
$orders = commerce_order_load_multiple(array(), array('status' => 'pending'), TRUE);
foreach($orders as $order) {
foreach ($order->commerce_line_items['und'] as $line) {
$line_id = $line['line_item_id'];
// ... product id, where are you?
}
Hoffentlich kann jemand diese Frage beantworten :)
Antworten:
Ich kann mich nicht an die genaue Struktur des Commerce-Produktreferenzfelds erinnern, aber Sie müssen so etwas tun.
Warnung: Dieser Codestil funktioniert bei vielen Aufträgen nicht, da der interne Cache für die Werbebuchungsentitäten zu viel Speicher belegt. Dies ist ein Problem, wenn Sie Tausende von Bestellungen haben.
quelle
field_get_items()
, die Elemente aus dem Feld abzurufen und stattdessen zu wiederholen. Soforeach ($order->commerce_line_items['und'] as $line) { ... }
wird$items = field_get_items('commerce_order', $order, 'commerce_line_items'); foreach ($items as $line) { ... }
usw. Oder verwenden Sie entity_metadata_wrapper, der Sprachen automatisch berücksichtigt.Mit dem Entity Metadata Wrapper können Sie auch Folgendes tun:
Der wichtige Teil hier ist die Überprüfung des Typs der Werbebuchung, damit Sie keine Versandwerbebuchungen oder andere Arten von Werbebuchungen in Ihre Liste der Produkt-IDs aufnehmen. Außerdem wurde mit dem Wrapper darauf hingewiesen, dass ich den Rohwert des Felds commerce_product für die Werbebuchung verwendet habe. Dies liegt daran, dass der "Wert" das vollständig geladene Produkt ist, auf das verwiesen wird, während der "Rohwert" einfach die Produkt-ID ist.
quelle
Wenn Sie keine ganzen Objekte (Werbebuchungen, Bestellungen und Handelsprodukte) laden müssen, können Sie die Abfrage folgendermaßen ausführen:
quelle
JOIN {field_data_commerce_product} p ON (p.entity_id = li.line_item_id AND p.entity_type = 'commerce_line_item')