Применение техники ООП при написании плагина, открывает большие возможности для функционала и вносит визуальную гармонию в Ваш код, поэтому игнорировать ООП и продолжать использовать процедурный подход считаю не правильным. В сегодняшней заметке, я расскажу как создать WordPress плагина с применением техники ОПП.
Код ООП базируется на классах и методах, поэтому естественно начинаем с создания базового класса, который будет взаимодействовать с хуками и фильтрами WP
class WPmyPlugin {
public function __construct()
{
}
public function myMegaFunc(){
// основной код
}
}
$wpmyPlugin = new WPmyPlugin();
Все фильтры и хуки должны регистрироваться в конструкторе. Для этого применяется функция add_shortcode() — первым параметром идёт тэг, вторым колбэк функция. Если мы говорим о регистрации внутри объекта — в качестве второго параметра, мы должны использовать массив. Первым элементом которого идёт ссылка на объект — $this, а вторым название метода используемого класса. Подробнее о add_shortcode() можно почитать в документации — http://codex.wordpress.org/Function_Reference/add_shortcode
Полный код к данному моменту:
class WPmyPlugin {
public function __construct()
{
add_shortcode('PluginTag', array($this, 'shortcode'));
}
public function shortcode()
{
}
public function myMegaFunc(){
// основной код
}
}
$wpmyPlugin = new WPmyPlugin();
Этот же код без ООП, с применением процедурного подхода
add_shortcode('shortcode_name', function() {
// основной код
});
Конечно, если Ваш плагин выводит hello world!, применение ООП избыточно, да и не обосновано. Но если Вы разрабатываете, что то по сложнее, то Методы вносят структурированность информации.
Объявленный метод shortcode() служит буфером между основным кодом и тем что возвращается пользователю, именно в нём следует назначить все дефолтные атрибуты и вызвать наш основной метод myMegaFunc()
public function shortcode($atts)
{
extract(shortcode_atts(array(
'images' => 3,
'width' => 50,
'height' => 50,
'caption' => true,
), $atts));
return $this->myMegaFunc($atts['user'], $images, $width, $height, $caption);
}
Жестоко заставлять пользователя при использовании нашего шорткода перечислять все параметры, необходимые для нашего метода. Использование extract(shortcode_atts(), $atts)); даёт возможность дополнить или переназначить наши дефолтные параметры, по желанию пользователя. Например, пользователь хочет видеть 5 изображений, а не 3, как в дефолте:
['PluginTag user=haris images=5]
Базово виджеты WP не поддерживают шорткоды, поэтому поменяем это вручную через фильтр widget_text (подробнее о фильтрах — в codex.wordpress.org )
public function __construct()
{
add_shortcode('PluginTag', array($this, 'shortcode'));
add_filter('widget_text', 'do_shortcode');
}
На данном этапе, чтоб использовать наш метод в шаблоне, нам потребуется создать объект, и только потом вызывать его метод. Думаю разработчикам и верстальщикам шаблонов для WP это бы очень не понравилось. Поэтому упрощаем жизнь используя функцию, вынесенную за пределы класса.
function wp_myPlugin($user, $images = 3, $width = 50, $height = 50, $caption = true)
{
$wpmyPlugin = new WPmyPlugin;
echo $wpmyPlugin->myMegaFunc($user, $images, $width, $height, $caption);
}
Заготовка для написания WordPress плагина с применением ОПП.
Один ответ к “Создание WordPress плагина с применением ОПП”
Я мало работал с wordpress, но у меня при прочтении этого поста появилась такая идея: можно не выносить функцию за пределы класса, а сделать её внутри класса статичной, и тогда вызов из шаблона будет примерно таким:
WPmyPlugin::output($user, $images, $width, $height, $caption);
На мой взгляд, так будет красивее и ООПестее :).
В принципе, во многих случаях и весь класс можно сделать статичным.