web-dev-qa-db-ja.com

テーマで利用可能なプラグインからメソッドを作るには?

これが私のプラグインの中にあるとしましょう:

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

私のテーマでpluginslug_bar();を試したところ、$ barに対して未知の変数エラーが発生しました:(

4
JPollock

別の方法は、プラグインで静的クラスメソッドを使用し、オプションでエイリアスとして関数を書くことです。

プラグインで:

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

もちろん、静的メソッドや変数は必ずしも範囲に収まりません、そしてこれは一般的な理論的な例です:あなたの本当の範囲/コードを知らなければそれがあなたにとって良いかどうかを言うことは不可能です。

6
gmazzap

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'
4
fuxia

あなたは自分の機能を間違えました。 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
Eugene Manuilov