it-swarm.com.de

PHP Fehler beim Shortcode-Handler einer Klasse

Derzeit verwende ich den folgenden allgemeinen Ablauf zum Hinzufügen des Shortcodes für ein Plugin.

class MyPlugin {

    private $myvar;

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

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

Wenn diese Klasse und ihre Methode aufgerufen werden, wird der folgende Fehler angezeigt.

Schwerwiegender Fehler: Verwenden von $ this, wenn es sich nicht im Objektkontext befindet in ...

(Zeile Nr. Ist, wo ich den $this->myvar gedruckt habe)

Ist das ein Problem bei Wordpress oder gibt es etwas, was ich falsch mache? Es scheint etwas wirklich Einfaches zu sein.

13
xmaestro

Wie der Fehler besagt, benötigen Sie eine Instanz der Klasse, um $this zu verwenden. Es gibt mindestens drei Möglichkeiten:

Mach alles statisch

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

Aber das ist kein wirklicher OOP mehr, nur noch Namensraum.

Erstellen Sie zuerst ein reales Objekt

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

Das funktioniert. Aber Sie stoßen auf einige undurchsichtige Probleme , wenn jemand den Shortcode ersetzen möchte.

So fügen Sie eine Methode hinzu, um die Klasseninstanz bereitzustellen:

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

Wenn jemand die Objektinstanz erhalten möchte, muss er nur schreiben:

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

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

Alte Lösung: Erstellen Sie das Objekt in Ihrer Klasse

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

Sie können so einen Shortcode innerhalb der Klasse verwenden

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

Wenn Sie auf Shortcode-Inhalte einer anderen Klasse zugreifen möchten. Das kannst du machen.

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

Stellen Sie sicher, dass Sie eine Instanz Ihrer Klasse erstellen, bevor Sie sie verwenden, es sei denn, Sie sind sicher, dass sie statisch aufgerufen werden soll. Wenn Sie eine Methode statisch aufrufen, verwenden Sie keine Instanzen und haben daher keinen Zugriff auf Membervariablen oder -methoden.

1
woony