Mi pregunta es simple: ¿cómo obtengo la identificación del producto de una orden comercial con código Drupal? Tengo algo como esto en este momento:
$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?
}
Esperemos que alguien pueda responder esta pregunta :)
Respuestas:
No recuerdo la estructura exacta del campo de referencia del producto comercial, pero debe hacer algo como esto.
Advertencia: este estilo de código no funcionará en muchos pedidos, ya que la memoria caché interna para las entidades de línea de pedido usará demasiada memoria. Esto será un problema si tiene miles de pedidos.
fuente
field_get_items()
para obtener los elementos del campo e iterar a través de ella. Entonces seforeach ($order->commerce_line_items['und'] as $line) { ... }
convierte$items = field_get_items('commerce_order', $order, 'commerce_line_items'); foreach ($items as $line) { ... }
, etc. O, usa entity_metadata_wrapper, que automáticamente toma en cuenta los idiomas.Usando el contenedor de metadatos de la entidad, también podría hacer:
La parte importante aquí es verificar el tipo de línea de pedido, para que no termine incluyendo líneas de envío u otros tipos de líneas de pedido en su lista de ID de productos. Además, con el aviso de contenedor que utilicé el valor "sin procesar" del campo commerce_product en la línea de pedido. Esto se debe a que el "valor" sería el producto referenciado completamente cargado, mientras que el valor "en bruto" es simplemente el ID del producto.
fuente
Si no necesita cargar objetos completos (líneas de pedido, pedidos y productos comerciales), puede ejecutar una consulta como esta:
fuente
JOIN {field_data_commerce_product} p ON (p.entity_id = li.line_item_id AND p.entity_type = 'commerce_line_item')