Как оптимизировать полученную информацию в кеш и потом её использовать?

Я использую проверку по geo для вывода цены в зависимости от страны пользователя. Код:

<?php
$ip = $_SERVER['REMOTE_ADDR'];
$details = json_decode(file_get_contents("http://ipinfo.io/{$ip}/json"));
if($details->country == 'BY') {
    print("<span class='price'>".$price_html."</span>");
}
?>

Когда это делается на странице категории товаров, при выводе 30 и более товаров, очень долго грузиться страница. Без данной проверки страница загружается быстро. Я так понимаю, что проверка идет отдельно для каждого товара, от того и низкая скорость загрузки. Есть ли способы оптимизировать это дело?

полый код из файла:

<?php
if ( ! defined( 'ABSPATH' ) ) {
    exit; // Exit if accessed directly
}

global $product;
?>

<?php if ( $price_html = $product->get_price_html() ) : ?>

<?php
$ip = $_SERVER['REMOTE_ADDR'];
$details = json_decode(file_get_contents("http://ipinfo.io/{$ip}/json"));
if($details->country == 'BY') {
    print("
    <span class='price'>".$price_html."</span>
");
}
 ?>

<?php endif; ?>

Ответы (1 шт):

Автор решения: Ипатьев

Ну в общем когда переменную надо повтороно использовать в рамках тодного и того же куска кода, это не называется кэшированием. Это скорее здравый смысл.

По идее надо просто вынести получение информации по IP до начала цикла. И это будет самым правильным вариантом.

Но если все прямо совсем сложно, и непонятно, где тут цикл, где функция, и вообще как это всё работает, то можно конечно запомнить информацию на месте.

Но на всякий случай переменовать переменную, потому что details слишком общее имя, и так можно перезаписать другую переменную.

global $ip_details_tpl;
if(empty($ip_details_tpl)) {
    $ip_details_tpl = json_decode(file_get_contents("ipinfo.io{$ip}/json")); 
}
if( $ip_details_tpl->country == 'BY') {
...

Оно будет запрашивать информацию только один раз. Это конечно ужасный вариант, но работать будет

→ Ссылка