Intereting Posts
Проблема с загрузкой различных файлов в качестве настраиваемых полей с форматом сообщения переднего конца Использование '$' вместо 'jQuery' в WordPress Почему перезаписывает $ GLOBALS, убивая the_content ()? Авторизованный пользователь Oauth Как установить отдельную домашнюю страницу для каждого пользователя? WooCommerce – Крюк после изменения загрузки в Admin Редактировать страницу? Проблема с видимостью продуктов Woocommerce при использовании плагина управления доступом групп Выполнение действия POST на главной странице отправляется на страницу сообщений Отображать предстоящие события в течение следующих 30 дней, запрашивая сообщения с меткой времени в пользовательских мета Проблема с различными циклами запросов (и «основной цикл») на странице шаблона шаблона! qTranslate: Скрыть нетранслируемый контент Как удалить возможности липкой записи для определенной роли пользователя? WordPress не создает «большие» миниатюры Как добавить точку (".") В сообщение slug Как добавить атрибут rel к изображениям, которые содержат их категории?

Есть ли документация жизненного цикла плагина?

Есть ли какая-то документация где-то, что объясняет, что такое жизненный цикл плагинов?

Я начинаю новый плагин с стилем ООП, и я только узнал, что мой основной класс интенсифицируется (благодаря Xdebug и Netbeans).
Интересно, почему, и это меня раздражает, потому что я запускаю объект Dropbox-API, и я действительно не думал, что WordPress просто так сильно повлияет на мой основной класс.

Я не нашел ничего, связанного с жизненным циклом плагинов в Codex и Google.

Solutions Collecting From Web of "Есть ли документация жизненного цикла плагина?"

Я начинаю новый плагин с стилем ООП

Что означает «стиль ООП» для вас? Обертывание всех ваших функций с помощью инструкции класса? Тогда вы делаете это неправильно. Вы пропускаете класс как пространство имен.

и я только узнал, что мой основной класс интенсифицируется

А?

class Foo { public function __construct() { // assuming your wp-content dir is writeable $filename = sprintf( WP_CONTENT_DIR . '/dummyfile-%d.txt', time() ); $handle = fopen( $filename, 'w' ); if ( $handle ) { fputs( $handle, '-' ); fclose( $handle ); } } } add_action( 'plugins_loaded', function() { new Foo(); } ); 

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

Попробуем вызов

 class Foo { public function __construct() { $this->write_file( 'in_constructor' ); add_action( 'init', array( $this, 'action_test' ), 10, 0 ); } public function action_test() { $this->write_file( 'in_method_with_action_call' ); } public function write_file( $filename ) { // assuming your wp-content dir is writeable $counter = 1; $fname = sprintf( WP_CONTENT_DIR . '/%s-%d.txt', $filename, $counter ); if ( file_exists( $fname ) ) { preg_match( '/(\d)\.txt/is', $fname, $match ); if ( isset( $match[1] ) ) { $counter = (int) $match[1] + 1; $fname = sprintf( WP_CONTENT_DIR . '/%s-%d.txt', $filename, $counter ); } } $handle = fopen( $fname, 'a+' ); if ( $handle ) { fputs( $handle, '-' ); fclose( $handle ); } else { throw new Exception( "Cannot open file {$fname} for writing" ); } } } add_action( 'plugins_loaded', function() { new Foo(); } ); 

Если я посмотрю в своем каталоге wp-content, я нашел два файла. Больше не надо. Один файл создается при создании экземпляра класса. И один создается при выполнении вызова действия.

Хорошо, давайте сделаем некоторые глупые вещи с нашим экземпляром. Удалите add_action( 'plugins_loaded', .. ) и вместо этого добавьте этот код:

 function bar( $foo ) { $baz = $foo; return $baz; } $f = new Foo(); $GLOBALS['foo'] = $f; $f2 = $f; $f3 = &$f; $f4 = bar( $f2 ); $f5 = bar( $f3 ); 

Сколько файлов вы ожидаете? Я ожидаю два. Один из конструктора, один из метода.

Новый экземпляр создается только при использовании new оператора.

 add_action( 'plugins_loaded', 'new_foo', 10, 0 ); function new_foo() { // first instance new Foo(); } function bar( $foo ) { $baz = $foo; return $baz; } // second instance here!! $f = new Foo(); $GLOBALS['foo'] = $f; $f2 = $f; $f3 = &$f; $f4 = bar( $f2 ); $f5 = bar( $f3 ); 

Теперь я считаю четыре файла. Два из конструктора и два из метода. Это связано с тем, что WordPress сначала включает плагин, а затем выполняет action hook plugins_loaded .

Лучшей практикой является использование action hook plugins_loaded вместо создания экземпляра из функции, потому что, если файл плагина включен в любом месте (например, в другом файле вашего плагина), новый экземпляр класса создается каждый раз, когда файл включен , Action hook plugins_loaded выполняется только один раз для каждого запроса страницы.

Что может случиться, так это то, что вы передаете копию своего класса в фильтр или действие. Например, если вы хотите напрямую изменить переменные класса внутри крючка или фильтра, вы также должны передать крючок по ссылке

 add_action("some_action",array(&$this,"somefunction")) 

вместо

 add_action("some_action",array($this,"somefunction")) 

Как уже упоминалось в bainternet, вы также можете использовать одноэлементный шаблон, чтобы убедиться, что определенный объект инстанцируется только один раз (дальнейшие вызовы возвращают ссылку на этот объект).

Вы также можете рассмотреть возможность создания некоторых функций static (путем предоставления им статического ключевого слова. Обычно это делается для «вспомогательных» функций, которые не взаимодействуют с остальной частью класса. Статические методы могут быть вызваны без создания класса.

Вы также можете передавать статические функции в действие / фильтр:

 add_action("some_action",array("ClassName","Method")) 

Я также проверил http://codex.wordpress.org/Plugin_API/Action_Reference и обнаружил, что плагины могут загружаться только на двух этапах запроса (muplugins_loaded и plugins_loaded).