it-roy-ru.com

PHP ошибка с обработчиком шорткода из класса

В настоящее время я использую следующий общий поток для добавления шорткода для плагина.

class MyPlugin {

    private $myvar;

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

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

Теперь, когда этот класс и его метод вызваны, я получаю следующую ошибку.

Неустранимая ошибка: использование $ this, когда не в контексте объекта в ...

(Строка №, где я напечатал $this->myvar)

Это проблема на конце WordPress или я что-то не так делаю? Кажется, что-то действительно простое.

13
xmaestro

Как говорит ошибка, вам нужен экземпляр класса, чтобы использовать $this. Есть как минимум три возможности:

Сделай все статичным

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

Но это уже не так OOP, просто пространство имен.

Сначала создайте реальный объект

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

Это работает. Но вы столкнетесь с некоторыми непонятными проблемами если кто-то захочет заменить шорткод.

Поэтому добавьте метод для предоставления экземпляра класса:

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

Теперь, когда кто-то хочет получить экземпляр объекта, ему нужно написать:

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

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

Старое решение: создать объект в своем классе

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

Вы можете использовать как это, короткий код внутри класса

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

Если вы хотите получить доступ к шорткоду из другого класса. Вы можете сделать это так.

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

Убедитесь, что вы создали экземпляр своего класса перед его использованием, если вы не уверены, что он должен вызываться статически. Когда вы вызываете метод статически, вы не используете никаких экземпляров, и поэтому он не имеет доступа ни к каким переменным или методам-членам.

1
woony