상거래 주문에서 제품 ID 가져 오기


12

내 질문은 간단합니다. 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?
    }

잘하면 누군가이 질문에 대답 할 수 있기를 바랍니다 :)


var_dump ($ order); 두 번째 foreach 안에?
saadlulu

답변:


9

상거래 제품 참조 필드의 정확한 구조를 기억할 수는 없지만 이와 같은 작업을 수행해야합니다.

이 코드 스타일은 광고 항목 엔터티의 내부 캐시가 너무 많은 메모리를 사용하므로 많은 주문에서 작동하지 않습니다. 수천 개의 주문이있는 경우 문제가됩니다.

$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']...
  }
}

고마워, 이것은 작동합니다. 상거래 테이블에서 쿼리를 실행하는 것도 옵션이라는 아이디어를 얻었습니다. 관계 순서가 있습니다. 제품은 sku 필드와 함께 설정되었을 수 있습니다.
5706

나도. 주문 ID가있을 때 제품 IDS를 쿼리 할 수는 없지만 너무 많은 객체를로드해야한다는 것은 유감입니다.
tomas.teicher

'und'를 직접 사용하는 것은 좋은 습관이 아닙니다. 당신이 경우 특정 코드가 만 번역되지 않은 사이트에 사용됩니다, 당신은 LANGUAGE_NONE 상수를 사용할 수 있습니다 -하지만 사용하는 것이 더 연습의 field_get_items()대신에 반복 분야에서 항목을 얻을합니다. 그래서 foreach ($order->commerce_line_items['und'] as $line) { ... }되고 $items = field_get_items('commerce_order', $order, 'commerce_line_items'); foreach ($items as $line) { ... }, 자동으로 계정으로 언어를 필요 사용 entity_metadata_wrapper, 등 또는.
KingAndy

22

엔티티 메타 데이터 랩퍼를 사용하여 다음을 수행 할 수도 있습니다.

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이기 때문입니다.


3

전체 개체 (광고 항목, 주문 및 상거래 제품)를로드 할 필요가없는 경우 다음과 같이 쿼리를 실행할 수 있습니다.

 $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;

DB에 데이터를 매핑하는 것은 이일 때문에 ..이 매핑 정보에 대한 감사 ..이 검색 한을 꽤 어려운 작업이 될 수
MJS

이론적으로 다른 엔티티 유형은 commerce_product 필드를 사용할 수 있으므로 Join은 더 적절할 것입니다.JOIN {field_data_commerce_product} p ON (p.entity_id = li.line_item_id AND p.entity_type = 'commerce_line_item')
KingAndy
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.