Intereting Posts
Добавление пользовательских данных в существующий user_id Как показать сообщение, если было опубликовано менее двух часов назад? Пользовательская таксономия скрывает мета-окно, но отображается в меню Добавление ширины и высоты в wp_get_attachment_image_src Добавить категорию Ajax не обновляет пользовательский стол таблицы списков Роли при регистрации (класс) Автоматическое добавление заголовка изображения, Alt Text, при загрузке изображений в WordPress get_page_template ничего не возвращает Всякий раз, когда я пытаюсь опубликовать сообщение в wordpress, я всегда перенаправляюсь на страницу установки … почему? Дополнительные поля и загрузка мультимедиа Аутентификация подписчика подписчика Noindex Крючки не удаляются в дочерней теме Можно ли использовать функции WordPress в шаблоне страницы? Если is_single в functions.php Как передать переменную в add_settings_section () обратный вызов?

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

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

class MyPlugin { private $myvar; function baztag_func() { print $this->myvar; } } add_shortcode( 'baztag', array('MyPlugin', 'baztag_func') ); 

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

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

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

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

Поскольку ошибка говорит, что вам нужен экземпляр класса для использования $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' ) ); 

Но это не настоящий ООП, а просто пространство имен.

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

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

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

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

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