Показывать цены только для конкретной страны клиента в Woocommerce - PullRequest
0 голосов
/ 28 февраля 2019

Я разработал каталог, используя woocommerce, однако мне нужно иметь возможность скрывать цены на продукты от пользователей, которые посещают сайт из-за пределов Великобритании по причинам, не зависящим от меня.

Я нашел плагины, которые позволяют мне изменять цены на товары в зависимости от местоположения посетителя, но ничто не позволяет мне скрывать цены.

Есть ли плагины, которые я пропустил, или что-то, что яможно добавить в файлы woocommerce для достижения этой цели?

Ответы [ 2 ]

0 голосов
/ 28 февраля 2019

Существуют различные веб-API, которые помогут вам.Например, http://ipinfo.io

ip = $_SERVER['REMOTE_ADDR']; 
$details = json_decode(file_get_contents("http://ipinfo.io/{$ip}")); 
echo $details->country; // -> "US"

Если вам нужно сделать много проверок, лучше использовать локальную базу данных.MaxMind предлагает бесплатную базу данных , которую можно использовать с различными библиотеками PHP, включая GeoIP .

0 голосов
/ 28 февраля 2019

Следующее будет скрывать цены за пределами Соединенного Королевства в зависимости от клиента страна с географическим местоположением :

add_filter( 'woocommerce_get_price_html', 'country_geolocated_based_hide_price', 10, 2 );
function country_geolocated_based_hide_price( $price, $product ) {
    // Get an instance of the WC_Geolocation object class
    $geo_instance  = new WC_Geolocation();
    // Get geolocated user geo data.
    $user_geodata = $geo_instance->geolocate_ip();
    // Get current user GeoIP Country
    $country = $user_geodata['country'];

    return $country !== 'GB' ? '' : $price;
}

Код помещается в файл function.php вашей активной дочерней темы(или активная тема).Протестировано и работает.


Если вы хотите включить эту функцию геолокации только для незарегистрированных клиентов, используйте следующее:

add_filter( 'woocommerce_get_price_html', 'country_geolocated_based_hide_price', 10, 2 );
function country_geolocated_based_hide_price( $price, $product ) {
    if( get_current_user_id() > 0 ) {
        $country = WC()->customer->get_billing_country();
    } else {
        // Get an instance of the WC_Geolocation object class
        $geo_instance  = new WC_Geolocation();
        // Get geolocated user geo data.
        $user_geodata = $geo_instance->geolocate_ip();
        // Get current user GeoIP Country
        $country = $user_geodata['country'];
    }
    return $country !== 'GB' ? '' : $price;
}

Доступна обновленная версия этого кода в этом ответе во избежание ошибки бэкэнда.

Я добавил в функцию при запуске:

if ( is admin() ) return $price;

Код входит в файл function.php вашегоАктивная детская тема (или активная тема).Проверено и работает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...