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


Допустим, это было в моем плагине:

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(); в своей теме:(

Author: JPollock, 2013-10-01

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!';
}

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

 8
Author: gmazzap, 2013-10-01 10:49:48

Если вы не очень хорошо знакомы с 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'
 6
Author: fuxia, 2016-08-19 13:08:30

Вы допустили ошибку в своих функциях. 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();
}
 2
Author: Eugene Manuilov, 2013-10-01 11:27:19