Активированный плагин хранится как объект, а не как путь


Это кажется очень необычным поведением: обычно при активации плагина путь к основному файлу плагина (или начальной загрузке) сохраняется в базе данных в разделе options.active_plugins. Однако что-то в следующем коде заставляет Wordpress хранить сам объект, а не путь к нему, в базе данных.

Вот загрузочный файл плагина (bootstrap.php):

/**
 * Plugin metadata
 */

require_once( plugin_dir_path( __FILE__ ) . 'MyPlugin.php' );

$plugin = new MyPlugin();
$plugin->init();

После активации запись опции active_plugins будет выглядеть следующим образом (получена с помощью get_option( 'active_plugins' ):

Array {
    [0] => (object) MyPlugin
}

Когда ожидаемый результат будет:

Array {
    [0] => bootstrap.php
}
Author: Yoav Kadosh, 2014-05-20

2 answers

Вы просто не должны добавлять код вне действий (обратные вызовы, прикрепленные к крючкам и фильтрам). В противном случае ваши переменные могут конфликтовать с глобальными переменными. По умолчанию/первым действием для начальной загрузки плагина будет (в зависимости от типа плагина): plugins_loaded или muplugins_loaded.

Прикрепите крючки оттуда к wp_loaded, если вы хотите, чтобы материал запускался на init (но сделайте это многосайтовым сохранением - init имеет и другие недостатки).

 2
Author: kaiser, 2014-05-21 01:26:05

Оказывается, что использование переменной с именем $plugin в качестве части процесса начальной загрузки плагина приводит к тому, что Wordpress хранит содержимое этой переменной, а не содержит путь к файлу. Чтобы устранить проблему, просто используйте другое имя переменной:

/**
 * Plugin metadata
 */

require_once( plugin_dir_path( __FILE__ ) . 'MyPlugin.php' );

$plugin_starter = new MyPlugin();
$plugin_starter->init();
 -1
Author: Yoav Kadosh, 2014-05-20 23:51:48