現在私はプラグインのショートコードを追加するために次の一般的なフローを使用しています。
class MyPlugin {
private $myvar;
function baztag_func() {
print $this->myvar;
}
}
add_shortcode( 'baztag', array('MyPlugin', 'baztag_func') );
このクラスとそのメソッドが呼び出されると、次のエラーが発生します。
致命的なエラー:オブジェクトコンテキストにないときに$ thisを使用してください。
(行番号は私が$this->myvar
を印刷したところです)
これはWordpress側の問題なのでしょうか、それとも私が悪いことをしているのでしょうか。それは本当に簡単なことのようです。
エラーが言うようにあなたは$this
を使うためにはクラスのインスタンスが必要です。少なくとも3つの可能性があります。
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' ) );
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 );
静的に呼び出されることが確実でない限り、使用する前にクラスのインスタンスを必ず作成してください。メソッドを静的に呼び出すときは、インスタンスを使用しないため、メンバー変数やメソッドにアクセスできません。