단일 제품 재색 인


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

그러나 이것은 작동하지 않습니다, 어떤 아이디어?

추신 : $product->getId()존재하고 정확합니다.

답변:


10

이것은 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;

네이티브 마 젠토 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 실행 (1 분마다)에서 변경된 항목을 자동으로 선택합니다.

최신 정보

위의 답변은 어쨌든 100 % 정확합니다. 아래 정보가 더 많은 것을 추가 할 수 있다고 생각합니다.

  • 제품에서 속성 값을 거의 변경하지 않고 상대 색인 테이블을 자동으로 업데이트해야하는 경우이 기능을 사용할 수 있습니다. Mage::getSingleton('catalog/product_action')->updateAttributes();

  • 리 인덱스를 직접 관리하려면 resourse 모델을 대신 사용하십시오. 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 트리거를 사용하여 DB 레벨에서 변경 사항을 선택하고 업데이트 된 엔티티 ID를 변경 로그 테이블에 기록합니다. 그런 다음 이러한 변경 로그는 cronjob을 통해 처리됩니다.
Vinai

2

관리자 UI에서 제품을 편집 한 후 제품의 색인을 다시 작성하고 싶다고 가정합니다. 가장 쉬운 방법은 인덱서 모드를 "저장시 업데이트"로 설정하는 것입니다. 제품 속성, 제품 가격, 제품 플랫 데이터, 카테고리 제품, 재고 상태를 포함하여 사용중인 제품과 관련된 모든 인덱서에 대해이 작업을 수행해야합니다.

그래도 제품 저장 속도가 느려질 수 있습니다.

또는이 링크가 도움이 될 것입니다. 의견 및 재고 업데이트 방법에 대한 설명도 참조하십시오. http://www.magentocommerce.com/answers/discussion/239/reindex-one-product-at-a-time/p1


2

프런트 엔드 나 업그레이드 스크립트에서이 작업을 수행하지 않아야하며 현재로드 된 저장소는 "admin"입니다. 그렇지 않으면 $ product-> save ()가 전혀 작동하지 않습니다. 먼저 제품을 저장하면 효과가 있는지 확인하십시오.


2

@feversocial의 답변 외에도 $ product-> save ()를 호출하기 전에 제품에로드하는 데 필요한 모든 것이 있는지 확인하십시오. 그렇지 않으면 저축이 실제로 경험했던 제품에서 실제로 물건을 제거 할 수 있습니다.

SKU없이 제품을 저장하는 것처럼 모든 URL 재 작성이 중단되고 전체 사이트가이 제품 페이지로 리디렉션됩니다. : S : P


좋은 지적, 그것이 내가 catolog/product_action접근 을 사용하는 것이 더 낫다고 생각하는 이유 는 위의 문제를 위험에
빠뜨리지

1

이 정보는 전체 시나리오를 조금 더 잘 이해하는 데 유용 할 수 있습니다.

  • 속성 값만 변경하고 상대 색인 테이블을 자동으로 업데이트해야하는 경우이 기능을 사용할 수 있습니다. Mage::getSingleton('catalog/product_action')->updateAttributes();

  • 리 인덱스를 직접 관리하려면 resourse 모델을 대신 사용하십시오. 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.