12
votes

Espace de noms PHP 5.3 et widget WordPress

J'utilise des espaces de noms.

J'essaie de créer un widget WordPress (http://codex.wordpress.org/widgets_api)<

p>withs espaces de noms Ce qui suit donne une erreur car les arguments ne peuvent pas être passé (et sans espaces de noms cela fonctionne évidemment comme d'habitude) xxx

uhm ... Quelle est la syntaxe correcte pour "parent :: wp_widget" en utilisant des espaces de noms?

(le message d'erreur complet est: xxx

)

Et le débogueur ne montre que rien n'a été passé: xxx

(seul le nom de $ est requis)


3 commentaires

Publier le message d'erreur exact ici. De regarder le code, il ne semble pas que quelque chose ne va pas. Aussi, pourquoi utilisez-vous le parent et pas seulement $ ceci-> wp_widget? Et enfin, WP_Widget est-ce un constructeur de la classe wp_widget? Pourquoi la fonction a-t-elle le même nom que la classe? Si c'est un constructeur, alors mieux utiliser __Construction ()


Non: il y a, l'usine de widget fait partie de WordPress depuis 2.8: Si vous cliquez sur Eclipse sur WP_Widget, vous obtenez la définition de ... core.svn.wordpress.org/trunk/wp-includes/widgets Il doit être écrasé et non par _Construction, voir code source (je ne peux pas l'aider à pas l'écrire)


@dmitri: Les deux parents :: wp_widget et $ this-> wp_widget livrent la même erreur, les deux variantes sont utilisées autour du Web. Wp_widget est la fonction qui devrait être écrasée en fonction du Codex.


6 Réponses :


3
votes

Vous voulez appeler une méthode parent? Utilisez simplement parent :: MethodName ();

Si vous souhaitez appeler le constructeur parent, utilisez parent :: __ construction () - si votre constructeur est nommé comme la classe, renommez-le à __ construire qui est le Nom préféré pour un constructeur pendant des années ...


1 commentaires

Merci, je dois manquer quelque chose que je suis déjà utilisé parent :: wp_widget () déjà mais je suis probablement sur quelque chose?



3
votes

Il me semble que votre problème n'est pas dans les espaces de noms, le code suivant fonctionne comme un charme: xxx

Si vous obtenez un message d'erreur, il peut être utile d'indiquer ce qu'il dit .


4 commentaires

@ Berry-Langerak: Bon à savoir que ce n'est pas ma syntaxe. Alors qu'est-ce que c'est? La classe des parents est par défaut: core.svn.wordpress.org/trunk/wp-includes/widgets


Il semble que WordPress a une méthode de proxy pour les anciens constructeurs de types PHP 4 (YUGH). Vous voudrez peut-être envisager d'utiliser le parent :: __ construire () à la place. En outre, lorsque vous appelez __Construction (), assurez-vous de l'appeler avec au moins deux paramètres.


Pourquoi marqueriez-vous une réponse aussi correcte lorsque cela n'est même pas une réponse directe à votre question, si les commentaires conduisent à la résolution de l'erreur, veuillez mettre à jour votre message.


@ROBERTPITTT Le code dans la réponse est le code correct: J'avais besoin de la fonction _Construction, puis de la société parent :: _ Construisez comme dans la réponse par opposition au code de la documentation ici: codex.wardpress.org/widgets_api



22
votes

regarder la documentation Situé ici semble que seul le nom du nom est requis mais la façon dont PHP fonctionne que vous devez également définir les pré-variables.

Vous avez deux façons de créer la classe:

  • a:
    • wp_widget __construction ([string $ id_base = false], string $ nom, [array $ widget_options = tableau ()], [array $ contrôler_options = tableau ()])
    • b:
      • wp_widget wp_widget ($ id_base = false], $ nom de famille, [$ widget_options = array ()], [$ contrôlée = tableau ()])

        Par préférence Vous devez toujours utiliser la méthode __ construire pour initialiser votre objet, je vous réécrireais le code comme: xxx

        Le wp_widget :: wp_widget (..) La méthode est uniquement pour PHP4 uniquement et ne doit pas être utilisée dans PHP 5 ou plus.

        Il semble que votre utilisation de PHP 5.3 Votre utilisation d'espaces de nom afin de pouvoir procéder comme suit: xxx


5 commentaires

La fonction __Construction a fait le tour, la réponse n'était qu'une minute plus tard que Berry, donc j'ai marqué Berry comme réponse.


L'ajout Regiser_Widget ne fonctionne pas avec le \ A \ B \ C \, car il se trouve dans la portée de l'espace de noms. Si je supprimais la partie d'espace de noms, il donne "AVERTISSEMENT: type de décalage illégal en C: \ xampp \ htdocs \ wp2 \ wp-inclus \ widgets.php à la ligne 324" alors ... j'utilise le code dans la question pour l'instant et Vérifiez plus tard sur la façon de faire cela. Merci.


Il suffit d'encapsuler le A \ b \ c \ Quelque dans une chaîne et supprimez le nouveau mot-clé, il peut s'agir de la manière dont WordPress utilise la valeur.


oui cela fonctionne: add_action ('widgets_init', fonction () {retour register_widget ('a \ b \ c \ thest');}); Merci


Il y a un problème de passage faux pour $ id_base (à partir de WordPress 3.3.1). Dans WP-Admin / Inclus / Widgets.php, $ ID_Base est utilisé dans le cadre d'une expression régulière (ligne 118) et les backslashes de l'espace de noms entraîneront des problèmes. Je suggère de changer vos exemples pour toujours donner un $ ID_BASE Explicitl et notez qu'il ne doit pas contenir de méta-caractères d'expression régulière. En particulier, il ne doit pas contenir de points, ce qui peut ne pas causer de problèmes en tant que méta-caractères, entraînera des problèmes lors de la convertie en soulignement dans le traitement de format.



-1
votes

Je n'utilise pas WordPress, mais en regardant cela, cela ressemble à celui d'une très mauvaise conception de WordPress. Ils semblent utiliser une fonction statique wp_widget qui sert de fabrique mais partage le même nom que le nom de la classe. Ils auraient dû l'appeler l'usine si c'est vraiment une usine.

Aussi, de ce que vous avez posté dans votre commentaire, vous devez peut-être créer une fonction statique wp_widget () dans votre sous-classe, puis ne pas appeler le parent. Si le script veut vraiment que vous remplacez le wp_widget, c'est ce que vous devriez faire.

Mais encore une fois, je n'ai jamais utilisé WordPress, il est difficile de dire sans regarder le script.

Vous devez publier le code d'erreur exact ici.


1 commentaires

J'ai posté le code d'erreur exact complet, je peux ajouter la trace de la pile?



2
votes

Ceci a fonctionné bien pour moi: xxx


1 commentaires

register_widget Accepte Nom de la classe et instance. Si vous devez utiliser un nom de classe, utilisez \ a \ b \ c \ Quelque chose :: Classe à la place.



0
votes

Vous pouvez également utiliser la méthode Native GET_CLASS GET_CLASS , qui retournera le nom de l'instanciation de classe comme une chaîne.

https://www.php.net/manual/fr /function.get-class.php

register_widget (get_class (nouveau \ uci \ wordpress \ widget \ pied de page ()));


0 commentaires