พาณิชย์รับรหัสผลิตภัณฑ์จากการสั่งซื้อ


12

คำถามของฉันง่าย: ฉันจะรับรหัสผลิตภัณฑ์จากคำสั่งซื้อทางพาณิชย์ด้วยรหัส Drupal ได้อย่างไร ฉันมีสิ่งนี้ในขณะนี้:

  $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 ที่ 2 ของคุณ?
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
user5706

ฉันด้วย. น่าเสียดายที่เมื่อฉันมี 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

การใช้ wrapper เมตาดาต้าของเอนทิตีคุณสามารถทำได้:

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();
    }
  }
}

ส่วนที่สำคัญที่นี่คือการตรวจสอบประเภทของรายการโฆษณาดังนั้นคุณจึงไม่ต้องลงเอยด้วยการรวมรายการโฆษณาการจัดส่งหรือรายการโฆษณาประเภทอื่น ๆ ในรายการรหัสผลิตภัณฑ์ของคุณ นอกจากนี้ด้วยการแจ้งให้ทราบว่าฉันใช้ค่า "ดิบ" ของฟิลด์ commerce_product ในรายการโฆษณา นี่เป็นเพราะ "ค่า" จะเป็นผลิตภัณฑ์ที่อ้างอิงอย่างเต็มที่ในขณะที่ค่า "ดิบ" เป็นเพียงรหัสผลิตภัณฑ์


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;

การทำแผนที่ข้อมูลไปยังฐานข้อมูลอาจเป็นงานที่ค่อนข้างยุ่งยาก .. ขอบคุณสำหรับข้อมูลการทำแผนที่นี้ .. ได้ทำการค้นหาสิ่งนี้มาตั้งแต่ 2 วัน
mjs

ในทางทฤษฎีประเภทเอนทิตีอื่น ๆ สามารถใช้ฟิลด์ commerce_product ดังนั้นการเข้าร่วมจะเหมาะสมมากขึ้น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.