Minha pergunta é simples: como obtenho os IDs de produtos de uma ordem comercial com código Drupal? Eu tenho algo assim no 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?
}
Espero que alguém seja capaz de responder a esta pergunta :)
Respostas:
Não me lembro da estrutura exata do campo de referência do produto comercial, mas você precisa fazer algo assim.
Aviso: este estilo de código não funcionará em muitos pedidos, pois o cache interno das entidades do item de linha usará muita memória. Isso será um problema se você tiver milhares de pedidos.
fonte
field_get_items()
para obter os itens do campo e iterar por ele. Assim ,foreach ($order->commerce_line_items['und'] as $line) { ... }
torna-se$items = field_get_items('commerce_order', $order, 'commerce_line_items'); foreach ($items as $line) { ... }
etc. Ou use o entity_metadata_wrapper, que automaticamente leva em consideração os idiomas.Usando o wrapper de metadados da entidade, você também pode:
A parte importante aqui é verificar o tipo do item de linha, para que você não inclua itens de linha de envio ou outros tipos de itens de linha na sua lista de IDs de produtos. Além disso, com o aviso de invólucro, usei o valor "bruto" do campo trade_product no item de linha. Isso ocorre porque o "valor" seria o produto referenciado totalmente carregado, enquanto o valor "bruto" é simplesmente o ID do produto.
fonte
Se você não precisar carregar objetos inteiros (itens de linha, produtos de pedido e comércio), execute uma consulta como esta:
fonte
JOIN {field_data_commerce_product} p ON (p.entity_id = li.line_item_id AND p.entity_type = 'commerce_line_item')