Сейчас мы с вами напишем парсер курсов валют с сайта http://www.cbr.ru/ и оформим его в виде плагина WordPress.
Кстати, вот хороший WordPress плагин для отображения курсов валют: Скачать плагин курсов валют для WordPress
Пример работы плагина CurrencyConverter вы можете увидеть прямо у меня на сайте: в сайдбаре в блоке «Курс обмена валют».
Постановка задачи
Написать плагин, который каждый день собирает данные курсов валют с сайта ЦентроБанка и кладёт их в базу WP.
Алгоритм
Теперь давайте представим в общих чертах как наш парсер будет работать:
- При установке парсера выполняется скрипт создания таблицы в БД WP.
- При обращении к парсеру выполняется следующая проверка: если время последней загрузки отсутствует или временной интервал между моментом последней загрузки и текущим моментом составляет больше суток, то загружаем xml-файл и заносим данные из него в базу и отдаём массив с курсами. После этого обновляем время последней загрузки. Иначе (если условие не выполнено) отдаём массив с курсами из базы.
- Всё 😉
Не волнуйтесь если сейчас что-то непонятно, мы всё разберём по полочкам!
Приступаем к работе
Добавим информацию о плагине
Первым делом создайте файл «ex_rates.php». Наш плагин будет состоять всего из одного файла (зато какого! 😉 и весь последующий код будет добавляться именно в него. Добавьте в самое начало файла следующие строки:
/* Plugin Name: EX-rates CBR Description: Сборщик курсов валют с Центрального банка РФ Version: 0.1 Author: Заболотских Борис Author URI: https://zabolotskikh.com/ */
Это краткая информация о плагине. Я решил назвать плагин EX-rates CBR. А также добавил информацию о себе и описание плагина.
Создаём активатор и реализуем удаление плагина
Теперь реализуем действия, которые будут выполнятся при активации и удалении плагина.
/**
* Активатор
* Создаёт две таблицы в БД
* @global type $wpdb
*/
function ex_rates_activation()
{
//Это глобальный объект для работы с БД
global $wpdb;
//Выполняем запросы (создаём две таблицы)
$wpdb->query('DROP TABLE IF EXISTS '.$wpdb->prefix.'ex_rates;');
$wpdb->query(
'CREATE TABLE IF NOT EXISTS '.$wpdb->prefix.'ex_rates (
code VARCHAR(3) NOT NULL,
currency VARCHAR(255) NOT NULL,
course DECIMAL(8,4) NOT NULL,
nominal INT NOT NULL,
PRIMARY KEY (code))
ENGINE = InnoDB;');
$wpdb->query('DROP TABLE IF EXISTS '.$wpdb->prefix.'ex_log;');
$wpdb->query(
'CREATE TABLE IF NOT EXISTS '.$wpdb->prefix.'ex_log (
updated INT NOT NULL,
PRIMARY KEY (updated))
ENGINE = InnoDB;');
}
/**
* Удаление плагина
* Удаляет таблицы из БД
* @global type $wpdb
*/
function ex_rates_uninstall()
{
global $wpdb;
$wpdb->query('DROP TABLE IF EXISTS '.$wpdb->prefix.'ex_rates;');
$wpdb->query('DROP TABLE IF EXISTS '.$wpdb->prefix.'ex_log;');
}
//Регистрируем хук установки
register_activation_hook(__FILE__, 'ex_rates_activation');
//Регистрируем хук удаления
register_uninstall_hook(__FILE__, 'ex_rates_uninstall');
Как мы видим, в активаторе создаётся следующая структура таблиц:
В таблице «ex_rates» лежит информация по курсам валют:
- «code» — код валюты, например «USD»
- «currency» — русское название валюты, например «Доллар США»
- «course» — курс валюты по отношению к рублю, например «33.2578»
- «nominal» — номинал валюты по отношению к рублю, например «1»
В таблице «ex_log» всего одно поле «updated» и в нём в формате unix timestamp лежит время последней загрузки xml файла.
Когда плагин удаляется, считается хорошим тоном чтобы он не оставлял после себя ничего, в том числе и таблицы в БД, что мы и реализовали.
Функционал плагина
Итак, таблица у нас создаётся при активации, логику удаления мы реализовали, информацию о плагине добавили, теперь самое время заняться функционалом. Добавьте после информации о плагине и перед функцией активации следующий код:
class EX_rates
{
//Задаём интервал обновления (в секундах) "43200" - половина суток (12 часов)
CONST interval = 43200;
//Путь, откуда забираем данные
CONST source = 'http://www.cbr.ru/scripts/XML_daily.asp';
//Здесь будет WP'шный лежать объект для работы с БД
private $wpdb;
//Здесь будут имена таблиц
private $table_rates;
private $table_log;
/**
* В конструкторе определяем объект для работы с БД, имена таблиц, и если
* надо то обновляем данные
*/
public function __construct()
{
global $wpdb;
//Устанавливаем объект для работы с БД
$this->wpdb = $wpdb;
//Устанавливам имена таблиц
$this->table_rates = $this->wpdb->prefix.'ex_rates';
$this->table_log = $this->wpdb->prefix.'ex_log';
//(Текущее время - время последнего обновления), если оно больше чем
//заданный интервал, то обновляем данные
if ( (time() - $this->updatedTime()) > self::interval )
{
$this->refresh();
}
}
/**
* Возвращает все данные из таблицы с курсами в виде объекта
* @return object
*/
public function courses()
{
return $this->wpdb->get_results('SELECT * FROM '.$this->table_rates);
}
/**
* Возвращает данные из таблицы с курсами в массиве вида:
* 'USD' => array(
'nominal' => 1,
'value' => 33.8161,
),
'EUR' => array(
'nominal' => 1,
'value' => 45.8242,
),
* @return array
*/
public function coursesInArray()
{
foreach ($this->courses() as $rate)
{
$arr[$rate->code] = array(
'value' => $rate->course,
'nominal' => $rate->nominal,
);
}
return $arr;
}
/**
* Возвращает время последнего обновления данных в формате unix timestamp
* @return int
*/
private function updatedTime()
{
return $this->wpdb->get_var('SELECT updated FROM '.$this->table_log);
}
/**
* Обновляет данные в таблице
* @return boolean
*/
private function refresh()
{
//Если не удалось загрузить xml файл, то возвращаем false;
if (!$xml = simplexml_load_file(self::source))
{
return false;
}
//Очищаем таблицу с курсами
if ( !$this->wpdb->query('TRUNCATE TABLE '.$this->table_rates.';') )
{
return false;
}
//Очищаем таблицу с логом
if ( !$this->wpdb->query('TRUNCATE TABLE '.$this->table_log.';') )
{
return false;
}
//Прогоняем в цикле валюты
foreach($xml->Valute as $rate)
{
//Формируем массив с курсами
$rates = array(
'code' => $rate->CharCode,
'currency' => $rate->Name,
//Делаем эту нелепую заменую, потому что так отдаётся xml)
'course' => str_replace(',', '.', $rate->Value),
'nominal' => $rate->Nominal,
);
//Вставлям массив с курсами в БД.
if ( !$this->wpdb->insert($this->table_rates, $rates) )
{
return false;
}
}
//Записываем время обновления данных (текущее время)
if ( !$this->wpdb->insert( $this->table_log, array('updated'=>time())) )
{
return false;
}
return true;
}
}
Я старался комментировать свои действия, чтобы вам было понятнее.
Стоит обратить внимание на конструктор, в нём в самом начала определяется глобальный объект $wpdb, это вордпрессовский объект для работы с БД, именно через него у нас происходят все обращения к БД, а чтобы в каждом методе не писать global $wpdb, мы кладём его в приватное свойство $this->wpdb;. Теперь по поводу имён таблиц: $this->table_rates = $this->wpdb->prefix.'ex_rates';. Т.к. наши таблицы имеют следующий шаблон имени: <префикс вордпресса (скорее всего у вас это "wp_")> + <наш префикс (ex_)> + <имя таблицы>, то каждый раз определять это не имеет смысла, поэтому сразу кладём всё в свойства объекта. Далее идёт проверка (если (<текущее время> — <время последнего обновления>) > <заданный интервал>) если это условие верно, то выполняется обновление данных.
Надеюсь, что остальные методы понятны и не вызовут вопросов)
Теперь кладём файл в папку (можно назвать её так же как и плагин), запаковываем в zip архив и устанавливаем обычным способом.
Самое время попробовать получить данные из нашего плагина! 😉 В любом месте нам доступен объект EX_rates и мы можем его использовать, попробуйте сделать следующее:
$ex_rates = new EX_rates(); var_dump($ex_rates-&gt;coursesInArray()); // Вернёт массив с курсами валют
Вот и всё, удачи! =)

Плагин активировал а что дальше не понятно ???? подскажите плиз
$ex_rates = new EX_rates();
$arr = $ex_rates->coursesInArray();
вот массив с курсами, можете их где-нибудь вывести.
соответственно надо coursesInArray();
вот массив с курсами, можете их где-нибудь вывести.
?>
coursesInArray();
?>
так да ?
вот массив с курсами, можете их где-нибудь вывести.
Смотря что вы хотите сделать…
У вас есть массив, вы можете вытащить из него информацию и отобразить где-нибудь.
попроьовал вставить в файл индекс ни чего не выводит
уцда только не вставлял не раьотает и в виджет пхп и так взгляните http://рубль-евро.рф/
внизу в подвале
11111111
$ex_rates = new EX_rates(); $arr = $ex_rates->coursesInArray(); выводит
Этот плагин даёт лишь массив с курсами! Т.е. готовой красивой таблички с курсами нет. Но вы можете сделать её самостоятельно при помощи полученного массива.
нокак ?
Думаю, вам удобнее будет воспользоваться другим плагином.
Здравствуйте, при активации плагина выходит фатальная ошибка
Parse error: syntax error, unexpected ‘&’ in \www\wp-content\plugins\parser\parser.php on line 21
был массив но он один раз появился и все
Добрейшей вечерок.
скажите, пожалуйста, а как с помощью foreach цикла я могу вывести значения из массива?
$ex_rates->coursesInArray(); возвращает массив.
Если я пробую сделать переменную
$custom_array = $ex_rates->coursesInArray();
А после этого в цикле
foreach($custom_array as $value){
echo ».$value.»;
}
Получают или ошибку или пустоту. Как быть?!
Большое спасибо заранее.
В долгу не останусь.
Здравствуйте!
Посмотрите с помощью var_dump() что возвращает $value внутри цикла. Если там массив, то нужен вложенный цикл.