WordPress как на ладони
wordpress jino

Экспорт курсов валют с сайта центробанка

у Добавляю на свой сайт такую интересную опцию. Может кому-нибудь пригодится.
На странице пользовательского профиля отображается мультичек со списком валют, можно выбрать одну или несколько валют, а потом во фронтенде вывожу курсы именно тех валют, которые пользователь выбрал в профиле.
Для добавления метабоксов на страницу пользовательского профиля я использую CMB2. Можно наверное и без лишних библиотек, но уж очень оно удобно.
В functions.php или файле, подключаемом к functions.php пишем так:
add_action( 'cmb2_admin_init', 'livepravo_user_profile_metabox' );

function livepravo_user_profile_metabox() {
// Массив валют
$curencies = array(
'AUD' => '1 Австралийский доллар',
'AZN' => '1 Азербайджанский манат',
'GBP' => '1 Фунт стерлингов Соединенного королевства',
'AMD' => '100 Армянских драмов',
'BYN' => '1 Белорусский рубль',
'BGN' => '1 Болгарский лев',
'BRL' => '1 Бразильский реал',
'HUF' => '100 Венгерских форинтов',
'DKK' => '10 Датских крон',
'USD' => '1 Доллар США',
'EUR' => '1 Евро',
'INR' => '100 Индийских рупий',
'KZT' => '100 Казахстанских тенге',
'CAD' => '1 Канадский доллар',
'KGS' => '100 Киргизских сомов',
'CNY' => '10 Китайских юаней',
'MDL' => '10 Молдавских леев',
'NOK' => '10 Норвежских крон',
'PLN' => '1 Польский злотый',
'RON' => '1 Румынский лей',
'XDR' => '1 СДР (специальные права заимствования)',
'SGD' => '1 Сингапурский доллар',
'TJS' => '10 Таджикских сомони',
'TRY' => '1 Турецкая лира',
'TMT' => '1 Новый туркменский манат',
'UZS' => '1000 Узбекских сумов',
'UAH' => '10 Украинских гривен',
'CZK' => '10 Чешских крон',
'SEK' => '10 Шведских крон',
'CHF' => '1 Швейцарский франк',
'ZAR' => '10 Южноафриканских рэндов',
'KRW' => '1000 Вон Республики Корея',
'JPY' => '100 Японских иен'
);
// Объявляем метабокс
$cmb_user = new_cmb2_box( array(
'id'               => 'lp_profile', // Это ID метабокса
'title' => 'Профиль пользователя', // Заголовок метабокса
'object_types'     => array( 'user' ), //  ID экрана
'show_names'       => true, // Отображать наименования опций
'classes' => 'user', // CSS-класс
'new_user_section' => 'add-existing-user', // Это не вполне понял
) );
// Заголовок
$cmb_user->add_field( array(
'name' => 'Валюты',
'desc' => 'Выберите один или несколько валют в ниже приведенном списке, курсы которых по отношению к российскому рублю вас интересуют.',
'id'       => 'lp_title',
'type'     => 'title',
'on_front' => true,
) );
// Добавляем  мультичек со списком валют
$cmb_user->add_field( array(
'name' => 'Валюты',
'desc' => 'Выберите валюты',
'id' => 'curencies',
'type' => 'multicheck',
'multiple' => true,
'options' => $curencies,
'inline' => true,
) );

} // End function

После этого в любой из файлов шаблона добавляем такой код:

<?php
// Текущая дата
$date = date('d.m.Y');
// Получаем содержимое XML-файла
$file = file_get_contents("http://www.cbr.ru/scripts/XML_daily.asp?date_req=$date");
// Парсим XML-файл
$courses = simplexml_load_string($file);
// Массив пользовательских валют
$user_curencies = get_user_meta(get_current_user_id(), 'curencies');
if (count($user_curencies) != 0): // Если пользователь вообще что-то выбрал
// выводим список курсов валют
echo '<ul>';
foreach($courses->Valute as $curency) {
if (!in_array($curency->CharCode, $user_curencies)) continue;
echo '<li>';
echo $curency->Nominal . ' ' . $curency->Name . ':' . $curency->Value;
echo '</li>';
} // End foreach
echo '</ul>';
endif;
?>

Код работает в WordPress 4.7.1, но я не вижу препятствий и для более ранних версий.
Ну да конечно, PHP с 5.2 simpleXML поддерживает из коробки, для более ранних версий этот флаг нужно выставлять при сборке.
А проблема в следующем: как можно реализовать генерацию ассоциативного массива валют из XML-файла? Точнее, как в PHP выглядит добавление пары "ключ/значение" к ассоциативному массиву на лету?
Ведь дорогой моему сердцу центробанк список валют чисто теоретически может менять, добавлять туда валюты каких-то дружественных стран, удалять не актуальные или не ликвидные валюты. Не хочется каждый раз переписывать ручками список валют.
Я додумался до следующего:

// Получаем и парсим XML-файл как при выводе
$date = date('d.m.Y');
$file = file_get_contents("http://www.cbr.ru/scripts/XML_daily.asp?date_req=$date");
$courses = simplexml_load_string($file);
// Объявляем пустой массив валют
$curencies = array();
foreach ($courses->Valute as $curency) {
// И вот здесь добавляем позиции списка
// Я пробую например так:
$curencies[$curency->CharCode] = $curency->Nominal . ' ' . $curency->Name;
// Почему-то ругается на некорректное смещение.
$curencies = compact($curency->CharCode, $curency->Nominal . ' ' . $curency->Name, $curencies);
// Не ругается, но и массива не формирует
} // End foreach

Короче поможите please чем можете, сами мы не местные.

0
horror 9 месяцев назад

Нет ответов на этот вопрос.

На вопросы могут отвечать только зарегистрированные пользователи. Регистрация. Вход.