从插件到主题的变量

时间:2011-04-01 作者:Xavi Esteve

第一个插件,基本问题。。。我正在尝试打印变量$xavi 从一个plugin 主题如下:

add_action(\'init\', \'_load_options\');

function _load_options() {
  global $xavi;
}
这样我就可以在theme 文件如下:

<?=$xavi;?>
看起来不像init 是正确的动作钩,但唯一有意义的是wp_head 而且也不管用

我应该使用哪个钩子,或者我应该如何定义变量(可能通过现有的WP函数/方法,而不是从头创建一个)?

谢谢

4 个回复
最合适的回答,由SO网友:Roman 整理而成

您的Web主机已禁用register_globalsphp.ini, 因此,每次您想使用变量时,都必须手动“注册”变量。例如:

<?php
global $xavi;
echo $xavi;
?>
另一种方法是使用$GLOBALS 阵列:

<?php
echo $GLOBALS[\'xavi\'];
?>
但在我看来,你应该避免使用globals。相反,使用一个简单的注册表类,您可以添加/获取您的值。

编辑这不是WordPress特有的解决方案,对于这个简单的问题来说可能有点过头了。注册表模式是一种正式的编程设计模式。我在这里也使用了单例模式。

我们在这里要做的是将内容存储在注册表对象中。它是单例的,因此只创建一个实例。

我知道,这个问题还没有真正解决。我们没有使用$GLOBALS数组,而是使用了一个注册表类,它实际上也是“全局的”,因为我们每次需要时都会调用实例。你没有控制权,你把它叫做什么。此外,单例类的测试可能会有问题。如果您想要更多的控制,只需查看依赖性注入的工厂模式。

class Webeo_Registry {
    /**
     * Array to store items
     * 
     * @var array
     */
    private $_objects = array();

    /**
     * Stores the registry object
     * 
     * @var Webeo_Registry
     */
    private static $_instance = null;

    /**
     * Get the instance
     * 
     * @return void
     */
    public static function getInstance() {
        if (is_null(self::$_instance)) {
            self::$_instance = new self();
        }

        return self::$_instance;
    }

    /**
     * Constructor
     * 
     * @access private
     * @return void
     */
    private function __construct() {}

    /**
     * Set an item by given key and value
     * 
     * @param string $key
     * @param void $value
     * @return void
     */
    public function __set($key, $value) {
        // maybe you want to check if the value already exists
        $this->_objects[$key] = $value;
    }

    /**
     * Get an item by key
     * 
     * @param string $key Identifier for the registry item
     * @return void
     */
    public function __get($key) {
        if(isset($this->_objects[$key])) {
            $result = $this->_objects[$key];
        } else {
            $result = null;
        }

        return $result;
    }

    /**
     * Check if an item with the given key exists
     * 
     * @param string $key
     * @return void
     */
    public function __isset($key) {
        return isset($this->_objects[$key]);
    }

    /**
     * Delete an item with the given key
     * 
     * @param string $key
     * @return void
     */
    public function __unset($key) {
        unset($this->_objects[$key]);
    }

    /**
     * Make clone private, so nobody can clone the instance
     * 
     * @return void
     */
    private function __clone() {}
}
在插件/主题中,您只需返回实例,即可使用它:

$registry = Webeo_Registry::getInstance();

// Define some options (just add it after the "->". The magic method __set will do the rest)
$registry->optionA = \'awdawd\';
$registry->optionB = array(1,2,3);

// Check the content
print_r($registry);

// Remove an item
unset($registry->optionA);

// Check if option exists
if(isset($registry->optionA)) {
    echo \'option exist\';
} else {
    echo \'option does not exist\';
}

SO网友:Ryan Gibbons

另一种选择是使用短代码。这个Wodrpess Codex 讨论所有细节。但基本上是设置一个返回变量的函数。将短代码添加到wordpress,然后调用do_shortcode( \'[shortcode]\' ) 在PHP代码中,您可以对其进行回显或存储以进一步处理。您可以在内容中使用快捷代码。

SO网友:JanWillem

可以在主题中使用函数。如果我是正确的,您可以在模板中添加以下内容:

<?php _load_options() ?> 
应该有用。然而,\\uu可能意味着它是私有的,因此您可能需要将该函数公开。

SO网友:Samsan Phone Number Lookup

插件内部

    function wtnerd_global_vars() 
    {        
        global $wtnerd;

        $wtnerd = "I am nerd";    
    }

    add_action( \'parse_query\', \'wtnerd_global_vars\' );
然后将变量打印到模板/主题中

$GLOBALS[\'wtnerd\'];
我的来源:https://gist.github.com/aahan/7444046

结束

相关推荐

How do you debug plugins?

我对插件创作还很陌生,调试也很困难。我用了很多echo,它又脏又丑。我确信有更好的方法可以做到这一点,也许是一个带有调试器的IDE,我可以在其中运行整个站点,包括插件?