PHP error with shortcode handler from a class

As the error says you need an instance of the class to use $this. There are at least three possibilities:

Make everything static

class My_Plugin
{
    private static $var="foo";

    static function foo()
    {
        return self::$var; // never echo or print in a shortcode!
    }
}
add_shortcode( 'baztag', array( 'My_Plugin', 'foo' ) );

But that’s not real OOP anymore, just namespacing.

Create a real object first

class My_Plugin
{
    private $var="foo";

    public function foo()
    {
        return $this->var; // never echo or print in a shortcode!
    }
}

$My_Plugin = new My_Plugin;

add_shortcode( 'baztag', array( $My_Plugin, 'foo' ) );

This … works. But you run into some obscure problems if anyone wants to replace the shortcode.

So add a method to provide the class instance:

final class My_Plugin
{
    private $var="foo";

    public function __construct()
    {
        add_filter( 'get_my_plugin_instance', [ $this, 'get_instance' ] );
    }

    public function get_instance()
    {
        return $this; // return the object
    }

    public function foo()
    {
        return $this->var; // never echo or print in a shortcode!
    }
}

add_shortcode( 'baztag', [ new My_Plugin, 'foo' ] );

Now, when someone wants to get the object instance, s/he just has to write:

$shortcode_handler = apply_filters( 'get_my_plugin_instance', NULL );

if ( is_a( $shortcode_handler, 'My_Plugin ' ) )
{
    // do something with that instance.
}

Old solution: create the object in your class

class My_Plugin
{
    private $var="foo";

    protected static $instance = NULL;

    public static function get_instance()
    {
        // create an object
        NULL === self::$instance and self::$instance = new self;

        return self::$instance; // return the object
    }

    public function foo()
    {
        return $this->var; // never echo or print in a shortcode!
    }
}

add_shortcode( 'baztag', array( My_Plugin::get_instance(), 'foo' ) );

Leave a Comment