0

我正在使用Magento WordPress 集成插件从并行 Magento 安装中调用块,以便从 Magento 中提取适当的菜单块。

这工作得很好,除了一件事,这些网站是多语言的。

我在 Wordpress 中插入了一些代码,以便在更改语言时,它将存储 cookie 更改为适当的语言,以确保 Magento 以正确的语言加载菜单。

这非常有效,只是由于某种原因,它需要在加载正确的语言之前单击两次。我可以在网络检查器中看到“商店”cookie 设置为正确的语言,但插件似乎在以某种方式发生之前加载了 Magento 内容。

除了分离菜单并在系统之间手动编码之外,我真的不知道该怎么做。我正在与插件的实际开发人员进行讨论,但他自己无法想到解决方案(不幸的是,当我要求获得一些支持的可能性时,讨论被终止了)。

无论如何,如果有人知道如何解决这个问题,我将非常感激它,因为似乎没有人找到解决方案来解决我所想象的一个相当典型的设置。

--

编辑:这是我到目前为止所写的并且正在努力开始工作。它从 URL 中提取语言字符串,然后设置storecookie。通过查看Plugin API/Action Reference,它是加载顺序中发生的第一件事。我确实有一个必须使用的插件,并且可以确认它可以工作,但我也尝试过将它连接到注册分类、帖子类型等......出于某种奇怪的原因,它仍然无法工作,直到第二次点击,即使它发生得很远在主题或常规插件加载之前。

function set_store_cookie() {
    if( preg_match("(/(de|en|jp)/)",$_SERVER[REDIRECT_URL],$m)) {
        $pbCurrentLanguage = $m[1];
    } else {
      $currentLanguage = "en";
    }
    setcookie('store', $currentLanguage, time()+(60 * 60 * 24 * 1), COOKIEPATH, '.domain.com', false);
  }
add_action('registered_post_type', 'set_store_cookie');

--

编辑 2: 在下面与 Mihai 广泛交谈后,我们讨论了很多事情,但主要发现无论如何,如果store设置了 cookie,Wordpress 会加载 cookie 指定的语言,即使是静态调用$app = Mage::app('desired_lang', 'store');

这真的很令人困惑,因为它陷入了与以前相同的问题:如果设置了 cookie,Wordpress 将无法加载适当的 Magento 语言,直到第二次刷新。

与此同时,我已经通过在每次加载 Wordpress 时删除 cookie 来解决这个问题,但这似乎真的是一个不理想的解决方案。让我感到莫名其妙的是,即使调用Mage::app静态加载错误的语言并被 cookie 覆盖(并且在下一次加载时也是如此)

4

3 回答 3

1

桥接插件在某个时候Magento ==> WordPress初始化。Magento此时Magento可以通过指定要加载哪个website或哪个storeview来加载。

这发生在插件文件中: wp-content/plugins/magento-wordpress-integration/mwi.php 在第 53 行,您有以下代码:

$app = Mage::app(self::getValue('websitecode','base'), 'website');

第一个参数 ( self::getValue('websitecode','base')) 获取要加载的网站的网站代码(简称)。第二个参数指定第一个参数是网站代码而不是商店浏览代码这一事实。

您可以这样重写该行:

if(isset($_SESSION['storeviewcode'])) {
    /**
     *     Loads a particular storeview that you specify in
     * $_SESSION['storeviewcode'].
     */
    $app = Mage::app($_SESSION['storeviewcode'], 'store');
}
else {
    /**
     *     Falls back to default behavior.
     */
    $app = Mage::app(self::getValue('websitecode','base'), 'website');
}

我假设您知道,但为了完整起见,Magento 商店视图通常用于翻译,它们具有与之关联的特定语言环境。

您需要做的就是:

  • 找出加载 Magento 的 WordPress 事件(钩子);
  • 找出在加载 Magento 之前发生的事件;
  • 编写一些$_SESSION['storeviewcode']使用有效 storeviewcode 初始化的代码;
  • 将代码附加到适当的事件(挂钩);
  • 确保 WordPress 语言对应正确的 storeviewcode;
于 2013-08-06T09:37:32.513 回答
1

我还不能回答这个问题,但我也不能发表评论。但是,您能否向我确认一下您在 Magento 管理区域中使用的 cookie 设置?(系统 > 配置 > Web)

于 2013-08-06T11:44:06.950 回答
0

好的。好吧,Mihai、James(插件作者)和我花了几个小时聊天并尝试了无数可能的解决方案,但都没有奏效。

无论如何,Magento 一直使用 cookie 值覆盖任何手动请求的语言环境

问题是在随后的 reload 之前从未读取过正确的 cookie 值

与编辑一样,我最初的解决方案是在每次加载 Wordpress 时取消设置 cookie(不理想)并通过Mage::app.

最后,我决定从 PHP 的角度而不是 Magento/WP 来看待它,因为 Mihai 提到了 PHP 中的 session/cookie 实现是多么令人沮丧,并遇到了这个线程:http://www.webmasterworld.com/php/4332059。 htm

最后,它是一个简单的单行添加:

$_COOKIE['store'] = 'new_locale'

aftersetcookie(...)以确保当前 cookie 变量与 set cookie 的变量匹配,而不需要第二个页面加载。此代码通过 连接到 Wordpress add_action('muplugins_loaded', 'set_store_cookie');,这是 Wordpress 操作顺序中最早的。

最后,Magento、Wordpress 和 WPI 插件都不需要修改。

虽然它不能解决为什么 Magento 使用 cookie 覆盖手动应用程序调用的问题,但它现在终于可以正常工作了。看来 Magento 实际上存在一个错误:https ://gist.github.com/Vinai/1205913 - 即使这个差异也没有纠正这种行为。

无尽的感谢 Mihai 和 James,这是一个很难解决的问题。

于 2013-08-06T13:45:14.863 回答