web-dev-qa-db-fra.com

PHP erreur avec le gestionnaire de shortcode d'une classe

Actuellement, j'utilise le flux générique suivant pour ajouter le shortcode d'un plugin.

class MyPlugin {

    private $myvar;

    function baztag_func() {
        print $this->myvar;            
    }
}

add_shortcode( 'baztag', array('MyPlugin', 'baztag_func') );

Maintenant, quand cette classe et sa méthode s'appellent, j'obtiens l'erreur suivante.

Erreur fatale: Utilisation de $ this sans contexte d'objet dans ...

(La ligne n ° est l'endroit où j'ai imprimé le $this->myvar)

Est-ce un problème à la fin de Wordpress ou y a-t-il quelque chose que je fais de travers? Cela semble être quelque chose de très simple.

13
xmaestro

Comme le dit l'erreur, vous avez besoin d'une instance de la classe pour utiliser $this. Il y a au moins trois possibilités:

Rendre tout statique

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

Mais ce n’est plus réel OOP, juste un espace de noms.

Créez d'abord un objet réel

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

Cela marche. Mais vous rencontrez des problèmes obscurs si quelqu'un veut remplacer le shortcode.

Ajoutez donc une méthode pour fournir l’instance de classe:

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' ] );

Maintenant, quand quelqu'un veut obtenir l'instance d'objet, il lui suffit d'écrire:

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

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

Ancienne solution: créer l'objet dans votre classe

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' ) );
30
fuxia

Vous pouvez utiliser comme ceci, shortcode à l'intérieur de la classe

class stockData{


    function __construct() {
        add_shortcode( 'your_shortcode_name', array( $this, 'showData' ) );
        //add_action('login_enqueue_scripts', array( $this,'my_admin_head'));
    }

    function showData(){
        return '<h1>My shortcode content</h1>' ;
    }
}

$object=new stockData();

Si vous voulez accéder au contenu en shortcode d'une autre classe. Vous pouvez faire comme ça.

class my_PluginClass {

  public function __construct( $Object ) {

    $test = add_shortcode( 'your_shortcode_name', array( $Object, 'your_method_name' ) );

  }

}

class CustomHandlerClass{

  public function your_method_name( $atts, $content ) {
     return '<h1>My shortcode content</h1>' ;
  }
}

$Customobject  = new CustomHandlerClass();
$Plugin         = new my_PluginClass( $Customobject );
7
Pavnish Yadav

Assurez-vous de créer une instance de votre classe avant de l'utiliser, sauf si vous êtes sûr qu'elle est censée s'appeler de manière statique. Lorsque vous appelez une méthode de manière statique, vous n'utilisez aucune instance et, par conséquent, elle n'a accès à aucune méthode ni à aucune variable membre.

1
woony