web-dev-qa-db-fra.com

Comment rendre la méthode du plugin disponible dans le thème?

Disons que c'était dans mon plugin:

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

et je voulais rendre la barre de méthode disponible pour une utilisation en dehors du plug-in, par exemple dans un fichier de thème afin de pouvoir l'appeler avec pluginslug_bar();.

J'ai essayé:

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

Mais j'ai eu une erreur de variable inconnue pour $ bar quand j'ai essayé pluginslug_bar(); dans mon thème :(

4
JPollock

Une autre méthode consiste à utiliser des méthodes de classe statiques dans les plugins et éventuellement à écrire des fonctions sous forme d'alias:

dans le plugin:

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

dans le thème:

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

ou

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

Bien sûr, les méthodes statiques et les variables ne correspondent pas toujours à la portée, et il s'agit d'un exemple théorique général: sans connaître votre véritable portée/code, il est impossible de dire si c'est bon pour la santé ou non.

6
gmazzap

Si vous n'êtes pas très familiarisé avec PHP, utilisez des actions et des filtres simples dans votre thème et enregistrez des rappels pour ceux de votre classe de plug-in.

Un exemple de base

Brancher

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

Thème

$foo = apply_filters( 'theme_foo', FALSE );

if ( $foo )
    echo "foo is $foo";

do_action( 'theme_bar' ); // prints 'bar'
4
fuxia

Vous avez commis une erreur dans vos fonctions. La fonction pluginslug_bar ne contient pas la variable $foo, vous devez d'abord l'initialiser:

function pluginslug_get_foo() {
    $foo = new pluginslug_foo();
    return $foo;
}

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

Ensuite, dans le fichier functions.php de votre thème, vous pouvez l'appeler comme suit:

if ( function_exists( 'pluginslug_bar' ) ) {
    pluginslug_bar();
}
2
Eugene Manuilov