基于国家/地区的 Magento 2 默认货币

Magento 2 default currency based on country

在我的网站上,我有 2 种货币,用户可以。一种是美元,另一种是里亚尔。默认货币为美元。在我们的徽标附近有一个下拉菜单,客户可以在其中将货币更改为里亚尔和美元。默认选项是美元

我想要的是,任何从沙特阿拉伯访问我们网站的客户,我们必须向他们展示所有其他国家/地区的里亚尔货币,我们必须向他们展示美元货币。

我该怎么做?请帮忙。

对于这项工作,您需要从 $_SERVER['REMOTE_ADDR'] 检查您的 ip,并从 MaxMind 的 GeoIP2 数据库中找到国家代码 (https://dev.maxmind.com/geoip/geoip2/geolite2/)。

参考:https://www.w3resource.com/php-exercises/php-basic-exercise-5.php

之后,您需要在 app/code/your_vendor/your_module/etc/frontend/events 中的模块中使用事件观察器 controller_action_predispatch。xml

 <?xml version="1.0"?>
    <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
            xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/events.xsd">
        <event name="controller_action_predispatch">
            <observer name="currency_init_for_country" instance="your_vendor\your_module\Observer\PreDispatchObserver" shared="false" />
        </event>
    </config>

在your_vendor\your_module\Observer\PreDispatchObserver.php文件中你需要添加:

<?php

namespace your_vendor\your_module\Observer;

use Magento\Framework\Event\Observer;
use Magento\Framework\Event\ObserverInterface;

class PreDispatchObserver implements ObserverInterface
{
    /**
     * @var \Magento\Store\Model\StoreManagerInterface
     */
    private $storeManager;

    public function __construct(
        \Magento\Store\Model\StoreManagerInterface $storeManager
    ) {
        $this->storeManager = $storeManager;
    }

    /**
     * @inheritDoc
     */
    public function execute(Observer $observer)
    {
        // logic for taking current country from $_SERVER['REMOTE_ADDR'] and checking from maxmind database and find the country code.then you can add a if else condition for currecny here based on country code.
        $currency = 'USD';

        if ($this->getStoreCurrency() !== $currency) {
            $this->storeManager->getStore()->setCurrentCurrencyCode($currency);
        }
    }

    private function getStoreCurrency()
    {
        return $this->storeManager->getStore()->getCurrentCurrencyCode();
    }
}