php - 在 multistore .htaccess 之后,Magento 中的类别 View (仅)缺少产品

标签 php mysql .htaccess magento

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

在开发网站上进行设置时,我注意到每当我放入 multistore 的 .htaccess 代码时,所有产品都会从类别 View 中消失。但是,我仍然可以通过直接链接访问产品,例如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

对于可能导致产品在前端可用但在类别 View 中不可用的原因,是否有人有任何想法?我们正在运行 Magento Enterprise 1.12.0.2

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

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

我们只是得到一个“没有与选择匹配的产品”。类别 View 中的错误。

编辑 #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 插件。

最佳答案

消息“没有与选择匹配的产品。”如果产品集合为空,则显示:
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没有stock_id 列。
这让我觉得有人以某种方式更改了代码以添加此内容:我会查看代码以查看它的来源,并从那里采取措施解决错误

HTH

关于php - 在 multistore .htaccess 之后,Magento 中的类别 View (仅)缺少产品,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19098970/

相关文章:

php - 如何检查目录是否存在? "is_dir", "file_exists"还是两者兼而有之?

PHP 需要并包含 GET

php - 使用 mysql_unbuffered_query 的多个连接

mysql - 获取查询的列顺序

.htaccess - 将域更改为静态 IP,SEO Joomla 友好 URL 不起作用

.htaccess - 301重定向规则在不同的托管环境中给出不同的结果

apache - 在 Elastic beanstalk 上设置 https 代理

php - Laravel CRUD Controller 测试

php - 从 MySQL 数据库获取行和数据的最快方法?

php - 将分隔符从 textarea 发送到 mysql。列为 ",",行为 "\n"