зарегистрировать дочерний класс в другом плагине

Я думаю, что это должно быть относительно легко, но почему-то я не могу понять, как это сделать. по существу есть существующий плагин, который делает это:

add_action('widgets_init', create_function('', 'register_widget("Foo");')); if ( ! class_exists( 'Foo' ) ) { class Foo extends WP_Widget { /*constructs etc*/ }} 

теперь я хотел бы написать еще один плагин (расширение по существу), которое расширяет вышесказанное. Я попытался сделать что-то вроде следующего (а также попытался – напрасно – найти несколько примеров / документации)

 add_action('widgets_init', create_function('', 'register_widget("Bar");')); class Bar extends Foo { function __construct() { /*do stuff*/ } } 

но все, что я когда-либо получаю, это

 <b>Fatal error</b>: Class 'Foo' not found in ... 

так что я полагаю, что речь идет о том, чтобы «Бар» выполнял ПОСЛЕ Foo, но я не знаю, как это сделать.

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

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

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

 add_action( 'widgets_init', create_function('', 'register_widget("Bar");') ,100 ); 

Я не знаю, будет ли это работать в вашем случае. Я никогда не пробовал.

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

Изменение порядка загрузки плагинов
Автоматически ли активированный плагин означает, что его методы доступны для других функций WP?

widget_init запускается после plugins_loaded поэтому, вероятно, это не будет проблемой в вашем случае.

При дальнейшем исследовании … Я получаю ошибки, связанные с отсутствующими переменными, требуемыми конструктором. Следующие работы.

 if ( ! class_exists( 'Foo' ) ) { class Foo extends WP_Widget { /*constructs etc*/ function __construct($id = 'twidg', $descr = 'Test Widget', $opts = array()) { $widget_opts = array(); parent::__construct($id,$descr,$widget_opts); /*do stuff*/ } } } function rw_cb() { register_widget("Foo"); } add_action('widgets_init', 'rw_cb'); class Bar extends Foo { function __construct() { $widget_opts = array(); parent::__construct('twidgextended','Test Widget 2',$widget_opts); } } function rw_cb_2() { register_widget("Bar"); } add_action('widgets_init', 'rw_cb_2'); 

Когда каждый компонент вставлен в файл фиктивного плагина, он работает. Единственный раз, когда я получаю фатальную ошибку, связанную с не найденным файлом класса, я пытаюсь активировать плагин с определением класса Bar , перед плагином с определением Foo , что имеет смысл.

Обертка, которая блокирует следующим образом, решает эту проблему, и вы можете активировать ее в любом порядке.

 if (class_exists('Foo')) { class Bar extends Foo { function __construct() { $widget_opts = array(); parent::__construct('twidgextended','Test Widget 2',$widget_opts); } } function rw_cb_2() { register_widget("Bar"); } add_action('widgets_init', 'rw_cb_2'); } 

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

  add_action( 'widgets_init', 'extend_foo' ); function extend_foo(){ if (class_exists( 'Foo' ) ) { class Bar extends Foo { function __construct() { parent::__construct(); } } } } 

(хотя я не уверен, что это самый элегантный способ делать что-то, хотя … но если он работает …)