Take the 2-minute tour ×
WordPress Development Stack Exchange is a question and answer site for WordPress developers and administrators. It's 100% free, no registration required.

First plugin, basic question... I am trying to print the variable $xavi from a plugin into a theme like this:

add_action('init', '_load_options');

function _load_options() {
  global $xavi;
}

So that I can use it in a theme file like this:

<?=$xavi;?>

It doesn't look like init is the right action hook for this but the only other one that makes sense is wp_head and doesn't work either

Any ideas which hook should I use or how should I define variables (maybe through an existing WP function/method instead of creating one from scratch)?

Thanks!

share|improve this question
add comment

3 Answers

up vote 4 down vote accepted

Your webhost has disabled register_globals in the php.ini, so you have to "register" your variables manually everytime you want to use it. For example:

<?php
global $xavi;
echo $xavi;
?>

Another approach is using the $GLOBALS array:

<?php
echo $GLOBALS['xavi'];
?>

But in my opinion, you should avoid using globals. Instead use a simple registry-class, which you can add/get your values.

EDIT

This isn't a WordPress specific solution and could be a bit of an overkill for this simple question. The registry pattern is an official programming design-pattern. Same goes for the singleton-pattern which I've used here too.

What we do here is to store our content in a registry-object. It's singleton, so only one instance is created.

I know, the problem isn't solved really. Instead of using the $GLOBALS array, we are using a registry class which is indeed also "global" as we call the instance everytime we need it. You don't have control, where you call it. Also the testing of a singleton class could be problematic. If you want more control, just look at the factory-pattern with dependancy injection.

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

In your plugin/theme, you only have to return the instance and you're ready to use it:

$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';
}
share|improve this answer
    
Interesting... can you show an example of using a class to register variables like that? –  goldenapples Apr 1 '11 at 15:29
    
yes please, I've been searching for examples but can't find anything and I'd rather go this way than using globals –  XaviEsteve Apr 1 '11 at 15:35
    
I've added an example of my registry class, which I'm using in my plugins. Hope this helps. –  rofflox Apr 1 '11 at 16:19
    
Lovely! thanks a lot Roman –  XaviEsteve Apr 1 '11 at 16:25
add comment

Another option would be to use a shortcode. The Wodrpess Codex talks through all the specifics. But basically setup a function that returns your variable. Add the shortcode to wordpress, then call do_shortcode( '[shortcode]' ) inside your PHP code and you can echo it or store it to process it more. You can use use the shortcode inside content.

share|improve this answer
add comment

You can use functions in themes. If I'm correct you can add the following in your template:

<?php _load_options() ?> 

Should work. However the _ probably means that it's private, so you might need to make the function public.

share|improve this answer
    
Thanks Jan, although I'd prefer to modify the theme as few as possible (just when echoing the variable) –  XaviEsteve Apr 1 '11 at 15:40
add comment

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.