Создание виджетов WordPress

Здравствуйте, друзья! Сегодня поговорим о виджетах WordPress. В этой статье я не буду писать о том, как добавить виджеты в wordpress в админке, об этом публикаций полно в интернете, а поговорим о более интересных моментах данной темы.

Рассмотрим:

  • Создание виджета WordPress непосредственно в теме оформления
  • Создание собственного плагина, который будет выводить виджет
  • Отключение стандартных виджетов WordPress

Создавать будем похожий на стандартный виджет вордпресса «текст». Чтобы создавать виджеты, Вы должны знать php хотя бы на базовом уровне.

Добавление виджета к теме оформления

Код создаваемого виджета можно писать прямо в файле function.php, но чтобы не захламлять данный файл, я предлагаю другой вариант. Создать отдельный файл в папке с темой с расширением php, а если собираетесь писать несколько виджетов, то создать папку, например, с названием my-widget, а уже в ней файл.

При помощи include подключаем и указываем путь к созданному файлу с будущим кодом виджета в function.php.

// Подключение первого виджета
include("my-widget/first-widget.php");

Открываем созданный файл виджета и в нем первым делом открываем конструкцию php, а закрывать ее не нужно. Затем необходимо передать название создаваемого класса виджета, который будет расширять основной класс WP_Widget.

<?php
class My_First_Widget extends WP_Widget{
//Код виджета
}
//Регистрация виджета
add_action( 'widgets_init', create_function( '', 'register_widget("My_First_Widget");' ) );

Весь код нужно писать внутри созданного класса, кроме регистрации виджета. Вот весь рабочий код виджета с комментариями.

<?php
/*
* Добавление нового виджета.
*/
class My_First_Widget extends WP_Widget{
//Вызов конструктора
function __construct(){
$args = array(
'name' => 'Мой первый виджет',
'description' => 'Описание виджета',
'classname' => 'my-test'
);
parent::__construct('my_first', '', $args);
}
//Вывод виджета на сайте для посетителей (во Фронт-энде)
function widget($args, $instance){
extract($args);
extract($instance);

$title = apply_filters( 'widget_title', $title );
$text = apply_filters( 'widget_text', $text );

echo $before_widget;
echo $before_title . $title . $after_title;
echo "<div>$text</div>";
echo $after_widget;
}
//Админ-часть виджета (Бек-энд)
function form($instance){
extract($instance);
?>

<p>
<label for="<?php echo $this->get_field_id('title') ?>">Заголовок:</label>
<input type="text" name="<?php echo $this->get_field_name('title') ?>" id="<?php echo $this->get_field_id('title') ?>" value="<?php if( isset($title) ) echo esc_attr( $title ); ?>" class="widefat">
</p>

<p>
<label for="<?php echo $this->get_field_id('text') ?>">Текст:</label>
<textarea class="widefat" name="<?php echo $this->get_field_name('text') ?>" id="<?php echo $this->get_field_id('text') ?>" cols="20" rows="5"><?php if( isset($text) ) echo esc_attr( $text ); ?></textarea>
</p>

<?php
}
//Сохранение и обновление настроек виджета. Данные очищаются и возвращаются для сохранения в базу данных
function update($new_instance, $old_instance){
$new_instance['title'] = !empty($new_instance['title']) ? strip_tags($new_instance['title']) : '';
return $new_instance;
}

}
//Регистрация виджета
add_action( 'widgets_init', create_function( '', 'register_widget("My_First_Widget");' ) );

Создаем плагин-виджет WordPress

Отличие виджета, реализованного в теме и написанного плагином, в том, что при смене темы оформления виджет-плагин останется, а виджет темы нет.

Разница в коде будет незначительной, нужно написать информацию о плагине для отображения в админке в разделе «плагины», а регистрацию рассмотрим немного другим способом. Конструкция php также только открывается в начале без закрывающего тега ?>.

<?php
/*
Plugin Name: Мой первый виджет
Description: Описание моего первого виджета
Plugin URI: https://zyubin.ru
Author: Ваше имя
Author URI: https://zyubin.ru
Version: 1.0
*/

add_action( 'widgets_init', 'my_first_widget' );
//Регистрация виджета
function my_first_widget(){
register_widget( 'My_First_Widget' );
}

В закомментированной части измените информацию на свою.

Чтобы создать плагин, нужно в корне сайта открыть папку wp-content, затем в папке plugins создать папку и в ней файл php. В файл помещаем код и активируем плагин в админке.

Окончательный код виджета-плагина будет вот таким.

<?php
/*
Plugin Name: Мой первый виджет
Description: Описание моего первого виджета
Plugin URI: https://zyubin.ru
Author: Ваше имя
Author URI: https://zyubin.ru
Version: 1.0
*/

add_action( 'widgets_init', 'my_first_widget' );
//Регистрация виджета
function my_first_widget(){
register_widget( 'My_First_Widget' );
}
/*
* Добавление нового виджета.
*/
class My_First_Widget extends WP_Widget{
//Вызов конструктора
function __construct(){
$args = array(
'name' => 'Мой первый виджет',
'description' => 'Описание виджета',
'classname' => 'my-test'
);
parent::__construct('my_first', '', $args);
}
//Вывод виджета на сайте для посетителей (во Фронт-энде)
function widget($args, $instance){
extract($args);
extract($instance);

$title = apply_filters( 'widget_title', $title );
$text = apply_filters( 'widget_text', $text );

echo $before_widget;
echo $before_title . $title . $after_title;
echo "<div>$text</div>";
echo $after_widget;
}
//Админ-часть виджета (Бек-энд)
function form($instance){
extract($instance);
?>

<p>
<label for="<?php echo $this->get_field_id('title') ?>">Заголовок:</label>
<input type="text" name="<?php echo $this->get_field_name('title') ?>" id="<?php echo $this->get_field_id('title') ?>" value="<?php if( isset($title) ) echo esc_attr( $title ); ?>" class="widefat">
</p>

<p>
<label for="<?php echo $this->get_field_id('text') ?>">Текст:</label>
<textarea class="widefat" name="<?php echo $this->get_field_name('text') ?>" id="<?php echo $this->get_field_id('text') ?>" cols="20" rows="5"><?php if( isset($text) ) echo esc_attr( $text ); ?></textarea>
</p>

<?php
}
//Сохранение и обновление настроек виджета. Данные очищаются и возвращаются для сохранения в базу данных
function update($new_instance, $old_instance){
$new_instance['title'] = !empty($new_instance['title']) ? strip_tags($new_instance['title']) : '';
return $new_instance;
}
}

Отключение стандартных виджетов WordPress

Все стандартные виджеты WordPress в большинстве случаев не используются. Чаще других используются: «поиск», «страницы», «произвольное меню» и «категории», а могут и эти виджеты не быть задействованы на сайте, если стоят заменяющие их плагины, которые намного функциональней и привлекательней стандартных. При этом неиспользуемые виджеты все равно создают дополнительные запросы к серверу и просто занимают лишнее место в админке. Чтобы их отключить, нужно вставить следующий код в functios.php.

/*--------------------------------------------------------------------------------*/
/*--------------------Отключение всех стандартных виджетов -----------------------*/ 
/*--------------------------------------------------------------------------------*/
add_action('widgets_init', 'unregister_basic_widgets' );
function unregister_basic_widgets() {
 unregister_widget('WP_Widget_Pages'); // Виджет страниц
 unregister_widget('WP_Widget_Calendar'); // Календарь
 unregister_widget('WP_Widget_Archives'); // Архивы
 unregister_widget('WP_Widget_Links'); // Ссылки
 unregister_widget('WP_Widget_Meta'); // Мета виджет
 unregister_widget('WP_Widget_Search'); // Поиск
 unregister_widget('WP_Widget_Text'); // Текст
 unregister_widget('WP_Widget_Categories'); // Категории
 unregister_widget('WP_Widget_Recent_Posts'); // Последние записи
 unregister_widget('WP_Widget_Recent_Comments'); // Последние комментарии
 unregister_widget('WP_Widget_RSS'); // RSS
 unregister_widget('WP_Widget_Tag_Cloud'); // Облако меток
 unregister_widget('WP_Nav_Menu_Widget'); // Произвольное меню
}

Данный код отключает все стандартные виджеты, если Вы используете какие-то из них, то просто удалите строки отключения нужных виджетов из php кода.

На этом буду заканчивать, теперь Вы знаете, как создать и отключить ненужные виджеты в WordPress. Если остались вопросы, задавайте в комментариях. Так же рекомендую прочитать статью: «Как создать свою тему для WordPress».

Добавить комментарий