У тех кто хоть раз делал свой шаблон для WordPress, возникал вопрос: "А как же сделать свой собственный виджет?" Давайте, я попробую рассказать как это сделать.
Как вы уже догадались, в этой статье речь пойдет о создании своего виджета.
Содержание
- 1. Стандартное создание виджета WordPress.
- 2. Создание виджета WordPress на основе классов SP_Widget и SP_Widget_ABS.
1. Стандартное создание Виджета WordPress
Давайте рассмотрим по порядку процесс создания виджета.
1.1. Для начала надо зарегистрировать новую область для виджета с помощью register_sidebar.
Создадим функцию sp_widgets_init и прикрепим ее к хуку widgets_init. Далее в нашей функции вызываем register_sidebar, где указываем название области виджета ('name' => 'test wiget'),
ее уникальный id ('id' => 'test-wiget-area-id') и описание ('description' => 'add wiget here')
Полученный код будет иметь следующий вид:
function sp_widget_area_init() {
register_sidebar( array(
'name' => 'Test wiget area',
'id' => 'test-wiget-area-id',
'description' => 'add wiget here',
'before_widget' => '',
'after_widget' => '',
'before_title' => '',
'after_title' => '',
));
}
add_action('widgets_init', 'sp_widget_area_init');
Добавляем его в functions.php нашей темы.
1.2. Область готова. Теперь ее нужно вызвать во внешней части сайта (frondend). Делается это с помощью dynamic_sidebar(), где мы указываем уникальный id области виджета, в нашем случае это test-wiget-area-id.
if ( is_active_sidebar('test-wiget-area-id')){
echo '';
dynamic_sidebar('test-wiget-area-id');
echo '';
}
Добавляем его в нужный файл темы, к примеру в footer.php.
1.3. Осталось самое интересное. Создание самого виджета. Для этого нам потребуется стандартный класс WordPress по названием WP_Widget.
Создадим файл widgets.php и подключим его в functions.php нашей темы.
require get_template_directory() . '/inc/widgets.php';
Далее в файле widgets.php создадим класс тестового виджета SP_Test_Widget на основе класса WP_Widget и структура нашего виджета будет иметь вот такой вид:
class SP_Test_Widget extends WP_Widget {
function __construct() {
parent::__construct(
'sp_test_widget',
'Test widget',
array('description' => 'Test widget description')
);
}
function widget($args, $instance) {
//frontend
$sp_str = apply_filters('widget_text', $instance['sp_str']);
echo $args['before_widget'];
echo ''.$sp_str.'
';
echo $args['after_widget'];
}
function form($instance) {
//backend
if(!empty($instance['sp_str'])) $sp_str = $instance['sp_str'];
else $sp_str = '';
echo 'Строка:';
echo '<input type="text" class="sp_str" id="'.esc_attr($this->get_field_id('sp_str')).'" name="'.esc_attr($this->get_field_name('sp_str')).'" value="'.esc_attr($sp_str).'">
';
}
function update($new_instance, $old_instance) {
//сохранение данных
$instance = array();
$instance['sp_str'] = ( ! empty( $new_instance['sp_str'] ) ) ? sanitize_text_field($new_instance['sp_str']) : '';
return $instance;
}
}
function register_sp_widget() {
register_widget('SP_Test_Widget');
}
add_action('widgets_init', 'register_sp_widget');
Тут я думаю визуально все понятно.
В __construct() мы указываем уникальный id виджета(sp_test_widget), его имя (Test widget) и описание ('description' => 'Test widget description').
Метод widget() отвечает за frontend(внешняя часть сайта). Здесь в $args содержатся параметры, а в $instance значения (в нашем случае строка $instance['sp_str']);
Метод form() отвечает за backend(админка), здесь мы работаем со значениями $instance (в нашем случае строка $instance['sp_str']).
Метод update() сохраняет изменение данных в виджете.
2. Создание виджета WordPress на основе класса SP_Widget
В примере который я показал выше, видно как можно создавать свои виджет. И вроде все просто и хорошо. А если вместо одного поля, будет 10 полей, которые нужно добавить в виджет. Код станет большим и не читаемым. Меня такое положение дел не устраивает и я создал свой класс, с помощью которого можно быстро и удобно работать с виджетами.
Давайте разберем процесс создание виджета на основе моего класса SP_Widget
2.1 Для начала подключим класс в файл functions.php нашей темы, перед widgets.php
require get_template_directory() . '/inc/class-sp-widget.php'; require get_template_directory() . '/inc/widgets.php';
Теперь зарегистрируем область виджетов.
$spWC = new SP_Widget();
$args = array(
'name' => 'Test wiget area',
'id' => 'test-wiget-area-id',
'description' => 'add wiget here',
);
$spWC->sp_register_widget_area($args);
Здесь мы создаем экземпляр класс SP_Widget и вызываем метод sp_register_widget_area, куда в свою очередь передаем параметры.
2.2. Теперь в файле widgets.php создаем тестовый виджет. Код примера который я показывал выше нужно закомментировать.
class SP_Test_Widget extends SP_Widget_ABS {
function __construct(){
parent::__construct('sp_test_widget', 'Test widget', array('description' => 'Test widget description'));
add_action('widgets_init', array($this,'sp_register_widget'));
}
function sp_register_widget() {
register_widget(get_class($this));
}
function sp_form($data){
$this->sp_add_fields_widget(
'text',
'Строка',
'Описание',
$this->sp_get_default_value($data, 'sp_str'),
'sp_str'
);
$this->sp_add_fields_widget(
'number',
'Число',
'Описание',
$this->sp_get_default_value($data, 'sp_str2'),
'sp_str2'
);
}
function sp_widget($args, $data){
$parameters = array();
foreach ($data as $key => $value) {
$parameters[$key] = apply_filters('widget_text', $value);
}
echo $args['before_widget'];
echo ''.$parameters['sp_str'].'
';
echo ''.$parameters['sp_str2'].'
';
echo $args['after_widget'];
}
}
$spTestWidget = new SP_Test_Widget();
Здесь мы также в __construct() указываем нужные параметры. В методе sp_register_widget ничего не делаем, оставляем как есть. В методе sp_form() вызываем метод sp_add_fields_widget, где указываем тип поля, название, описание, значение по умолчанию и id.
Как раз в методе sp_add_fields_widget и содержится удобство, нам не нужно каждый раз создавать html разметку поля и в методе update указывать какое поле сохранять.
Ну и метод sp_widget() отвечает за frontend.
Метод sp_add_fields_widget() поддерживает два типа полей:
text - текстовое поле
number - числовое поле
Скачать class-sp-widget.php можно тут.
Файл содержит два класса SP_Widget и SP_Widget_ABS
SP_Widget - предназначен для работы с областями виджетов
SP_Widget_ABS - предназначен для работы с виджетами.
Спасибо за статью, будет кому то полезно.