Как использовать автозагрузку и плагин контейнера в WordPress Плагины

Строительство и maintaining 1 плагин WordPress может быть непростой задачей. Больше кодовая, труднее сохранить track всех рабочих частей и их взаимосвязи друг с другом.И вы можете добавить к тому, что ограничения, налагаемые работает в устарелой версии PHP, 5,2 .

В этой статье мы рассмотрим альтернативный путь развития WordPress плагины, с помощью уроки, извлеченные из более сообщества PHP, внешнего мира WordPress.Мы будем идти через этапы создания плагина и исследовать использование автозагрузки, и контейнер плагина.

| Let__75 сек Begin

Первое, что нужно сделать при создании плагина, чтобы дать ему уникальное имя.Имя очень важно, поскольку это будет основой для всех наших уникальных идентификаторов (функция префиксов, префикс класса, ДОМЕНЕ, вариант префикса и т.д.).Имя должно быть уникальным и по wordpress.org пространстве.Это won’ т больно, если мы делаем название броское.F или наш плагин образец я выбрал имя Simplarity, игру на слова “ simple” | и __77 clarity” .

We’ буду считать, у вас есть работающий установки WordPress уже .

Structure

Во-первых, создать каталог с именем simplarity внутри WP-содержание / plugins.Внутри него создать следующую структуру:

  • Simplarity.php: наш главный плагин file
  • CSS / : каталог, содержащий наш styles
  • JS / : каталог, содержащий Java-files
  • Языки / : каталог, который будет содержать перевод files
  • SRC / : каталог, содержащий наш classes
  • Просмотров / : каталог, который будет содержать наш взгляд плагин files

Главная Плагин File

Откройте главный файл плагин, simplarity.php, и добавить информацию о плагинах заголовок:

<?php
/*
Plugin Name: Simplarity
Description: A plugin for smashingmagazine.com
Version: 1.0.0
License: GPL-2.0+
*/

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

Autoloading

Автозагрузка позволяет автоматически загружать классы используя autoloader так что вы don’ т придется вручную включать файлы, содержащие определения классов.Например, всякий раз, когда вам нужно использовать класс, вы должны сделать следующее:

require_once '/path/to/classes/class-container.php';
require_once '/path/to/classes/class-view.php';
require_once '/path/to/classes/class-settings-page.php';

$plugin = new Container();
$view = new View();
$settings_page = new SettingsPage();

С автозагрузкой, вы можете использовать автозагрузчик вместо нескольких require_once3 отчетности.Это также устраняет необходимость обновлять этитребуют заявления всякий раз, когда вы добавить, переименовать или изменить расположение ваших классов.Это большой плюс для сопровождения .

Принятие груша именования класса Names

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

Для наших имен классов мы примем PEAR именования convention 4 .Суть в том, что имена классов буквенные символы в StudlyCaps.Каждый уровень иерархии отделяется с помощью одного подчеркивания.Имена классов будут напрямую отобразится в каталогах, в которых они хранятся .

It’ проще проиллюстрировать на примерах:

  • Класс с именем Simplarity_Plugin будет определен в файле SRC / Simplarity / Plugin.php .
  • Класс с именем Simplarity_SettingsPage будет определен в SRC / Simplarity / SettingsPage.php .

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

Что О WordPress стандарты кодирования для класса имен

Как вы могли бы знать, WordPress имеет свою собственную назвав convention __36 | | 5__7 для имен классов.Она гласит:

Имена классов должны использовать заглавные слова, разделенные подчеркивания.Любые сокращения должны быть в верхнем регистре.[...] Имена файлов класса должно основываться на имя класса с class- префиксом и подчеркивания в имени класса заменены дефисом, например WP_Error становится class-wp-error.php

Я знаю, что мы должны следовать стандартам платформы, что мы, развивающиеся на.Тем не менее, мы рекомендуем использовать PEAR именования, потому что:

  • WP стандарты кодирования не покрывают самозарядные .
  • WP не следовать своим собственным стандартам кодирования.Примеры: class.wp-scripts.php и SimplePie.Это понятно, так как WordPress выросла органически .
  • Совместимость позволяет легко использовать сторонние библиотеки, которые следуют грушевого именования, как Twig.И наоборот, вы можете легко переносить ваш код других библиотек обмена же соглашение .
  • It’ важно ваше автозагрузчик готовы к будущему.Когда WordPress решает поднять ставки и, наконец, перейти к PHP 5.3 в качестве минимального требования, вы можете легко обновить код, чтобы быть PSR-0 или PSR-4-совместимым и воспользоваться встроенными в пространствах имён вместо использования префиксов.Это большой плюс для взаимодействия .

Обратите внимание, что мы только с помощью этогоименования классов.Остальная часть нашего кода будет по-прежнему следовать WordPress стандарты кодирования.It’ важно следовать и соблюдать стандарты платформы, что мы, развивающиеся на .

Теперь, когда мы полностью покрывали именования, мы можем, наконец, построить нашу автозагрузчик .

Строительство Наши Autoloader

Открыть наш главный файл плагина и добавьте следующий код ниже плагина информации заголовка:

spl_autoload_register( 'simplarity_autoloader' );
function simplarity_autoloader( $class_name ) {
  if ( false !== strpos( $class_name, 'Simplarity' ) ) {
    $classes_dir = realpath( plugin_dir_path( __FILE__ ) ) . DIRECTORY_SEPARATOR . 'src' . DIRECTORY_SEPARATOR;
    $class_file = str_replace( '_', DIRECTORY_SEPARATOR, $class_name ) . '.php';
    require_once $classes_dir . $class_file;
  }
}

В центре нашего механизма автозагрузки является PHP’ встроенную в spl_autoload_register 6 функция.Все это делает зарегистрировать функцию, которая будет вызываться автоматически, когда ваш код ссылается на класс, который не был загружен .

Первая строка говорит spl_autoload_register зарегистрировать нашу функцию с именем simplarity_autoloader:

spl_autoload_register( 'simplarity_autoloader' );

Далее определяем | simplarity_autoloader__19 функцию:

function simplarity_autoloader( $class_name ) {
  …
}

Обратите внимание, что он принимает на $class_name параметр.Этот параметр содержит имя класса.Например, когда вы реализуете класс, используя $plugin = new Simplarity_Plugin(), $class_name будет содержать строку “ Simplarity_Plugin”.Так мы добавляем эту функцию в глобальном пространстве, it’ важно, что у нас это префикс simplarity_ .

Следующие проверяет, если линия $classname содержит строку “ Simplarity” который является нашим главным имен уровень:

if ( false !== strpos( $class_name, 'Simplarity' ) ) {

Это будет гарантировать, что автозагрузчик будет работать только на наших занятиях.Без этой проверки, наша автозагрузчик будет работать каждый раз выгружается класс, на который ссылается, даже если класс не наш, который не является идеальным .

Следующая строка строит путь к каталогу, в котором наши классы проживать:

$classes_dir = realpath( plugin_dir_path( __FILE__ ) ) . DIRECTORY_SEPARATOR . 'src' . DIRECTORY_SEPARATOR;

Он использует WP’ с plugin_dir_path 7 получить корневой каталог плагина.__FILE__ это магия constant 8 , который содержит полный путь и имя файла текущего файла.DIRECTORY_SEPARATOR это предопределенная константа, которая содержит либо косую черту или обратную косую черту в зависимости от ОС вашего сервера на.Мы также используем realpath 9 нормализовать путь к файлу .

Эта линия решает путь к файлу определения класса:

$class_file = str_replace( '_', DIRECTORY_SEPARATOR, $class_name ) . '.php';

Он заменяет подчеркивания (_) в $class_name с разделителя каталогов и добавляет .php .

Наконец, эта линия строит путь к файлу определения и включает в себя файл, используя require_once:

require_once $classes_dir . $class_file;

That’ все!Теперь у вас есть автозагрузчика.Попрощайтесь с длинными линиями require_once заявления .

Плагин Container

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

Использование наших Plugin Container

Вот то, что мы можем ожидать от контейнера плагина:

  • Магазин глобальные параметры в одном location

    Часто you’ найдете этот код в плагинах:

    define( 'SIMPLARITY_VERSION', '1.0.0' );
    define( 'SIMPLARITY_PATH', realpath( plugin_dir_path( __FILE__ ) ) . DIRECTORY_SEPARATOR );
    define( 'SIMPLARITY_URL', plugin_dir_url( __FILE__ ) );
    

    Вместо того чтобы делать, что мы могли бы сделать это вместо:

    $plugin = new Simplarity_Plugin();
    $plugin['version] = '1.0.0';
    $plugin['path'] = realpath( plugin_dir_path( __FILE__ ) ) . DIRECTORY_SEPARATOR;
    $plugin['url'] = plugin_dir_url( __FILE__ );
    

    Это дополнительное преимущество не загрязняя глобального пространства имен с нашей plugin’ ы константы, которые в большинстве случаев aren’ т необходимости другими плагинами .

  • Магазин объектов в одном location

    Вместо рассеяния наших классовых экземпляры повсюду в нашей коде мы можем просто сделать это в одном месте:

    $plugin = new Simplarity_Plugin();
    /…/
    $plugin['scripts'] = new Simplarity_Scripts(); // A class that loads javascript files
    
  • Услуги definitions

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

    $plugin['settings_page'] = function ( $plugin ) {
      return new SettingsPage( $plugin['settings_page_properties'] );
    };
    

    Услуги привести к ленивой инициализации в результате чего объекты только экземпляр и инициализировать при необходимости .

    Это также позволяет нам легко реализовать самостоятельно решения дизайн впрыска зависимость.Пример:

    $plugin = new Plugin();
    $plugin['door_width'] = 100;
    $plugin['door_height'] = 500;
    $plugin['door_size'] = function ( $plugin ) {
      return new DoorSize( $plugin['door_width'], $plugin['door_height'] );
    };
    $plugin['door'] = function ( $plugin ) {
      return new Door( $plugin['door_size'] );
    };
    $plugin['window'] = function ( $plugin ) {
      return new Window();
    };
    $plugin['house'] = function ( $plugin ) {
      return new House( $plugin['door'], $plugin['window'] );
    };
    $house = $plugin['house'];

    Это примерно эквивалентно:

    $door_width = 100;
    $door_height = 500;
    $door_size = new DoorSize( $door_width, $door_height );
    $door = new Door( $door_size );
    $window = new Window();
    $house = new House( $door, $window );

    Всякий раз, когда мы получаем объект, а в $house = $plugin['house'];, объект создается (ленивая инициализация) и зависимости разрешаются автоматически .

Строительство Plugin Container

| Let__66 начнем с создания класса контейнера плагин.Мы будем называть это “ Simplarity_Plugin”.Поскольку наша именования диктует, что мы должны создать соответствующий файл: SRC / Simplarity / Plugin.php .

Открыть Plugin.php добавить следующий код:

<?php
class Simplarity_Plugin implements ArrayAccess {
  protected $contents;
    
  public function __construct() {
    $this->contents = array();
  }
  
  public function offsetSet( $offset, $value ) {
    $this->contents[$offset] = $value;
  }

  public function offsetExists($offset) {
    return isset( $this->contents[$offset] );
  }

  public function offsetUnset($offset) {
    unset( $this->contents[$offset] );
  }

  public function offsetGet($offset) {
    if( is_callable($this->contents[$offset]) ){
      return call_user_func( $this->contents[$offset], $this );
    }
    return isset( $this->contents[$offset] ) ? $this->contents[$offset] : null;
  }
  
  public function run(){ 
    foreach( $this->contents as $key => $content ){ // Loop on contents
      if( is_callable($content) ){
        $content = $this[$key];
      }
      if( is_object( $content ) ){
        $reflection = new ReflectionClass( $content );
        if( $reflection->hasMethod( 'run' ) ){
          $content->run(); // Call run method on object
        }
      }
    }
  }
}

Класс реализует ArrayAccess интерфейс:

class Simplarity_Plugin implements ArrayAccess {

Это позволяет использовать его как PHP’ ов массива:

$plugin = new Simplarity_Plugin();
$plugin['version'] = '1.0.0'; // Simplicity is beauty

Функции offsetSet, offsetExists, offsetUnset и offsetGet требуются ArrayAccess быть реализованы.run функция цикл по содержанию контейнера и запустить готовые к выполнению объекты .

Чтобы лучше проиллюстрировать наш контейнер плагин, let’ начнем с построения Подключаемый модуль .

Пример Плагин: Настройки Page

Этот плагин будет добавить страницу настройки имени “ | Simplarity__71 под WordPress Админ → Настройки .

Let’ вернёмся к основной файл плагина.Откройте simplarity.php добавить следующий код.Добавить это ниже кода автопогрузчика:

add_action( 'plugins_loaded', 'simplarity_init' ); // Hook initialization function
function simplarity_init() {
  $plugin = new Simplarity_Plugin(); // Create container
  $plugin['path'] = realpath( plugin_dir_path( __FILE__ ) ) . DIRECTORY_SEPARATOR;
  $plugin['url'] = plugin_dir_url( __FILE__ );
  $plugin['version'] = '1.0.0';
  $plugin['settings_page_properties'] = array( 
    'parent_slug' => 'options-general.php',
    'page_title' =>  'Simplarity',
    'menu_title' =>  'Simplarity',
    'capability' => 'manage_options',
    'menu_slug' => 'simplarity-settings',
    'option_group' => 'simplarity_option_group',
    'option_name' => 'simplarity_option_name'
  );
  $plugin['settings_page'] = new Simplarity_SettingsPage( $plugin['settings_page_properties'] );
  $plugin->run();
}

Здесь мы используем WP’ ы add_action зацепить нашу функцию simplarity_init 105 ~ в |:

add_action( 'plugins_loaded', 'simplarity_init' );

Это важно, поскольку это сделает наш плагин Overridable с помощью remove_action.Пример использования дело будет плагин премиум переопределения бесплатную версию .

Функция simplarity_init содержит наш plugin’ ы код инициализации.В начале, мы просто экземпляр нашего плагина контейнер:

$plugin = new Simplarity_Plugin();

Эти строки назначить глобальные данные конфигурации:

$plugin['path'] = realpath( plugin_dir_path( __FILE__ ) ) . DIRECTORY_SEPARATOR;
$plugin['url'] = plugin_dir_url( __FILE__ );
$plugin['version'] = '1.0.0';

Путь Плагин содержит полный путь к нашей плагина, в url содержит URL к нашей директории плагина.Они пригодятся, когда нужно включать файлы и активы.version содержит текущую версию плагина, который должен соответствовать один в информации заголовка.Полезное, когда вам нужно использовать версию в коде .

Следующий код присваивает различные конфигурационные данные settings_page_properties:

$plugin['settings_page_properties'] = array(
  'parent_slug' => 'options-general.php',
  'page_title' =>  'Simplarity',
  'menu_title' =>  'Simplarity',
  'capability' => 'manage_options',
  'menu_slug' => 'simplarity-settings',
  'option_group' => 'simplarity_option_group',
  'option_name' => 'simplarity_option_name'
);

Эти данные конфигурации, связанные с WP настройки API 10 .

Следующий код создает экземпляр на страницу настроек, проходящей вдоль settings_page_properties:

$plugin['settings_page'] = new Simplarity_SettingsPage( $plugin['settings_page_properties'] );

run метод, где начинается веселье:

$plugin->run();

Это вызовет Simplarity_SettingsPage | __78 сек самостоятельно run метод .

Simplarity_SettingsPage Class

Теперь нам нужно создать Simplarity_SettingsPage класс.It’ са класс, который группирует настройки функции интерфейса .

Создайте файл с именем SettingsPage.php в SRC / Simplarity / .Откройте его и добавьте следующий код:

<?php
class Simplarity_SettingsPage {
  protected $settings_page_properties;

  public function __construct( $settings_page_properties ){
    $this->settings_page_properties = $settings_page_properties;
  }

  public function run() {
    add_action( 'admin_menu', array( $this, 'add_menu_and_page' ) );
    add_action( 'admin_init', array( $this, 'register_settings' ) );
  }

  public function add_menu_and_page() { 

    add_submenu_page(
      $this->settings_page_properties['parent_slug'],
      $this->settings_page_properties['page_title'],
      $this->settings_page_properties['menu_title'], 
      $this->settings_page_properties['capability'],
      $this->settings_page_properties['menu_slug'],
      array( $this, 'render_settings_page' )
    );
  }
    
  public function register_settings() { 
    
    register_setting(
      $this->settings_page_properties['option_group'],
      $this->settings_page_properties['option_name']
    );   
  }
   
  public function get_settings_data(){
    return get_option( $this->settings_page_properties['option_name'], $this->get_default_settings_data() );
  }
    
  public function render_settings_page() {
    $option_name = $this->settings_page_properties['option_name'];
    $option_group = $this->settings_page_properties['option_group'];
    $settings_data = $this->get_settings_data();
    ?>
    <div class="wrap">
      <h2>Simplarity</h2>
      <p>This plugin is using the settings API.</p>
      <form method="post" action="options.php">
        <?php
        settings_fields( $this->plugin['settings_page_properties']['option_group']);
        ?>
        <table class="form-table">
          <tr>
              <th><label for="textbox">Textbox:</label></th>
              <td>
                <input type="text" id="textbox"
                  name="<?php echo esc_attr( $option_name."[textbox]" ); ?>"
                  value="<?php echo esc_attr( $settings_data['textbox'] ); ?>" />
              </td>
          </tr>
        </table>
        <input type="submit" name="submit" id="submit" class="button button-primary" value="Save Options">
      </form>
    </div>
    <?php
  }
   
  public function get_default_settings_data() {
    $defaults = array();
    $defaults['textbox'] = '';
      
    return $defaults;
  }
}

Класса прочности $settings_page_properties хранит настройки, связанные с настройками WP API:

<?php
class Simplarity_SettingsPage {
  protected $settings_page_properties;

Функция конструктора принимает settings_page_properties и сохраняет его:

public funct ... 

Если вы хотите прочитать полностью статью, посетите сайт наших спонсоров

Comments are closed.