0

我有一个有几个类别的商店。商店中的大多数产品都在 2-3 个类别中。我希望每个产品只有一个 url - domain.com/product_name.html。我不想让产品 URL 中包含类别路径。

我将“使用产品 URL 的类别路径”设置为“否”,但是当我重新索引目录 URL 重写时,它会为每个产品创建一个常规 url (domain.com/product_name.html) 和一个用于每个类别路径 (domain.com /category_path/product_name.html)。

我已经删除了所有包含类别路径的产品 URL 重写,但是当我重新索引目录 URL 重写时,它会再次创建它们。

“使用产品 URL 的类别路径”配置不应该阻止这种情况吗?我错过了什么吗?

我正在使用 Magento 版本。1.7.0.0

谢谢

4

5 回答 5

1

根据您的 Magento 版本和设置这些 URL 的目的,您可能希望使用较新版本中的规范 URL 功能。

https://stackoverflow.com/a/13500138/901449

于 2013-02-26T22:23:37.590 回答
1

我们遇到了同样的问题,我们为我们的产品分配了多个类别,最终在 Google 网站管理员工具中出现重复的内容,因为即使产品完全相同,Google 也将它们视为不同的 URL。我们最终得到了以下令人讨厌的 URL

oursite.com/catgory-1/product-1.html

oursite.com/catgory-2/product-1.html

oursite.com/catgory-3/product-1.html

oursite.com/product-1.html

我们调查并发现了以下扩展,它完全符合 Magento 配置(“使用产品 URL 的类别路径”=“否”)应该做的事情

https://www.scommerce-mage.com/magento-2-seo-unique-product-url.html

我必须说这个扩展或功能应该在 Magento 中开箱即用。

无论如何希望它可以帮助某人。

干杯

小号

于 2015-08-12T14:15:02.613 回答
0

我认为您误解了配置设置。

该设置完全按照您的描述进行:每个类别有一个 url,总共有一个 url。

问题是,产品没有主要类别。因此,如果您不在类别视图中,例如在小部件的主页上,magento 不知道应该将哪个类别用作 url 锚点。

如果您在笼统视图中,则所有 url 都应该是类别/产品 url,如果您在主页上并执行此处描述的操作:http: //www.magentocommerce.com/wiki/groups/248/display_products_on_home_page有不涉及类别。

于 2013-02-26T22:16:33.730 回答
0

Shani1351,我遇到了和你一样的问题。我做了同样的操作: - 将“使用产品 URL 的类别路径”设置为“否”。- 清除缓存。- 截断“core_url_rewrite”。- 清除缓存。- 然后检查我的 url 重写数据(来自后端)。我看到了每个产品的很多网址(每个相关链接类别都有一个网址)。

但是,如果您检查您的首页,您会发现产品只使用了一个 URL,正如预期的那样。

我认为 Magento 需要生成“整个包”网址,但不要在前端使用它们。


编辑(3年后):

我最初的回答是错误的。产品 url 与类别路径一起返回。

为了帮助 magento 在没有类别路径的情况下获得重写的产品 url,我建议您重写以下方法(这是一个 POC,仅用于演示。不要修改核心文件,永远不要!):

Mage_Catalog_Model_Product_Url::getUrl()

    public function getUrl(Mage_Catalog_Model_Product $product, $params = array())
{
    $routePath      = '';
    $routeParams    = $params;

    $storeId    = $product->getStoreId();
    if (isset($params['_ignore_category'])) {
        unset($params['_ignore_category']);
        $categoryId = null;
    } else {
        $categoryId = $product->getCategoryId() && !$product->getDoNotUseCategoryId()
            ? $product->getCategoryId() : null;
    }

    if ($product->hasUrlDataObject()) {
        $requestPath = $product->getUrlDataObject()->getUrlRewrite();
        $routeParams['_store'] = $product->getUrlDataObject()->getStoreId();
    } else {
        $requestPath = $product->getRequestPath();
        if (empty($requestPath) && $requestPath !== false) {
            $idPath = sprintf('product/%d', $product->getEntityId());
            if ($categoryId) {
        //         $idPath = sprintf('%s/%d', $idPath, $categoryId);
            }

查看注释行(我的 CE 1.7.0.2 上的 194)。这是罪魁祸首!

只需在覆盖模块中删除此行:

$idPath = sprintf('%s/%d', $idPath, $categoryId);

希望它可以帮助某人。

于 2014-04-29T06:54:54.743 回答
0
于 2019-02-28T23:57:34.673 回答