默认 URL Key 在产品页面上是全局范围的。

编辑:正如Florinelchis所建议的那样,范围可能是管理属性的变化。但是,这打破了商店视图切换器的行为。

这已在1.7.0.2上测试,并带有样本数据和 启用“将存储代码添加到URL”:

  1. 编辑产品并为特定商店视图(法语)设置其他URL
  2. 重新索引
  3. 英语商店视图上网站上的打开产品页面
  4. 切换到法语:您将拥有页面URL CONTA /French/
  5. 切换回英语 - > 404页错误(URL错过了商店代码 /default/

    如何通过商店视图/语言开关使其正常工作?

细节:

  • 英语的URL: /default/sony-vaio-vgn-txn27n-b-11-1-notebook-pc.html
  • 法语的URL: /french/sony-vaio-vgn-txn27n-b-11-1-notebook-pc-french.html

如果我在此页面上的英语网站 - > /default/sony-vaio-vgn-txn27n-b-11-1-notebook-pc.html

然后我切换到法语:

我得到了这个URL(遗漏了商店代码):
MAGEDOMAIN/sony-vaio-vgn-txn27n-b-11-1-notebook-pc-french.html

因此,Magento正确地重写URL,但由于某种原因错过了商店代码

参考:

可以肯定这与 /core/model/store.php/core/model/url/rewrite.php, ,特别是这些方法:

Mage_Core_Model_Url_Rewrite::rewrite
Mage_Core_Model_Store::getCurrentUrl

更新

如果您使用1.9.1 @vinai修复程序将不起作用,请检查我添加的新答案

有帮助吗?

解决方案 3

Magento 1.9.1的一些更新信息

由于其他原因,该功能仍然损坏了这个版本中的错误@vinai指出了该版本已解决的问题(对于可配置的产品)

问题真正的问题可能在这里 Mage_Catalog_Model_Resource_Url 但是我没有时间,也不想触摸核心的如此微妙的部分。

解决方法的解释:

入口点始终是此类Mage_Core_Model_Url_Rewrite_Request特别是该方法 _rewriteDb()

如何 _rewriteDb() 作品:

  1. 首先,它尝试加载当前商店的请求

(139): $this->_rewrite->loadByRequestPath($requestCases);

  1. 然后,如果我找不到它(没有ID)并且有一个 ___from_store 范围

(142): if (!$this->_rewrite->getId() && $fromStore) {

  1. 尝试加载重写 ___from_store:

(152): $this->_rewrite->setStoreId($fromStoreId)->loadByRequestPath($requestCases);

  1. 如果找到了,它使用 id_path 为当前商店加载一个:

(159): $this->_rewrite->setStoreId($currentStore->getId())->loadByIdPath($this->_rewrite->getIdPath());

一切看起来都不错,但是url_rewrite数据中存在一个问题,因此索引功能(至少对于可配置的产品):

  • 即使我们要切换商店并且新商店具有不同的URL,也可以在第139行中重写。

问题是此重写指向错误 id_path (而不是指向可配置的产品ID,而是指向其简单产品ID之一)

现在,解决方法是删除 !$this->_rewrite->getId() 条件,因此,洋红色试图在那里时始终找到重定向 $fromstore 范围

  • 最好的是修复 catalog_url 索引并删除其创建的错误重写。

在这里,快速解决方法的代码(您需要创建一个模块并重写 Mage_Core_Model_Url_Rewrite_Request 自我上课):

protected function _rewriteDb()
    {
        if (null === $this->_rewrite->getStoreId() || false === $this->_rewrite->getStoreId()) {
            $this->_rewrite->setStoreId($this->_app->getStore()->getId());
        }

        $requestCases = $this->_getRequestCases();
        $fromStore = $this->_request->getQuery('___from_store');

        if ($fromStore) {
            $stores = $this->_app->getStores(false, true);
            if (!empty($stores[$fromStore])) {
                /** @var $store Mage_Core_Model_Store */
                $store = $stores[$fromStore];
                $fromStoreId = $store->getId();
            } else {
                return parent::_rewriteDb();
            }

            $this->_rewrite->setStoreId($fromStoreId)->loadByRequestPath($requestCases);
            if (!$this->_rewrite->getId()) {
                return parent::_rewriteDb();
            }

            // Load rewrite by id_path
            $currentStore = $this->_app->getStore();
            $this->_rewrite->setStoreId($currentStore->getId())->loadByIdPath($this->_rewrite->getIdPath());

            $this->_setStoreCodeCookie($currentStore->getCode());

            $targetUrl = $currentStore->getBaseUrl() . $this->_rewrite->getRequestPath();
            $this->_sendRedirectHeaders($targetUrl, true);
        }

        if (!$this->_rewrite->getId()) {
            return parent::_rewriteDb();
        }

        $this->_request->setAlias(Mage_Core_Model_Url_Rewrite::REWRITE_REQUEST_PATH_ALIAS,
            $this->_rewrite->getRequestPath());
        $this->_processRedirectOptions();

        return true;
    }

其他提示

问题是模型中的错误 Mage_Core_Model_Url_Rewrite_Request (Magento 1.8)和 Mage_Core_Model_Url_Rewrite (较早版本)。

1.8中的核心代码部分看起来像这样:

    // Section from Mage_Core_Model_Url_Rewrite_Request::_rewriteDb()

    $fromStore = $this->_request->getQuery('___from_store');
    if (!$this->_rewrite->getId() && $fromStore) {
        $stores = $this->_app->getStores();
        if (!empty($stores[$fromStore])) {
            $store = $stores[$fromStore];
            $fromStoreId = $store->getId();
        } else {
            return false;
        }

错误:查询参数的值是商店代码(在我的情况下 de, en 或者 fr)。数组的钥匙返回 app->getStores()数字 存储ID。这就是为什么 if (!empty($stores[$fromStore])) { 总是失败。

一旦修复了该错误,在同一方法中以后将显而易见另一个错误(我认为仅在1.8中):

$targetUrl = $this->_request->getBaseUrl() . '/' . $this->_rewrite->getRequestPath();

请求对象base URL始终是Magento base_url, 没有 商店代码。使用 $currentStore->getBaseUrl() 而是在那里修复了该错误。

一旦解决了这两个问题,语言切换器正常工作。这是一个扩展程序,完全适用于Magento 1.8(CE): https://github.com/vinai/vinaikopp_storeurlrewrites

在Magento 1.7中,问题可能有所不同。我仍然以为我会添加这个答案,以防万一Google将其他运行1.8或更新的人带到这里。

实际上,我在Magento 1.7.0.2上找到了此问题的解决方法,如果您正在运行Magento 1.8,请访问Vinai的详细说明:

看起来该问题的一部分与请求控制器有关 Mage_Core_Controller_Request_Http.

如果您查看第161行,有以下条件:

                elseif ($storeCode !== '') {
                    $this->setActionName('noRoute');
                }

当我切换到类别/产品页面中的其他商店时,请评论它解决404错误。

但是,由于某些未知原因,在某个时候,在响应URL中遗漏了商店代码,但这不再引起问题,因为两个URL现在都起作用:

  • magedomain/sony-vaio-vgn-txn27n-b-11-1-notebook-pc-french.html
  • magedomain/sony-vaio-vgn-txn27n-b-11-1-notebook-pc.html

我不清楚这种情况的评论是否会引起其他问题

URL键 是一个属性。您可以从: 目录 - >属性 - >管理属性。搜索 url_key 然后单击它。Edit url_key attribute

更改 范围 并保存。

现在,您可以在每个商店视图上使用其他URL键。

因此,您想更改每个商店视图的URL吗?

目前,您修改了分数范围的产品URL,以使法国商店与您的英式商店不同吗?当您在两者之间切换时,您将获得404。这是预期的行为。

Magento不会存储不同的URL重写以供其他商店视图。所以当你击中 /french/product1 在法国商店,URL将在桌子中匹配,并将加载。但是,当您在英国商店中击中它时,将没有匹配,因此将404。

听起来您需要的只是“将存储代码添加到URL” - 这将使您的URL键单独使用,但是所有相应的URL都带有您的商店代码。然后,这应该允许您的商店切换器运行。

许可以下: CC-BY-SA归因
scroll top