ทำดัชนีผลิตภัณฑ์เดียว


10

ฉันต้องการจัดทำดัชนีผลิตภัณฑ์ใหม่หลังการอัพเดต

ตอนนี้ฉันใช้:

$product = Mage::getModel('catalog/product')->loadByAttribute('sku', 'foobar');
// edit something
$product->save();

$stockItem = Mage::getModel('cataloginventory/stock_item')->loadByProduct($product->getId());
$stockItem->setForceReindexRequired(true);

Mage::getSingleton('index/indexer')->processEntityAction(
    $stockItem,
    Mage_CatalogInventory_Model_Stock_Item::ENTITY,
    Mage_Index_Model_Event::TYPE_SAVE
);

$product
    ->setForceReindexRequired(true)
    ->setIsChangedCategories(true);

Mage::getSingleton('index/indexer')->processEntityAction(
    $product,
    Mage_Catalog_Model_Product::ENTITY,
    Mage_Index_Model_Event::TYPE_SAVE
);

แต่มันไม่ทำงานความคิดใด ๆ

PS: $product->getId()มีอยู่จริงและถูกต้อง

คำตอบ:


11

ใช้งานได้ดีใน Magento CE 1.6 และใหม่กว่า:

$event = Mage::getSingleton('index/indexer')->logEvent(
    $product,
    $product->getResource()->getType(),
    Mage_Index_Model_Event::TYPE_SAVE,
    false
);
Mage::getSingleton('index/indexer')
    ->getProcessByCode('catalog_url') // Adjust the indexer process code as needed
    ->setMode(Mage_Index_Model_Process::MODE_REAL_TIME)
    ->processEvent($event);

รหัสดัชนีสามารถดูได้โดยใช้แบบสอบถาม:

SELECT indexer_code FROM index_process;

ใน Magento ดั้งเดิม 1.7 มี:

+---------------------------+
| indexer_code              |
+---------------------------+
| cataloginventory_stock    |
| catalogsearch_fulltext    |
| catalog_category_flat     |
| catalog_category_product  |
| catalog_product_attribute |
| catalog_product_flat      |
| catalog_product_price     |
| catalog_url               |
| groupscatalog2_category   |
| groupscatalog2_product    |
| tag_summary               |
+---------------------------+

ใน Magento EE 1.13 มันแตกต่างกันที่นั่นตัวสร้างดัชนีจะเลือกเอนทิตีที่เปลี่ยนแปลงในแต่ละ cron run (ทุกนาที)

UPDATE

คำตอบข้างต้นถูกต้อง 100% ต่อไปฉันคิดว่าข้อมูลด้านล่างสามารถเพิ่มอะไรเพิ่มเติม

  • หากคุณต้องการเปลี่ยนค่าคุณลักษณะเพียงเล็กน้อยในผลิตภัณฑ์และอัปเดตตารางดัชนีแบบสัมพัทธ์โดยอัตโนมัติคุณสามารถใช้ฟังก์ชันนี้: Mage::getSingleton('catalog/product_action')->updateAttributes();

  • ถ้าคุณต้องการจัดการ reindex ด้วยตัวคุณเองใช้ resourse model แทน: Mage::getResourceSingleton('catalog/product_action')->updateAttributes();

ตัวอย่างเช่นฉันใช้ฟังก์ชันต่อไปนี้เพื่ออัปเดตเฉพาะแอททริบิวบางอย่างในผลิตภัณฑ์

 public function updateProductAttribute($product_id, $arrayChanges, $reindex = true)
{
    if (!is_array($product_id)) {
        $product_id = array($product_id);
    }

    // ths should trigger all required reindex
    $update = Mage::getSingleton('catalog/product_action');
    // Update value
    if (!$reindex) {
        $update = Mage::getResourceSingleton('catalog/product_action');
    }

    $update->updateAttributes($product_id, $arrayChanges, 0);
}

บันทึก:

หากคุณต้องการเปลี่ยนคู่ของคุณลักษณะ / ค่าเดียวกันในกลุ่มผลิตภัณฑ์คุณสามารถผ่านอาร์เรย์ทั้งหมดของproduct_ids


ฉันจะคัดลอกความคิดเห็นของ user5973 ที่นี่เพราะมันจะถูกลบ @Vinai คุณกำลังบอกว่า EE 1.13+ ไม่ได้มีปัญหาเรื่องประสิทธิภาพเมื่อทำดัชนีข้อมูลที่เกี่ยวข้องกับผลิตภัณฑ์อีกครั้ง? เราจะยืนยันได้อย่างไรว่าเครื่องมือจัดทำดัชนี EE จะเลือกเอนทิตีที่เปลี่ยนแปลงและประมวลผลเฉพาะรายการเหล่านั้นโดยอัตโนมัติ
Fabian Blechschmidt

ใน EE 1.13 ตัวสร้างดัชนีใช้ทริกเกอร์ MySQL เพื่อรับการเปลี่ยนแปลงใด ๆ ในระดับฐานข้อมูลและบันทึกรหัสเอนทิตีที่อัปเดตในตารางการเปลี่ยนแปลง การเปลี่ยนแปลงเหล่านี้จะถูกประมวลผลผ่าน cronjobs
Vinai

2

ฉันคิดว่าคุณหมายถึงคุณต้องการทำดัชนีผลิตภัณฑ์ใหม่หลังจากที่คุณแก้ไขใน admin ui วิธีที่ง่ายที่สุดคือเพียงแค่ตั้งค่าโหมดตัวทำดัชนีให้เป็น "update on save" คุณจะต้องทำสิ่งนี้กับตัวจัดทำดัชนีทั้งหมดที่เกี่ยวข้องกับผลิตภัณฑ์ที่คุณกำลังใช้ซึ่งอาจรวมถึง: คุณสมบัติของผลิตภัณฑ์, ราคาผลิตภัณฑ์, ข้อมูลแบนผลิตภัณฑ์, ผลิตภัณฑ์ประเภท, สถานะสต็อก

นี่อาจทำให้การประหยัดผลิตภัณฑ์ช้าลง

หรืออาจจะลิงค์นี้จะช่วย โปรดดูความคิดเห็นรวมถึงอธิบายวิธีอัปเดตหุ้นเช่นกัน http://www.magentocommerce.com/answers/discussion/239/reindex-one-product-at-a-time/p1


2

ตรวจสอบให้แน่ใจว่าคุณไม่ได้ทำเช่นนี้กับสคริปต์ส่วนหน้าหรืออัปเกรดและที่จัดเก็บในปัจจุบันคือ "ผู้ดูแลระบบ" มิฉะนั้น $ product-> save () จะไม่ทำงานเลย ตรวจสอบก่อนว่าการบันทึกผลิตภัณฑ์มีผล


2

นอกจากคำตอบของ @ feversocial ยังให้แน่ใจว่าคุณมีทุกอย่างที่จำเป็นสำหรับการโหลดบนผลิตภัณฑ์ก่อนที่จะโทร $ product-> save () ไม่เช่นนั้นการประหยัดจะสามารถลบสิ่งต่าง ๆ ออกจากผลิตภัณฑ์ที่ฉันเคยประสบมา

เช่นเดียวกับการบันทึกผลิตภัณฑ์โดยไม่ต้องมี SKU ทั้งหมดซึ่งจะแบ่งการเขียน url ทั้งหมดและทำให้ทั้งไซต์เปลี่ยนเส้นทางไปยังหน้าผลิตภัณฑ์นี้: S: P


จุดที่ดีนั่นคือเหตุผลที่ฉันคิดว่าดีกว่าที่จะใช้catolog/product_actionวิธีการเพื่อให้คุณไม่เสี่ยงปัญหาดังกล่าวข้างต้น
Fra

1

ฉันข้อมูลเหล่านี้จะเป็นประโยชน์ในการเข้าใจสถานการณ์ทั้งหมดดีขึ้นเล็กน้อย

  • หากคุณต้องการเปลี่ยนเพียงค่าแอททริบิวต์และอัพเดตตารางดัชนีสัมพันธ์โดยอัตโนมัติคุณสามารถใช้ฟังก์ชันนี้: Mage::getSingleton('catalog/product_action')->updateAttributes();

  • ถ้าคุณต้องการจัดการ reindex ด้วยตัวคุณเองใช้ resourse model แทน: Mage::getResourceSingleton('catalog/product_action')->updateAttributes();

ตัวอย่างเช่นฉันใช้ฟังก์ชันต่อไปนี้เพื่ออัปเดตเฉพาะแอททริบิวบางอย่างในผลิตภัณฑ์

public function updateProductAttribute($product_id, $arrayChanges, $reindex = true)
{
    if (!is_array($product_id)) {
        $product_id = array($product_id);
    }

    // ths should trigger all required reindex
    $update = Mage::getSingleton('catalog/product_action');
    // Update value
    if (!$reindex) {
        $update = Mage::getResourceSingleton('catalog/product_action');
    }

    $update->updateAttributes($product_id, $arrayChanges, 0);
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.