Magento和Wordpress-在两个平台上同步菜单,cookie问题



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

这是非常好的工作,除了一件事,网站是多语言的。

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

除了由于某种原因需要在加载正确的语言之前单击两次外,这一操作非常有效。我可以在web检查器中看到,"存储"cookie设置为正确的语言,但插件似乎在不知何故发生这种情况之前加载了Magento内容。

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

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

--

编辑:这是我到目前为止写的,我正在努力工作。它从URL中提取语言字符串,然后设置store cookie。通过查看插件API/动作参考,它是加载顺序中发生的第一件事。我确实有一个必须使用的插件,可以确认它是否有效,但我也尝试过将其连接到registered_taxonomy、post-type等。出于某种奇怪的原因,它直到第二次点击才有效,尽管它发生在主题或常规插件加载之前很久。

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覆盖(在下一次加载时也是如此)

Magento ==> WordPress桥接插件会在某个时刻初始化Magento。此时,可以通过指定要加载的websitestoreview来加载Magento

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

$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商店视图通常用于翻译,它们有与之相关的特定区域设置。

你所需要做的就是:

  • 找出在哪个WordPress事件(钩子)是Magento正在加载
  • 找出在加载Magento之前发生的事件
  • 编写一些代码,使用有效的storeviewcode初始化$_SESSION['storeviewcode']
  • 将代码附加到适当的事件(挂钩)上
  • 确保WordPress语言与正确的storeviewcode相对应

我还不能回答这个问题,但我也不能留下评论。然而,你能向我确认一下你在Magento的管理区使用的cookie设置吗?(系统>配置>Web)

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

不管怎样,Magento始终使用cookie值覆盖任何手动请求的区域设置

问题是在随后的重新加载之前从未读取正确的cookie值。

我最初的解决方案,就像在编辑中一样,是在每次加载Wordpress时取消设置cookie(这并不理想),并通过Mage::app手动调用区域设置。

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

最后,它只是添加了一行简单的内容:

$_COOKIE['store'] = 'new_locale'

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

最终,没有必要对Magento、Wordpress或WPI插件进行任何修改。

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

无尽的感谢米海和詹姆斯,这是一个非常痛苦的问题。

最新更新