私の質問は簡単です:Drupalコードを使用して、コマースオーダーから製品IDを取得するにはどうすればよいですか?現時点では次のようなものがあります:
$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?
}
うまくいけば、誰かがこの質問に答えることができます:)
コマース製品の参照フィールドの正確な構造を思い出せませんが、このようなことをする必要があります。
このコードスタイルは、ラインアイテムエンティティの内部キャッシュが使用するメモリが多すぎるため、多くの注文では機能しません。何千もの注文がある場合、これは問題になります。
$orders = commerce_order_load_multiple(array(), array('status' => 'pending'), TRUE);
foreach($orders as $order) {
foreach ($order->commerce_line_items['und'] as $line) {
$line_item = commerce_line_item_load($line['line_item_id']);
$product_id = $line_item->commerce_product['und']...
}
}
エンティティメタデータラッパーを使用すると、次のこともできます。
foreach (commerce_order_load_multiple(array(), array('status' => 'pending'), TRUE) as $order) {
$product_ids = array();
foreach (entity_metadata_wrapper('commerce_order', $order)->commerce_line_items as $delta => $line_item_wrapper) {
if (in_array($line_item_wrapper->type->value(), commerce_product_line_item_types())) {
$product_ids[] = $line_item_wrapper->commerce_product->raw();
}
}
}
ここで重要なのは、ラインアイテムのタイプを確認することです。そのため、商品IDのリストにラインアイテムや他のタイプのラインアイテムを配送することにはなりません。さらに、ラッパーで、広告申込情報のcommerce_productフィールドの「未加工」値を使用していることに注意してください。これは、「値」は完全にロードされた参照製品であり、「生」の値は単に製品IDであるためです。
オブジェクト全体(ラインアイテム、注文、コマース製品)をロードする必要がない場合は、次のようなクエリを実行できます。
$args = array(
':order_id' => $order_id,
);
$product_ids = db_query("SELECT p.commerce_product_product_id
FROM {commerce_line_item} li
JOIN {field_data_commerce_product} p ON (p.entity_id = li.line_item_id)
WHERE li.order_id = :order_id AND li.type = 'product'", $args)->fetchCol();
return $product_ids;