Erreur PHP avec le gestionnaire de shortcode d'une classe
-
-
** hors sujet ** - rendre lafonction `statique`.**off topic** - make the function `static`.
- 0
- 2012-09-27
- kaiser
-
3 réponses
- votes
-
- 2012-08-10
Comme l'erreur l'indique,vous avezbesoin d'uneinstance de la classepour utiliser
$this
. Il y a aumoinstroispossibilités:Rendretout statique
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' ) );
Créez d'abord un objet réel
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 ...fonctionne. Mais vous rencontrez des problèmes obscurs si quelqu'un veut remplacer le shortcode.
Ajoutez donc uneméthodepourfournir 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/ellen'aplus qu'à écrire:
$shortcode_handler = apply_filters( 'get_my_plugin_instance', NULL ); if ( is_a( $shortcode_handler, 'My_Plugin ' ) ) { // do something with that instance. }
Ancienne solution: créez l'objet dans votre classe
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' ) );
As the error says you need an instance of the class to use
$this
. There are at least three possibilities:Make everything static
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' ) );
But that’s not real OOP anymore, just namespacing.
Create a real object first
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' ) );
This … works. But you run into some obscure problems if anyone wants to replace the shortcode.
So add a method to provide the class instance:
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' ] );
Now, when someone wants to get the object instance, s/he just has to write:
$shortcode_handler = apply_filters( 'get_my_plugin_instance', NULL ); if ( is_a( $shortcode_handler, 'My_Plugin ' ) ) { // do something with that instance. }
Old solution: create the object in your class
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' ) );
-
mercimec ... c'est uneinformationinestimablepuisque wordpress.orgn'apas ditgrand chose sur leurpage de documentation add_shortcode.J'avaistrouvé la solutionmaispuisque vous avezexclu cela comme unemauvaisepratiqueet que vous avez unemeilleure solution,je marque donc ceproblème comme résolu :)thanx man ... thats priceless info since wordpress.org did not tell this much on their add_shortcode documentation page. I had figured out the solution but since you have ruled that out as a bad practice and you have a better solution so i mark this problem as solved:)
- 0
- 2012-08-10
- xmaestro
-
Je suis vraiment désolé de déterrer cette vieille question,maispourriez-vousexpliquer ce quefait cette ligne: `NULL===self :: $instance and self :: $instance=new self;`?Je suis unpeu confus car `===`et `and` sont utilisés,mais sans`if`,si vous voyez ce queje veux dire.I am really sorry to dig up this old question, but could you plase elaborate what this line does: `NULL === self::$instance and self::$instance = new self;`? I am a bit confused because `===` and `and` are used, but without `if`, if you know what I mean.
- 0
- 2015-01-03
- Sven
-
@Sven Ceciest une vérificationpour éviter une secondeinstance.Celafait de cette classe un Singleton… Jene feraispas ça denosjours.Je vais réécrire cette réponse.@Sven This is a check to prevent a second instance. It makes this class a Singleton … I wouldn’t do that nowadays. I will rewrite this answer.
- 0
- 2015-01-03
- fuxia
-
Mercipour ça!Jepense quemaintenantje suis sur labonne voie,même s'ilest étonnant de voir à quelpoint celapeut être compliqué d'utiliser WordPress & OOP ;-)Thanks for that! I think now I am on the right track, although it is astonishing how complicated it can be using WordPress & OOP ;-)
- 0
- 2015-01-03
- Sven
-
@Sven WordPress coreest écrit àpeuprès aussi anti-POO quepossible.Même unnouveau codeignoretout ce que le reste dumonde PHP a appris au cours des dix dernières années,l'injection de dépendancesparexemple.Alors oui,la POO dans lespluginset lesthèmes WordPressesttoujours hackish.:/@Sven WordPress core is written pretty much as anti-OOP as possible. Even new code ignores all the things the rest of the PHP world has learned during the last ten years, dependency injection for example. So yes, OOP in WordPress plugins and themes is always hackish. :/
- 2
- 2015-01-03
- fuxia
-
L'appareil `add_shortcode`est du côté obscur!Ce codeest assez dope.+1 sur lefait que WordPress doitporter ou déporter le $ # ANTIOOP ;.La dépréciationnécessite desplans demigration demanièremajeure.The `add_shortcode` device is from the dark side! This code is pretty dope. +1 on the fact that WordPress needs to port or deport the $#ANTIOOP;. Deprecation needs migration plans in a major way.
- 0
- 2016-02-17
- Nathan Powell
-
add_filter ('get_my_plugin_instance',[$this,'get_instance']); Commentpasser desparamètres à «get_instance»?Comme 'get_instance [params]'?Merci.add_filter( 'get_my_plugin_instance', [ $this, 'get_instance' ] ); How would I pass params at 'get_instance'? As 'get_instance[params]'? Thanks.
- 0
- 2018-12-10
- b_dubb
-
@b_dubb Vouspassez lesparamètres au constructeur.@b_dubb You pass the parameters to the constructor.
- 0
- 2018-12-10
- fuxia
-
@fuxiaet cela ressemblerait à ....?@fuxia and that would look like .... ?
- 0
- 2018-12-12
- b_dubb
-
@b_dubb Oh,attendez,maintenantje comprends votre question.Vousne passezpas dutout deparamètres à cela.@b_dubb Oh, wait, now I get your question. You don't pass parameters to that at all.
- 0
- 2018-12-12
- fuxia
-
`add_shortcode ('baztag',[new My_Plugin ($params),'foo']);``add_shortcode( 'baztag', [ new My_Plugin($params), 'foo' ] );`
- 0
- 2018-12-28
- b_dubb
-
- 2015-06-25
Vouspouvez utiliser comme ceci,un shortcode dans la classe
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();
Si vous souhaitez accéder au contenu du shortcode d'une autre classe.Vouspouvezfaire comme ça.
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 );
You can use like this, shortcode inside the Class
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();
If you want access shortcode content from another class. You can do like this.
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 );
-
J'aime vraiment cette solution.C'est vraimentpropreet compréhensible.Le côté développeur de React.jsen est satisfait.I really like this solution. It's really clean and understandable. The React.js developer side of me is happy with this.
- 1
- 2017-04-13
- AaronDancer
-
- 2012-08-10
Assurez-vous de créer uneinstance de votre classe avant de l'utiliser,sauf si vous êtes sûr qu'elleest censée être appelée statiquement.Lorsque vous appelez uneméthode demanière statique,vousn'utilisez aucuneinstanceet par conséquent,ellen'a accès à aucune variablemembre ouméthode.
Make sure that you make an instance of your class before using it unless you are sure it's supposed to be called statically. When you call a method statically, you don't use any instances and therefore it doesn't have access to any member variables or methods.
Actuellement,j'utilise lefluxgénérique suivantpour ajouter le shortcode d'unplugin.
Maintenant,lorsque cette classeet saméthode sont appelées,j'obtiens l'erreur suivante.
(La lignenoest l'endroit oùj'aiimprimé le
$this->myvar
)Est-ce unproblème du côté de Wordpress ou y a-t-il quelque chose queje faismal?Cela semble être quelque chose de vraiment simple.