Оптимальная архитектура плагина wordpress
DESCRIPTION
Презентация Игоря Сазона. WordPress Meetup #2.TRANSCRIPT
Оптимальная архитектура плагина WordPress
Custom Post Types
• Идея плагина• Архитектура кода
• Структура БД
Идея + архитектур
а
• Дизайно-верстка
• Front-End• Back-End
Разработка
• Тестирование• Отладка
Тестирование
06.09.2014 Saint-Petersburg WordPress Meetup #2
Igor Sazonov @tigusigalpa
План доклада
• Правила обычного плагина WordPress• Архитектура WooCommerce• Архитектура Easy Digital Downloads• Архитектура Yoast• Вывод и построение своей архитектуры кода• Что такое Singleton?• Суть предлагаемой архитектуры• Ссылка на скачивание базового плагина…. Идеи..
Правила обычного плагина WordPress/wp-content/plugins/my-plugin – папка плагина/wp-content/plugins/my-plugin/somefile.php – файл с метаданными плагина – главный файл плагина – входная точкаWordPress сканирует все папки внутри wp-content/plugins и ищет там файл с метаданными (wp-admin/includes/plugin.php:get_plugins()#288 строка с помощью get_plugin_data())/*** Plugin Name: Some Plugin Name* Plugin URI: http://www.somewpplugin.com* Description: Great Plugin!* Author: Ivan Ivanov* Author URI: http://www.ivanivanov.com* Version: 1.0*/
Но это самый примитивный способ
WooCommerce assets
css fonts images js
admin frontend jquery-cookie…..
i18n languages…
includes admin api libraries shortcodes class-wc-commets.php…. class-wc-install.php….
uninstall.php woocommerce.php
WordPress
woocommerce.php(class WooCommerce:
defines+includes)
php-classes
/includes
Архитектура WooCommerce (не все – структура)
Easy Digital Downloads assets
css fonts images
colorbox icons…
js admin-scripts.js edd-ajax.js…
includes admin cart checkout class-edd-cron.php…
languages templates
fonts images widget-cart-empty.php…
easy-digital-downloads.php uninstall.php
WordPress
easy-digital-downloads.php(class Easy_Digital_Downloads: Singleton+defines+includes)
php-classes
/includes
Архитектура Easy Digital Downloads (не все – структура)
Yoast WordPress SEO• admin
• license-manager• pages
• bulk-title-editor.php…• ajax.php• class-pointers.php…
• css• frontend
• class-breadcrumbs.php…
• images• inc
• class-rewrite.php…
• js• languages• wp-seo.php• wp-seo-main.php
WordPress
wp-seo.php (defines)
wp-seo-main.php (defines+includes)
/admin
php-classes
/admin/pages
/inc
/frontend
Архитектура Yoast (не все – структура)
Вывод и построение своей файловой архитектурыВыводы:• все файлы front-end (js, css, images, fonts) в
отдельную папку assets• Файлы (если их более 1) подключаемых скриптов – в
подпапки (images/colorbox)• Логику в папку lib. Разделяем логику (php) на
отдельные файлы (например, lib/setup.php) или блоки (lib/widgets) с файлами
Вывод и построение своей архитектурыОптимальная структура файлов (наверное):- assets
- css- fonts- images
- some-lib-files-if-needed- js
- languages- lib
- some-folders- setup.php – инициализация всех
action’ов
- plugin-name.php – главный входной файл с метаданными
- uninstall.php
WordPress
plugin-name.php
/lib/setup.php(class
Plugin_Setup+includes+defines)
php-classes
/lib
Что такое SingletonSingleton – порождающий шаблон проектирования, гарантирующий что в однопоточном приложении будет единственный экземпляр класса с глобальной точкой доступа.class MyClass { private static $_instance;
public function __construct() { /*do something*/ } public static function getInstance() { if ( ! isset( self::$_instance ) && ! ( self::$_instance instanceof MyClass ) ) { self::$_instance = new self(); } return self::$_instance; }}
Суть (для понимания кода плагина)1. Входной файл (plugin-name.php) передает управление в
lib/setup.php в конструктор класса MyPlugin_Setup. Этот класс будет содержать в себе настройки плагина (версия итп) и будет родителем для всех классов из папки lib.
2. В конструкторе класса MyPlugin_Setup происходит подключение файлов из папки lib и дефайн (определение) необходимых значений (путь к плагину итп). Каждый файл в папке lib это соответствующий класс, который наследуется от класса MyPlugin_Setup, а также каждый класс содержит в себе Singleton-метод getInstance() и метод init();
3. Конструктор класса MyPlugin_Setup в конструкторе перебирает все классы из подключенных файлов и через Singleton каждого класса вызывает метод init();
Таким образом мы разделяем логику плагина на соответствующие тематические блоки/классы. Это удобно для совместной работы над плагином и просто удобно.
Ссылка на скачивание базового плагинаhttps://www.dropbox.com/s/iosj1r4suyrt9kv/optimal-big-plugin.zip?dl=0