error de PHP con el manejador de shortcode de una clase

12

Actualmente estoy usando el siguiente flujo genérico para agregar el shortcode para un complemento.

class MyPlugin {

    private $myvar;

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

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

Ahora, cuando esta clase y su método se llaman, aparece el siguiente error.

  

Error grave: usando $ esto cuando no está en el contexto del objeto en ...

(la línea no es donde he impreso el $this->myvar )

¿Esto es un problema en el final de Wordpress o hay algo que estoy haciendo mal? Parece ser algo realmente simple.

    
pregunta xmaestro 10.08.2012 - 09:28

3 respuestas

29

Como el error dice que necesita una instancia de la clase para usar $this . Hay al menos tres posibilidades:

Haz que todo estético

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

Pero eso ya no es un OOP real, solo espacios de nombres.

Primero crea un objeto real

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

Esto ... funciona. Pero se encuentra con algunos problemas ocultos si alguien? quiere reemplazar el shortcode.

Entonces agregue un método para proporcionar la instancia de clase:

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

Ahora, cuando alguien quiere obtener la instancia del objeto, solo tiene que escribir:

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

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

Solución anterior: crea el objeto en tu clase

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' ) );
    
respondido por el fuxia 10.08.2012 - 09:45
5

Se puede usar así, código corto dentro de la Clase

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 desea acceder al contenido de shortcode de otra clase. Puedes hacerlo de esta manera.

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 );
    
respondido por el Pavnish Yadav 25.06.2015 - 09:57
1

Asegúrese de crear una instancia de su clase antes de usarla, a menos que esté seguro de que debe llamarse estáticamente. Cuando llama a un método de forma estática, no utiliza ninguna instancia y, por lo tanto, no tiene acceso a ninguna variable o método del miembro.

    
respondido por el woony 10.08.2012 - 09:46

Lea otras preguntas en las etiquetas