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

时间:2013-08-05 22:40:33

标签: wordpress magento multilingual

我正在使用Magento WordPress Integration插件从并行Magento安装中调用块,以便从Magento中提取相应的菜单块。

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

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

除非在加载正确的语言之前需要两次点击,否则它的效果非常好。我可以在网络检查员看到' store' cookie被设置为正确的语言,但插件似乎在以某种方式发生之前加载了Magento内容。

除了分离菜单并在系统之间手动编码之外,我真的不知所措。我和插件的实际开发人员在discussion但是他自己无法想到解决方案(不幸的是,当我询问是否有可能获得一些支持时,讨论终止了。)

在任何情况下,如果有人知道如何解决这个问题,我会非常感激,因为似乎没有人找到解决方案,我想象的是一个相当典型的设置。

-

编辑:这是我到目前为止所写的内容并且正在尝试开始工作。它从URL中提取语言字符串,然后设置store cookie。通过查看Plugin API/Action Reference,它是加载顺序中发生的第一件事。我确实有一个必须使用的插件,可以确认它有效,但我也尝试将它挂钩到registered_taxonomy,发布类型等...出于某些奇怪的原因,它仍然无法工作,直到第二次点击甚至虽然它发生在主题或常规插件加载之前。

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覆盖(以及下次加载)

3 个答案:

答案 0 :(得分:1)

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

这在插件文件中发生:第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;

答案 1 :(得分:1)

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

答案 2 :(得分:0)

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

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

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

我的初始解决方案,就像在编辑中一样,每次加载Wordpress时都取消设置cookie(不理想),并通过Mage::app手动调用语言环境。

最后,我决定从PHP的角度来看,而不是Magento / WP后Mihai提到PHP中的会话/ cookie实现是多么令人沮丧并遇到了这个问题:http://www.webmasterworld.com/php/4332059.htm

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

$_COOKIE['store'] = 'new_locale'

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

最终,Magento,Wordpress和WPI插件都没有必要进行任何修改。

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

无尽的感谢Mihai和James,这是一个痛苦的问题,试图理清。