Если вы хоть немного знакомы с Wordpress, то знаете, что кроме верстки, различные блоки или модули можно добавлять с помощью "Виджетов". Конечно существует набор стандартных виджетов, но их функций может не хватать. Сегодня мы разберем как с нуля создать собственный виджет. Для примера в статье будет создан виджет, который выводит бегущую строку актуальных курсов криптовалют.
Весь код мы будем писать в файле functions.php, который вы можете найти в папке с действующей темой.
Для того, чтобы виджет отображался в админ панели - необходимо его зарегистрировать. Это делается очень просто:
register_widget('marqueeCurrency');
Эта функция пишется отдельно от класса. Параметром мы передаем название класса нашего виджета. В данном случае это marqueeCurrency.
Создадим скелет нашего виджета, выглядеть он будет следующим образом
class marqueeCurrency extends WP_Widget {
function __construct() {
parent::__construct('marqueeСurrency','Курс криптовалют', array('description' => 'Отображает актуальные курсы криптовалют бегущей строкой'));
}
function widget( $args, $instance ){
}
function update( $new_instance, $old_instance ) {
}
function form( $instance ) {
}
}
Как можно заметить, класс наследуется от WP_Widget, это обязательное условие для виджета. Теперь разберем все методы, описаные в классе:
__construct - конструктор, вызывается каждый раз, при создании класса. Внутри него необходимо вызвать конструктор родительского класса
WP_Widget::__construct( string $id_base, string $name, array $widget_options = array(), array $control_options = array() )
$id_base - id виджета.
$name - имя виджета.
$widget_options - настройки виджета, например его описание.
$control_options - название функции, которая будет отвечать за вывод настроек виджет в админ-панели. Этот аргумент мы опустим, поскольку за вывод настроек у нас будет отвечать метод form()
widget() - метод, выводящий виджет на сайте, имеет следующие аргументы:
$args - массив, состоящий из ключей 'beforetitle', 'aftertitle', 'before_widget', 'after_widget', которые отвечают за оформление заголовка виджета (по умолчанию h3 ), и за обертку самого виджета (по умолчанию div ).
$instance - массив, в котором хранятся настройки вашего виджета.
update() - отвечает за обновление настроек, имеет два аргумента:
$new_instance - новые настройки.
$old_instance - старые настройки.
form() - выводит в админ-панели форму для редактирования настроек виджета.
Итак, мы разобрались с обязательным минимумом для создания виджета, теперь напишем в каждом из методов необходимый код, начнем с form().
function form( $instance ) {
$defaults = array (
'currenciesLimit' => 10
);
$instance = wp_parse_args((array)$instance, $defaults);
?>
<p>
<label for="<?php echo $this->get_field_id( 'currenciesLimit' ); ?>"> Выводить <input id="<?php echo $this->get_field_id( 'currenciesLimit' ); ?>" name="<?php echo $this->get_field_name( 'currenciesLimit' ); ?>" value="<?php echo $instance['currenciesLimit']; ?>" style="width:50px;" type="number"/> популярных криптовалют</label>
</p>
<?
}
В данном виджете у нас будет всего одна настройка - количество выводимых криптовалют. Чтобы не выводить пустоту, с помощью массива $defaults будут созданы некоторые значения по умолчанию. Методы $this->get_field_id и $this->get_field_name нужны, чтобы не возникало путаницы при сохранении настроек. Таким образом теперь мы можем редактировать, сколько выводить криптовалют в бегущей строке.
Теперь перейдем непосредственно к сохранению настроек, для этого напишем в update() следующий код:
function update( $new_instance, $old_instance ) {
$instance = $old_instance;
$instance['currenciesLimit'] = strip_tags( $new_instance['currenciesLimit'] );
return $instance;
}
Как видите сохранение настроек не слишком сложная задача.
Последним необходимым и важным методом является widget():
function widget( $args, $instance ){
$currencies = file_get_contents('https://api.coinmarketcap.com/v1/ticker/?convert=RUB&limit='.$instance['currenciesLimit']);
$currencies = json_decode($currencies,true);
?>
<marquee scrollamount="3" behavior="scroll" loop="infinite" direction="left">
<?
foreach ($currencies as $key => $currency) {
?>
<span><strong><? echo $currency['name'].' ('.$currency['symbol'].')'; ?></strong> : <? echo number_format($currency['price_rub'], 2, '.', ' ').' руб.';?> </span>
<?
}
?>
</marquee>
<?
}
Чтобы вывести актуальный курс, нам необходимо узнать его, для этого воспользуемся API coinmarketcap, а именно методом,который будет возвращать список криптовалют с актуальными курсами. Подробнее со списком методов вы можете ознакомиться на странице API.
Сначала мы с помощью функции file_get_contents() получаем JSON строку с необходимым содержимым, после чего преобразовываем её в массив с помощью json_decode(). Здесь нам и пригодится наш параметр currenciesLimit, который мы создали в настройках. При запросе курсов мы передадим параметр "limit" со значением, которое хранится в $instance['currenciesLimit']. Тег marquee создаст бегущую строку, нам остается лишь добавить внутрь него данные. Для этого мы будем перебирать массив, добавляя в html содержимое нужную информацию.
В конечном итоге получится весьма интересная бегущая строка, отображающая актуальные курсы популярных криптовалют.
Скачать готовый код виджета
Заглавное фото с сайта pvsm.ru
Данный материал подготовлен автором @mo3golom в рамках цикла статей о WordPress.
Полезная тема.
Может вы попробуете свой виджет на офсайт Wordpress добавить и там обновлять? Чтобы потом на Голосе не искать его.
И еще интересна возможность отображения статей из определенного аккаунта Голоса на сайте WP, чтобы их туда не закачивать.
Какой-то плагин для WP @vik писал. Для постинга по-моему.
Посмотрим, может и добавим на оффсайт.
И казалось бы, каким боком js (на картинке) относится к wp? Дизайнеры такие дизайнеры...
В статье код естественно оказался на php :) Как пример — годная. Но без кеширования
file_get_contents
рано или поздно подгадит.Даже не обращал внимания на каком языке код на фоне) Лучше найдите продукт, к которому js не относится))
Ну от нагрузки зависит. В нагруженных проектах конечно придётся кэшировать.
Прочитал, подписался, и завис на слогане о презирающих программистах ))
Здорово:) Т.е. в такой бегущей строке можно настроить любое количество валют? Не очень поняла, как выбирать, какие именно криптовалюты будут отражаться и как их в этот код подставлять. Ну да ладно, свой старый сайт на Ворд-Пресс я давно забросила, а если будет когда-нибудь сайт-клиент на Голосе, теперь знаем, куда обращаться за помощью:) Спасибо за вашу работу!
В таком виджете будут отображаться самые популярные валюты. currenciesLimit нужен для того,чтобы не выдавать весь список из 1110 валют. Если вы хотите узнать курс для определенной валюты, то есть метод https://api.coinmarketcap.com/v1/ticker/{coinname}/, где {coinname} - имя криптовалюты. К сожалению, нет методов, которые бы возвращали список интересующих валют, поэтому придется запрашивать курс для каждой отдельно :)
За их количество отвечает параметр currenciesLimit.
На данный момент coinmarketcap отдаёт 1110 валют О_о
Эх еще руки до вордпреса у меня не доросли((
Это самая простая CMS))
@vp-webdev, Поздравляю!
Ваш пост был упомянут в моем хит-параде в следующих категориях:
Спасибо - полезная информация - время на обдумывание и руководство к действию.
Ваш пост поддержали следующие Инвесторы Сообщества "Добрый кит":
yefet, knopki, ianboil, vas, mishka, sergiy, ukrainian, tymba, oleg257, urii, larissa, dimarss, tristamoff, brovaryleaks, vasilisapor2, chika25, renat242, vict0r, semasping, tnam0rken, asuleymanov, retoldname, olgabobkovafoto, vika-teplo, rickytrane, prost, sareon, dimk0, kertar, nerengot, foxycat, chimborazo, gbot, xsen, anr, vsebudethorosho, chupaaa
Поэтому я тоже проголосовал за него!
Узнать подробности о сообществе можно тут:
Разрешите представиться - Кит Добрый
Правила
Инструкция по внесению Инвестиционного взноса
Вы тоже можете стать Инвестором и поддержать проект!!!
Если Вы хотите отказаться от поддержки Доброго Кита, то ответьте на этот комментарий командой "!нехочу"