Magento показывает неправильный товар в категории

У меня странная проблема, и многие из них имеют то же самое в Интернете. Ниже снимок будет определять мою проблему, а также мою версию magento составляет 1.7

enter image description here

Как я выделил, LEFT говорит, что в категории есть 16 продуктов, но на самом деле вкладка Category Products отображает 15 продуктов. Все мои категории испорчены. Пожалуйста, дайте мне знать, что происходит не так. Я попытался отключить кеш, но он не сработал.

[изменить]

Я попытался удалить один продукт из категории, затем число слева составило 15 и общее количество записей 14. Поэтому я думал, что это продукт, который отключен там в этой категории. Но когда я искал отключенные продукты, их не было.

Ответ 1

Привет, кол-во продуктов приходит из имени метода loadProductCount, который находится в местоположении code/core/Mage/Catalog/Model/Resource/Category/Collection.php

Если вы будете углубляться, этот счет исходит из запроса соединения между двумя таблицами: catalog_category_product и catalog_category_entity

Я исправил эту проблему, используя event observer. вы можете сделать то же самое на время. И дайте мне знать, если вы найдете лучшее решение.

public function deleteCountCategory (Varien_Event_Observer $observer) {
    try {
    $product = $observer->getEvent()->getProduct();
    $productId = $product->getId();                     
    $resource = Mage::getSingleton('core/resource');    
    $writeConnection = $resource->getConnection('core_write');
    $tableName = $resource->getTableName('catalog_category_product');
    $query = "DELETE FROM {$tableName} WHERE product_id = ".(int)$productId;            
    $writeConnection->query($query);            
    } catch (Exception $e) {
        throw $e;                   
    }
    return $this;           
}   

Событие, используемое в config.xml

<events>
<catalog_product_delete_after> <!-- identifier of the event we want to catch -->
<observers>
<catalog_product_delete_after_handler> <!-- identifier of the event handler -->
<type>model</type> <!-- class method call type; valid are model, object and singleton -->
<class>countfix/observer</class> <!-- observers class alias -->
<method>deleteCountCategory</method>  <!-- observer method to be called -->
<args></args> <!-- additional arguments passed to observer -->
</catalog_product_delete_after_handler>
</observers>
</catalog_product_delete_after>
</events>

Ответ 2

Это исправит их все.

DELETE FROM 
catalog_category_product 
where product_id NOT IN (SELECT entity_id FROM (catalog_product_entity)) 

Затем реализуем решение в наблюдателе, чтобы оно не повторялось.

Ответ 3

Простое решение для этого - перейти к app/code/core/Mage/Catalog/Model/Category.php

или лучше создать локальный файл, чтобы он не срабатывал при обновлении magento. Итак, создайте app/code/local/Маг/Каталог/Модель/Категория .php

В этой модели создайте новую функцию: getFrontentProductCount()

    public function getFrontentProductCount()
{
    $collection = Mage::getResourceModel('catalog/product_collection')
        ->addCategoryFilter($this);
Mage::getSingleton('catalog/product_status')->addVisibleFilterToCollection($collection);
Mage::getSingleton('catalog/product_visibility')->addVisibleInCatalogFilterToCollection($collection);
return $collection->count();

}

Теперь перейдите в файл шаблона phtml, в котором вы выполняете подсчет продукта категории. В общем случае это: theme/template/catalog/navigation/left.phtml

теперь вызовите вышеуказанную функцию по мере необходимости, например:

 <ol>
            <?php foreach ($_categories as $_category): ?>
                <?php if($_category->getIsActive()): ?>
                <li>
                    <a href="<?php echo $this->getCategoryUrl($_category) ?>"<?php if ($this->isCategoryActive($_category)): ?> class="current"<?php endif; ?>><?php echo $this->htmlEscape($_category->getName()) ?></a> (<?php echo $_category->getFrontentProductCount() ?>)
                </li>
                <?php endif; ?>
            <?php endforeach ?>
            </ol>