Создание своего виджета на основе базового (extends WP_Widget)
Увы, у меня пока нет времени для написания большого поста про создание виджетов со всеми тонкостями и нюансами, поэтому просто рассмотрю одну интересную задачу по этой теме (данный опыт многим пригодится). Мне требовалось изменить формат отображения списка последних комментариев в сайдбаре. Изначально думал найти хаки, как для настройки виджета архивов, но ничего подходящего не было. Ставить какой-то плагин последних комментариев не хотелось, и я придумал кое-что поинтереснее. Почему бы не использовать базовую функциональность WordPress?
Если бы мне требовалось сделать это лет 10+ назад, когда я только присматривался к Вордпресс, то я бы просто нашел исходный код нужного мне виджета и внес в него изменения. Для последних комментариев он находится по такому адресу:
/wp-includes/widgets/class-wp-widget-recent-comments.php
Но так поступать ни в коем случае нельзя — править исходники ядра системы категорически не рекомендуется!
Поэтому сделаем все правильно:
1. Данный файл нам понадобится в работе, поэтому скачиваем его на компьютер и переименуем, например, в widget-myrecent-comments.php (содержимое пока что-то остается прежним).
2. В целом, чтобы создать новый виджет нужно:
- Используя базовый класс WP_Widget, создать новый объект с аналогичными настройками и функциями, в которых задается не только отображение виджета на сайте, но и в самой админке. Простым языком – мы делаем копию стандартного элемента системы и вносим в нее нужные изменения.
- Зарегистрировать его в системе с помощью функции register_widget.
- Подключить этот файл в functions.php (поскольку мы весь код размещаем не в нем, а во внешнем источнике).
Если внимательно посмотреть на наш исходный файл, то в самом начале увидите, как с помощью функции extends обычный виджет WordPress “расширяет” определенный в системе класс 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-виджета. И вам не понадобятся никакие плагины.
Блог Wordpress Inside поможет вам научиться работать в вордпресс, закрепить и расширить имеющиеся знания. Плагины и шаблоны, разные хаки и функции wp, оптимизация и безопасность системы – все это и намного больше вы сможете найти на страницах нашего проекта!
Если хотите быстро и оперативно получать последние новости и статьи, то рекомендуем подписаться на обновления блога:
- Як сховати відсутні товари в Woocommerce шорткодах та схожих товарах
- Сервіс AdMaven + плагін для монетизації трафіка на WordPress сайтах
- Плагіни для створення стрічки новин з біжучим рядком в WordPress
- Як змінити розміщення кнопки оформлення замовлення в WooCommerce
- Плагін WHWS Display In Stock Products First – відображення товарів в наявності першими
- Підписка MonsterONE: чи варто використовувати цей сервіс у 2023 році? (+5 продуктів, які треба скачати в першу чергу)
- Онлайн генератор ссылок на мессенджеры для WordPress и не только
- WooCommerce (46)
- Безопасность (12)
- Видео (6)
- Виджеты (28)
- Возможности (141)
- Вопрос-ответ (6)
- Начинающим (52)
- Новости (46)
- Оптимизация (23)
- Плагины (246)
- Сервисы (87)
- Хаки и секреты (87)
- Шаблоны (45)
- Дизайн Мания - о веб-дизайне и не только.
- Tod's Blog - все про заработок онлайн.
- Вебдванольные заметки - обзоры веб-сервисов.
- Советы по выбору холодильника LG с технологией No Frost
- Зачем нужны Wi-Fi ретрансляторы и как выбрать подходящую модель
- Введение в онлайн-казино Slotor777: многообразие игр и привлекательные бонусы
- Необходимость использования облачного хранилища в наше время, что важно и как выгодно?
- Спрощення процесу звітності за допомогою програми BAS Бухгалтерія
- Технологія підключення інтернету GPON та її переваги
- За що гравці найбільше цінують Lineage 2
- Для каких проектов нужна аренда виртуального сервера и что такое VPS