июля 5, 2011

Создание WordPress плагина с применением ОПП


Применение техники ООП при написании плагина, открывает большие возможности для функционала и вносит визуальную гармонию в Ваш код, поэтому игнорировать ООП и продолжать использовать процедурный подход считаю не правильным. В сегодняшней заметке, я расскажу как создать 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, но у меня при прочтении этого поста появилась такая идея: можно не выносить функцию за пределы класса, а сделать её внутри класса статичной, и тогда вызов из шаблона будет примерно таким:
    WPmyPlugin::output($user, $images, $width, $height, $caption);
    На мой взгляд, так будет красивее и ООПестее :).
    В принципе, во многих случаях и весь класс можно сделать статичным.