Как сделать метод из плагина доступным в теме?
Допустим, это было в моем плагине:
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();
в своей теме:(
3 answers
Альтернативным способом является использование статических методов класса в плагинах и, при необходимости, запись функций в качестве псевдонима:
В плагине:
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, используйте простые действия и фильтры в своей теме и регистрируйте обратные вызовы для тех, кто находится в вашем классе плагинов.
Простой пример
Плагин
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();
}