erreur PHP avec le gestionnaire de shortcode d'une classe

12

J'utilise actuellement 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 en dehors du contexte de l'objet dans ...

(Le numéro de ligne 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.

    
posée xmaestro 10.08.2012 - 09:28

3 réponses

29

Comme le message d'erreur indique qu'il est nécessaire qu'une instance de la classe utilise $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 une réalité, mais un simple espacement des 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… fonctionne. Mais vous rencontrez des obscurs problèmes 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éez 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' ) );
    
réponse donnée fuxia 10.08.2012 - 09:45
5

Vous pouvez utiliser comme ceci un shortcode dans 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 souhaitez accéder au contenu en code court 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 );
    
réponse donnée Pavnish Yadav 25.06.2015 - 09:57
1

Assurez-vous de créer une instance de votre classe avant de l’utiliser, sauf si vous êtes certain de l’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 à aucun membre.

    
réponse donnée woony 10.08.2012 - 09:46

Lire d'autres questions sur les étiquettes