Как сделать метод из плагина доступным в теме?

Предположим, это было в моем плагине:

class pluginslug_foo { public function bar() { //stuff } } 

и я хотел сделать панель инструментов доступной для использования вне плагина, например, в файле темы, чтобы ее можно было вызвать с помощью pluginslug_bar(); ,

Я пытался:

 function pluginslug_get_foo() { $foo = new pluginslug_foo(); return $foo; } function pluginslug_bar() { $bar = $foo->bar; } 

Но я получил неизвестную переменную ошибку для $ bar, когда я попробовал pluginslug_bar(); в моей теме 🙁

Альтернативный способ – использовать статические методы класса в плагинах и, возможно, писать функции как псевдоним:

в плагине:

 class Pluginslug_Foo { static $foo = 'Bar!'; public static function bar() { return self::$foo; } } if ( ! function_exists( 'pluginslug_bar' ) ) { function pluginslug_bar() { echo Pluginslug_Foo::bar(); } } 

в теме:

 if ( function_exists( 'pluginslug_bar' ) ) { pluginslug_bar(); // echo 'Bar!'; } 

или

 if ( method_exists('Pluginslug_Foo', 'bar' ) ) { echo Pluginslug_Foo::bar(); // echo 'Bar!'; } 

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

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

Основной пример

Plugin

 class Plugin_Class { public function __construct() { $this->register_callbacks(); } protected function register_callbacks() { add_filter( 'theme_foo', array( $this, 'foo' ) ); add_action( 'theme_bar', array( $this, 'bar' ) ); } public function foo() { return 'foo'; } public function bar() { print 'bar'; } } 

тема

 $foo = apply_filters( 'theme_foo', FALSE ); if ( $foo ) echo "foo is $foo"; do_action( 'theme_bar' ); // prints 'bar' 

Вы совершили ошибку в своих функциях. Функция pluginslug_bar не содержит переменной $foo , вам нужно сначала ее инициализировать:

 function pluginslug_get_foo() { $foo = new pluginslug_foo(); return $foo; } function pluginslug_bar() { $foo = pluginslug_get_foo(); $bar = $foo->bar(); } 

Затем в файле functions.php вашей темы вы можете вызвать его так:

 if ( function_exists( 'pluginslug_bar' ) ) { pluginslug_bar(); }