在多线程.htaccess之后,Magento中的类别视图(仅)中缺少产品

时间:2013-09-30 16:14:54

标签: php mysql .htaccess magento

我正在为已经活跃的Magento网站添加额外的网站/店面。

在开发网站上进行设置时,我注意到每当我放入多线圈的.htaccess代码时,所有产品都会从类别视图中消失。但是,我仍然可以通过直接链接获取产品,例如my-domain.com/category/product。

以下是我使用的.htaccess代码:

## Storefronts

# Main Store
SetEnvIf Host www\.my-domain\.com MAGE_RUN_CODE=main-store_code
SetEnvIf Host www\.my-domain\.com MAGE_RUN_TYPE=website
SetEnvIf Host ^my-domain\.com MAGE_RUN_CODE=main-store_code
SetEnvIf Host ^my-domain\.com MAGE_RUN_TYPE=website

# Second Store
SetEnvIf Host second-store\.my-domain\.com MAGE_RUN_CODE=second_store_code
SetEnvIf Host second-store\.my-domain\.com MAGE_RUN_TYPE=website

我已设置子域以使用根Magento安装作为其基本目录。 Multistore工作,我可以更改主题,设置,产品等。

我已经仔细地浏览了这里看到的所有内容,至少发过5次:accepted answer has a category troubleshooting checklist

有没有人想知道什么可能导致产品在前端可用而不在类别视图中?我们正在运行Magento Enterprise 1.12.0.2

编辑:到目前为止,我们已尝试过:

  1. 产品已分配到目录中的相应类别/商店。
  2. 产品已启用。 (我们已尝试批量启用/禁用)
  3. 产品有数量。
  4. 产品设置为" In Stock"
  5. 管理库存操作系统设置为关闭
  6. 显示缺货设置为是。
  7. 正在使用多个网站,并且已将产品分配到目标网站。
  8. 我们已刷新,已删除,然后已停用缓存
  9. 我们通过管理员和命令行重新编制了索引。
  10. 我们已经执行了各种var_dump来检查正确的商店ID
  11. 我们已检查USER_NOT_LOGGED_IN的数据库组。它应该是0。
  12. 如果您直接导航,产品会知道他们所在的商店和功能应该如何。
  13. 我们已经运行了数据库修复工具
  14. 我们运行数据库与新数据库工具进行比较。 (这发现了两个小的索引问题)我们再次重新编制索引,但没有运气。
  15. 我们已禁用缓存关闭的每个非必要模块。
  16. 我们只是得到一个"没有符合选择的产品。"类别视图中的错误。

    编辑#2这些是OSdave指出的list.php故障排除中的SQL语句:

    我认为注意默认商店不在前端使用也是有利的。它只是我们用来导入产品的基础。可见的店面可以在上面的.htaccess文件中看到。

    #Base store (1)(this works):
    2013-10-03T14:12:48+00:00 DEBUG (7): SELECT `e`.*, `cat_index`.`position` AS `cat_index_position`, `price_index`.`price`, `price_index`.`tax_class_id`, `price_index`.`final_price`, IF(price_index.tier_price IS NOT NULL, LEAST(price_index.min_price, price_index.tier_price), price_index.min_price) AS `minimal_price`, `price_index`.`min_price`, `price_index`.`max_price`, `price_index`.`tier_price` FROM `catalog_product_entity` AS `e`
    INNER JOIN `catalog_category_product_index` AS `cat_index` ON cat_index.product_id=e.entity_id AND cat_index.store_id=1 AND cat_index.visibility IN(2, 4) AND cat_index.category_id='3'
    INNER JOIN `catalog_product_index_price` AS `price_index` ON price_index.entity_id = e.entity_id AND price_index.website_id = '1' AND price_index.customer_group_id = 0 ORDER BY `cat_index`.`position` ASC LIMIT 10
    
    #This is from the store2 store (MAGE_RUN_CODE=main-store_code):
    2013-10-03T13:35:38+00:00 DEBUG (7): SELECT `e`.*, `cat_index`.`position` AS `cat_index_position`, `price_index`.`price`, `price_index`.`tax_class_id`, `price_index`.`final_price`, IF(price_index.tier_price IS NOT NULL, LEAST(price_index.min_price, price_index.tier_price), price_index.min_price) AS `minimal_price`, `price_index`.`min_price`, `price_index`.`max_price`, `price_index`.`tier_price` FROM `catalog_product_entity` AS `e`
    INNER JOIN `catalog_category_product_index` AS `cat_index` ON cat_index.product_id=e.entity_id AND cat_index.store_id=2 AND cat_index.visibility IN(2, 4) AND cat_index.category_id='3'
    INNER JOIN `catalog_product_index_price` AS `price_index` ON price_index.entity_id = e.entity_id AND price_index.website_id = '2' AND price_index.customer_group_id = 0 AND price_index.stock_id = 15 ORDER BY `cat_index`.`position` ASC LIMIT 10
    
    #This is from the store3 store (RUN_CODE=second_store_code):
    2013-10-03T14:48:05+00:00 DEBUG (7): SELECT `e`.*, `cat_index`.`position` AS `cat_index_position`, `price_index`.`price`, `price_index`.`tax_class_id`, `price_index`.`final_price`, IF(price_index.tier_price IS NOT NULL, LEAST(price_index.min_price, price_index.tier_price), price_index.min_price) AS `minimal_price`, `price_index`.`min_price`, `price_index`.`max_price`, `price_index`.`tier_price` FROM `catalog_product_entity` AS `e`
    INNER JOIN `catalog_category_product_index` AS `cat_index` ON cat_index.product_id=e.entity_id AND cat_index.store_id=3 AND cat_index.visibility IN(2, 4) AND cat_index.category_id='37'
    INNER JOIN `catalog_product_index_price` AS `price_index` ON price_index.entity_id = e.entity_id AND price_index.website_id = '2' AND price_index.customer_group_id = 0 AND price_index.stock_id = 1  ORDER BY `cat_index`.`position` ASC LIMIT 9
    

    我正在研究这些差异。乍一看,我注意到网站ID可能已关闭。

    编辑#3 我已经比较了所有三个查询并稍微使用了它们。我发现,似乎我的catalog_product_index_price表似乎缺少90%的产品和每个不存储id = 1的产品

    我可以通过SQL查询提取商店ID为1的任何产品。其他一切都失败了。我已手动验证了传递的值。这些产品根本不存在于catalog_product_index_price表中。

    现在怎么办?我已经尝试过数据库修复工具......

    编辑#4 Stock_ID来自Multi-Warehouse,我们用来管理航运区域的innoexts插件。

5 个答案:

答案 0 :(得分:7)

消息“没有与选择匹配的产品”。如果产品集合为空,则显示:
app/design/frontend/base/default/template/catalog/product/list.phtml

<?php
    $_productCollection=$this->getLoadedProductCollection();
    $_helper = $this->helper('catalog/output');
?>
<?php if(!$_productCollection->count()): ?>
<p class="note-msg"><?php echo $this->__('There are no products matching the selection.') ?></p>
<?php else: ?>

如您所见,通过getLoadedProductCollection()中定义的方法app/code/core/Mage/Catalog/Block/Product/List.php检索产品集合(如果未覆盖):

public function getLoadedProductCollection()
{
    return $this->_getProductCollection();
}

为了确定错误,暂时编辑此文件并在返回之前添加mysql查询的日志,即:

public function getLoadedProductCollection()
{
    Mage::log($this->_getProductCollection()->getSelect()->assemble(), null, 'product_collection.log', TRUE);
    return $this->_getProductCollection();
}

加载类别并转到MAGENTO_ROOT/var/log/并打开product_collection.log文件。在那里你会看到执行的mysql查询 然后我将逐个删除它的一些部分,并对数据库运行它,直到我确定导致集合为空的原因。


现在你有了mysql查询,我们可以继续。有效的查询(第一个)与其他查询之间存在一个区别: AND price_index.stock_id = 1
在原生EE 1.12中,catalog_product_index_price表格 NOT 的列数为stock_id。 这让我觉得某人在某种程度上修改了代码以添加它:我会调查代码以查看它来自何处,并从那里采取措施来解决错误

HTH

答案 1 :(得分:0)

  1. 您的产品是否已分配到您正在查看的网站? 转到Catalog > Manage Products并修改产品。转到Websites标签,确保您的产品是网站的一部分

  2. 产品是根类别的一部分,是否已分配到商店视图?
    转到System > Manage Stores > [Click Store Name]并查看Root Category下拉列表。确保将您的产品分配到此根类别的子类别。

  3. 您的MAGE_RUN_CODEMAGE_RUN_TYPE变量是否正确解释?

  4. echo 'MAGE_RUN_CODE = ' . $_SERVER['MAGE_RUN_CODE'] . '<br />';
    echo 'MAGE_RUN_TYPE = ' . $_SERVER['MAGE_RUN_TYPE'];

    查看以上内容是否返回了URL的正确变量值。

答案 2 :(得分:0)

  1. 暂时关闭缓存(如果开启)。

  2. 排除基于主题的错误的可能性 - 尝试回退到基本默认主题。

  3. 检查您的网站根类别 - 转到系统&gt;管理商店&gt;单击商店并检查它是否指向正确的根类别。

  4. 通过命令行运行完整重新索引 - 首先移至[MAGENTO_ROOT]/shell/并运行php indexer.php --reindexall

  5. 您是否尝试逐个停用所有扩展程序?我要说最明确的方法是从app/etc/modules/

    中删除xml文件

答案 3 :(得分:0)

有没有人对可能导致产品在前端可用的原因有什么想法,而不是在类别视图中?

你的问题在这里有点令人困惑。通过“类别视图”,您的意思是“类别编辑表单”(管理面板)还是“产品列表页面”(前端)?

如果是产品列表页面,请尝试重建URL重写。

答案 4 :(得分:0)

戴夫你摇滚,sql查询日志为我节省了大量时间!所以我的问题是,当我移动MySQL数据库时,&#34; NOT LOGGED IN&#34; customer_group从customer_group_id 0切换到6.我将其更改回0,重新索引,重新缓存并且工作正常。这5个小时头疼的噩梦终于结束了......

对于有这个mysql迁移问题的任何其他人,请务必检查每个表格,以及其他一些0 ID丢失的地方。