如何让插件中的方法在主题中可用?

时间:2013-10-01 作者:JPollock

假设这是在我的插件中:

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 个回复
最合适的回答,由SO网友:gmazzap 整理而成

另一种方法是在插件中使用静态类方法,并可以选择将函数编写为别名:

插件中:

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!\';
}
当然,静态方法和变量并不总是适合范围,这是一个一般的理论示例:如果不知道实际的范围/代码,就不可能判断它是否对您有利。

SO网友:fuxia

如果您对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\'

SO网友:Eugene Manuilov

您在功能上犯了一个错误。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();
}

结束

相关推荐

Loop not showing first post

我在页面上设置了以下循环,但它缺少了第一篇帖子。有人知道为什么会这样吗?<div class=\"gallery\"> <?php if (have_posts()) : while (have_posts()) : the_post(); ?> <div class=\"gallery-item\"> <a href=\"<?php esc_url( the_permalink() ); ?>\">