Actuellement, j'utilise le flux générique suivant pour ajouter le shortcode d'un plugin.
class MyPlugin {
private $myvar;
function baztag_func() {
print $this->myvar;
}
}
add_shortcode( 'baztag', array('MyPlugin', 'baztag_func') );
Maintenant, quand cette classe et sa méthode s'appellent, j'obtiens l'erreur suivante.
Erreur fatale: Utilisation de $ this sans contexte d'objet dans ...
(La ligne n ° est l'endroit où j'ai imprimé le $this->myvar
)
Est-ce un problème à la fin de Wordpress ou y a-t-il quelque chose que je fais de travers? Cela semble être quelque chose de très simple.
Comme le dit l'erreur, vous avez besoin d'une instance de la classe pour utiliser $this
. Il y a au moins trois possibilités:
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' ) );
Mais ce n’est plus réel OOP, juste un espace de noms.
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' ) );
Cela marche. Mais vous rencontrez des problèmes obscurs si quelqu'un veut remplacer le shortcode.
Ajoutez donc une méthode pour fournir l’instance de classe:
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' ] );
Maintenant, quand quelqu'un veut obtenir l'instance d'objet, il lui suffit d'écrire:
$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 );
Assurez-vous de créer une instance de votre classe avant de l'utiliser, sauf si vous êtes sûr qu'elle est censée s'appeler de manière statique. Lorsque vous appelez une méthode de manière statique, vous n'utilisez aucune instance et, par conséquent, elle n'a accès à aucune méthode ni à aucune variable membre.