Апр
22
0

Создание своего виджета на основе базового (extends WP_Widget)

extends WP_WidgetУвы, у меня пока нет времени для написания большого поста про создание виджетов со всеми тонкостями и нюансами, поэтому просто рассмотрю одну интересную задачу по этой теме (данный опыт многим пригодится). Мне требовалось изменить формат отображения списка последних комментариев в сайдбаре. Изначально думал найти хаки, как для настройки виджета архивов, но ничего подходящего не было. Ставить какой-то плагин последних комментариев не хотелось, и я придумал кое-что поинтереснее. Почему бы не использовать базовую функциональность WordPress?

Если бы мне требовалось сделать это лет 10+ назад, когда я только присматривался к Вордпресс, то я бы просто нашел исходный код нужного мне виджета и внес в него изменения. Для последних комментариев он находится по такому адресу:

/wp-includes/widgets/class-wp-widget-recent-comments.php

Но так поступать ни в коем случае нельзя — править исходники ядра системы категорически не рекомендуется!

Поэтому сделаем все правильно:

1. Данный файл нам понадобится в работе, поэтому скачиваем его на компьютер и переименуем, например, в widget-myrecent-comments.php (содержимое пока что-то остается прежним).

2. В целом, чтобы создать новый виджет нужно:

  1. Используя базовый класс WP_Widget, создать новый объект с аналогичными настройками и функциями, в которых задается не только отображение виджета на сайте, но и в самой админке. Простым языком – мы делаем копию стандартного элемента системы и вносим в нее нужные изменения.
  2. Зарегистрировать его в системе с помощью функции register_widget.
  3. Подключить этот файл в functions.php (поскольку мы весь код размещаем не в нем, а во внешнем источнике).

Если внимательно посмотреть на наш исходный файл, то в самом начале увидите, как с помощью функции extends обычный виджет WordPress “расширяет” определенный в системе класс WP_Widget.

Расширяем класс WP_Widget

Структура этого объекта доступна на официальным сайте — в нем есть определенные переменные и функции, которые разработчик может использовать для реализации своего собственного уникального виджета.

3. В дальнейшей работе мы будем ориентироваться на базовый class-wp-widget-recent-comments.php (который уже успели переименовать на первом шаге). Следуя алгоритму выше, создаем свой новый виджет с уникальным названием MY_Recent_Comments. Для этого меняем строку:

class WP_Widget_Recent_Comments extends WP_Widget {

На:

class MY_Recent_Comments extends WP_Widget {

Затем опускаемся чуть ниже к строчке:

parent::__construct( 'recent-comments', __( 'Recent Comments' ), $widget_ops );

Вместо которой пишем:

parent::__construct( 'MY_Recent_Comments', __('MY_Recent_Comments Widget', 'framework'), $widget_ops );

Из моих древних институтских познаний ООП вспоминается что-то про функцию конструктор (__construct), которая является обязательной при создании класса. В нашем случае в первом параметре задается ID виджета ($id_base). Он не обязательно должен быть таким же, как и название класса, но главное вставить там уникальное имя. Плюс добавляете название во второй параметр.

4. Теперь регистрируем виджет. Для этого в самом начале файла добавляем:

add_action( 'widgets_init', 'add_my_recent_widgets' );
// Register widget.
function add_my_recent_widgets() {
	register_widget( 'MY_Recent_Comments' );
}

Здесь в первой строке вы, по сути, указываете новую функцию, а ниже расписываете ее действие, которое там всего одно – регистрация нового виджета с тем же именем MY_Recent_Comments.

Короче говоря, дабы было понятнее показываю какие именно строки я изменил/добавил в базовый файл class-wp-widget-recent-comments.php (картинка кликабельна).

Измененный файл шаблона

5. Заливаем новый widget-myrecent-comments.php на FTP-хостинга в директорию активированного шаблона. А затем добавляем в functions.php сроку для его подключения:

include("widget-myrecent-comments.php");

На этом все. Теперь заходите в админку в раздел «Внешний вид» — «Виджеты» и проверяете добавился ли новый.

Как расширить/наследовать WP_widget дважды

В ходе работы нашел еще один хак — возможно, кому-то пригодится.

 class Foo extends WP_Widget {
    /*constructs etc*/
    function __construct($id = 'twidg', $descr = 'Test Widget', $opts = array()) {
      $widget_opts = array();
      parent::__construct($id,$descr,$widget_opts);
      /*do stuff*/
    }
 
    function widget() {
      echo 'test widget';
    }
  }
 
function rw_cb() {
  register_widget("Foo");
}
add_action('widgets_init', 'rw_cb');
 
class Bar extends Foo {     
    function __construct() {
      $widget_opts = array();
      parent::__construct('twidgextended','Test Widget 2',$widget_opts);
    }
 
    function widget() {
      echo 'test widget 2';
    }
}
function rw_cb_2() {
  register_widget("Bar");
}
add_action('widgets_init', 'rw_cb_2');

Итого. Да, алгоритм выглядит намного сложнее, чем просто найти и установить специальный модуль, но многие в онлайне советовали сделать именно так. Плюс этого подхода в том, что вы сможете применить его для любого другого базового WordPress-виджета. И вам не понадобятся никакие плагины.

рейтинг Оцените статью:
Ужасная статьяНичего интересногоТак себеНормальноХорошоКлассный постВ закладки!
(голосов - 15, средний балл: 4,80 из 7)
Загрузка...

категория Категории: Виджеты; Возможности;
теги Теги: , , , , , .
Оставить комментарий


Блог Wordpress Inside поможет вам научиться работать в вордпресс, закрепить и расширить имеющиеся знания. Плагины и шаблоны, разные хаки и функции wp, оптимизация и безопасность системы – все это и намного больше вы сможете найти на страницах нашего проекта!

Если хотите быстро и оперативно получать последние новости и статьи, то рекомендуем подписаться на обновления блога:

Поиск:
Последние посты
Лучшее в категории

Облако тегов
Скажи свое мнение!

В чем основные плюсы Wordpress?

Посмотреть результаты

Загрузка ... Загрузка ...
Друзья проекта
Последние новости