Magento - 我如何通过 GeoIP 按国家/地区运行商店?

Posted

技术标签:

【中文标题】Magento - 我如何通过 GeoIP 按国家/地区运行商店?【英文标题】:Magento - How I can Run Store by Country by GeoIP? 【发布时间】:2012-11-13 10:40:44 【问题描述】:

我想通过客户的 IP 经营商店。

在 Magento 的后端,用户可以配置具体的商店来加载每个国家。

一看,我看到了类Mage_Core_Model_App的方法

public function run($params)

    $options = isset($params['options']) ? $params['options'] : array();
    $this->baseInit($options);

    if ($this->_cache->processRequest()) 
        $this->getResponse()->sendResponse();
     else 
        $this->_initModules();
        $this->loadAreaPart(Mage_Core_Model_App_Area::AREA_GLOBAL, Mage_Core_Model_App_Area::PART_EVENTS);

        if ($this->_config->isLocalConfigLoaded()) 
            //$scopeCode = isset($params['scope_code']) ? $params['scope_code'] : '';

            //===============custom scope by country======================

             $scopeCode = Mage::helper('custom/module')->getStoreByGeoip();

            //===============custom scope by country======================

            $scopeType = isset($params['scope_type']) ? $params['scope_type'] : 'store';
            $this->_initCurrentStore($scopeCode, $scopeType);
            $this->_initRequest();
            Mage_Core_Model_Resource_Setup::applyAllDataUpdates();
        

        $this->getFrontController()->dispatch();
    
    return $this;

在获得好的解决方案的过程中,我想到了另一种选择。

在index.php中写下一段代码:

 Mage::app();
 Mage::Helper('custom/helper')->getRunCodeByGeoio();
 Mage::run($mageRunCode, $mageRunType);

我认为这对性能没有危险,因为这种方法只会在你之前没有创建对象的情况下创建对象

/**
     * Get initialized application object.
     *
     * @param string $code
     * @param string $type
     * @param string|array $options
     * @return Mage_Core_Model_App
     */
    public static function app($code = '', $type = 'store', $options = array())
    
        if (null === self::$_app) 
            self::$_app = new Mage_Core_Model_App();
            self::setRoot();
            self::$_events = new Varien_Event_Collection();
            self::$_config = new Mage_Core_Model_Config();

            Varien_Profiler::start('self::app::init');
            self::$_app->init($code, $type, $options);
            Varien_Profiler::stop('self::app::init');
            self::$_app->loadAreaPart(Mage_Core_Model_App_Area::AREA_GLOBAL, Mage_Core_Model_App_Area::PART_EVENTS);
        
        return self::$_app;
    

我的问题是......

这是获得解决方案的最佳方法吗??

我认为修改 Mage_Core_Model_App 即使使用重写也是非常危险的

我没有任何级别的活动

另一种选择是在index.php中做业务却失去了后端的管理

正在搜索....,找到了满足我许多要求的扩展, http://www.mageworx.com/store-and-currency-auto-switcher-magento-extension.html 那我就买这个或者做一个类似的扩展。

【问题讨论】:

我被分配了相同的任务,并且确实尝试寻找可以帮助我做到这一点的事件,但我能够实现的唯一方法是(在获得 [整个过程]访问者 ip 的国家/地区)重定向到特定(指定)商店。 这个模块可以帮助你mageworx.com/… 【参考方案1】:

在使用 Magento 或任何其他应用程序进行开发时,如果可以避免的话,绝对不要接触任何核心文件。

这样做意味着未来可能的升级将覆盖您的更改并破坏您的商店。

最简单的方法是做所有事情 index.php 因为无论如何这是选择商店的入口点,您所做的只是根据不同的标准(即 IP 地址)选择商店。

一种简单的方法是使用免费库,例如 maxmind GeoLite:http://dev.maxmind.com/geoip/geolite 你可以加载一个 apache 模块,或者通过一个 pecl 扩展,甚至是普通的 PHP。

这将为您返回访问者所在国家/地区的 iso 国家/地区代码。

然后,您可以使用商店代码的国家/地区 iso 代码命名您的商店,这将使根据 IP 加载正确的商店变得非常简单

像这样简单的事情:

$countryCode = getUsersCountryCode(); // which ever method you use in here...

$stores = array(
    'gb',
    'us',
    'fr',
);

if(in_array(countryCode, $stores)) 
    Mage::run(countryCode, 'store');

else 
    Mage::run($mageRunCode, $mageRunType);

你当然可以把它变成一个 Magento 扩展,但这是迄今为止最简单的方法。如果需要,您甚至可以从 Magento 获取国家/商店的列表,而不是对其进行硬编码。

【讨论】:

以上是关于Magento - 我如何通过 GeoIP 按国家/地区运行商店?的主要内容,如果未能解决你的问题,请参考以下文章

忽略 GeoIP Htaccess Rewrite 中的 magento 管理目录

NGINX 按国家阻止并排除机器人

Rails GeoIP 返回国家/城市列表

maxmind free geoip DB返回错误的国家/地区

如何授予对 nGinx 中 GeoIP [国家] 阻止的特定 IP 地址的访问权限?

如何在(Django GeoIP)中为每个国家/地区显示广告