Mes plugins maison

Ayant la fâcheuse habitude de ré-écrire les plugin dont je ne trouve pas de version satisfaisante (et étant assez difficile sur la qualité du codage, les possibilité de paramétrage, etc., ça arrive souvent), je me dis qu’ils peuvent également servir à d’autres, donc autant les partager.

Vous trouverez donc ici les différents plugins assez stables pour être publiés.

13 commentaires pour “Mes plugins maison”

  1. Li-An dit :

    Bonjour,
    je me permets de vous contacter suite au commentaire que vous avez fait sur ce billet: http://www.webinventif.fr/query-inside-post-plugin-wordpress-pour-inserer-facilement-une-boucle-dans-un-billet/
    Je voudrai en effet insérer une nouvelle boucle dans mon single.php et j’ai donc tapé ce code

    <!-- Début billets aléatoires -->
    
    have_posts()) : $my_query->the_post(); ?>
    
    <a href="" rel="bookmark" title=""><img src=""></a><?php cat_name;
    ?><a href="" rel="bookmark"></a>
    
    <!-- Fin billets aléatoires -->

    qui me permets d’afficher deux images tirées de billets aléatoires. Sauf que la suite du single.php c’est les commentaires et que je me retrouve avec les commentaires du dernier billet aléatoire et pas du billet principal. C’est un problème que vous avez résolu dans la fonction du plugin cité plus haut mais comme je n’y connais que pouic en programmation, j’espèrais que vous pourriez me donner le bout de code php à insérer dans mon code pour obtenir ce que vous proposez, à savoir

    global $post;
    $tempPost = $post;

    puis

    $post = $tempPost;

    Si vous n’avez pas le temps, ce n’est pas grave, je vais tâcher de me dém… débrouiller :-) J’ai au moins une piste.

  2. Li-An dit :

    Désolé, ça ne passe pas. Bon, bref, c’était l’insertion d’une loop à l’intérieur de la loop du billet principal et comment en sortir pour retrouver le billet principal…

  3. Darathor dit :

    Ouais le code dans les commentaire c’est un peu la galère avec WordPress :ko:

    D’autant qu’il prend pas les shortcodes… faudra que je voie pour lui faire prendre mes balises [code]…

    Bref, j’ai un peu retouché le code pour qu’il s’affiche un peu mieux (en ajoutant les &lt; et &gt; qui vont bien)…

    Sinon, le code de sauvegarde / restauration du contexte se trouve dans mon plugin PostLister, dans inludes/WlistBlock.class.php dans les méthodes saveCurrentdata() et restoreCurrentdata(). En gros il y a essentiellement 3 variables globales à sauvegarder avant et restaurer ensuite ;)

    Rien de bien compliqué, encore faut-il le savoir…

  4. Li-An dit :

    J’ai tenté de rajouter vos fonctions saveCurrentdata() et restoreCurrentdata() dans functions.php et de les appeler dans mon single.php mais ça couine au niveau de l’appel des headers. Si vous pouvez m’expliquer ça en 15 secondes je suis preneur sinon tant pis pour moi.

  5. Darathor dit :

    Là ce sont des méthodes dans une classes (références à l’instance courante via $this), donc effectivement, copiées telles-quelles, ça ne va pas passer ;)
    Une solution c’est de faire une petite classe “ContextSaver” comme suit :

    class ContextSaver
    {
    	/**
    	 * @var Integer
    	 */
    	private $id;
    
    	/**
    	 * @var stdClass
    	 */
    	private $post;
    
    	/**
    	 * @var stdClass
    	 */
    	private $authordata;
    
    	/**
    	 * Save the current data in order to restore them after the query.
    	 * @return void
    	 */
    	private function saveCurrentdata()
    	{
    		global $id, $post, $authordata;
    		$this->id = $id;
    		$id = null;
    		$this->post = $post;
    		$post = null;
    		$this->authordata = $authordata;
    		$authordata = null;
    	}
    
    	/**
    	 * Restore the saved data after the query.
    	 * @return void
    	 */
    	private function restoreCurrentdata()
    	{
    		global $id, $post, $authordata;
    		$id = $this->id;
    		$post = $this->post;
    		$authordata = $this->authordata;
    	}
    }

    Avant la bouche d’instancier le un objet de cette classe et d’appeler saveCurrentdata() dessus puis après la boucle, d’appeler restoreCurrentdata() sur cette même instance :

    $contextSaver = new ContextSaver();
    $contextSaver->saveCurrentdata();
    
    // Code de la boucle...
    
    $contextSaver->restoreCurrentdata();

    J’ai pas testé mais en théorie ça devrait marcher.

    Par contre il faut PHP5 sinon, ça va péter… Mais en principe de nos jours y a plus des masses d’hébergeurs sans PHP5 (il n’est juste pas toujours activé par défaut).

  6. Li-An dit :

    Ça va, j’ai changé d’hébergeur pour avoir du bon php5 :-)
    Alors si j’ai tout bien compris, je copie la première partie dans le fichier functions.php et par contre je ne peux pas insérer ces variables comme ça dans mon fichier single.php.
    Il faut que je fasse

    Je dois avoir l’air très noob, je suis désolé…

  7. Li-An dit :

    Rahhhh ce !?!! de code. Bon je voulais savoir comment appeler ces variables dans le single.php
    Je ne peux pas les rentrer tels quels et si je fais ça ne passe pas

  8. Li-An dit :

    Je vais devenir fou. Même en trifouillant le code pour tromper WP, il réussit à reconnaitre. Bon bref, ma question est toujours la même.
    Je m’excuse platement pour ces commentaires à répétition.

  9. Darathor dit :

    Vous avez quoi comme erreurs ? Parce que là c’est difficile de voir ce qui peut ne pas marcher sans plus de précisions…

    Le seul truc potentiellement que je vois c’est que peut-être les deux fichiers ne sont pas exécutés dans le bon ordre et qu’il faudrait mettre la classe dans le même fichier que la boucle… Mais bon, c’est pas sûr du tout que ce soit ça…

  10. Li-An dit :

    Est-ce que je peux vous envoyer les fichiers par mail que vous voyiez bien ce que j’ai tapé (parce que là, le code c’est galère) (mais il me faudrait votre adresse :-)) ?
    Si je mets simplement
    $contextSaver = new ContextSaver();
    $contextSaver->saveCurrentdata();
    dans le single.php WP l’affiche comme du texte.

    Si j’entoure ces appels avec du “plus petit”"point d’interrogation”php et fermeture “point virgule” “point d’interrogation”"plus grane” (mais c’est purement empirique), j’ai le message suivant:
    Fatal error: Call to private method ContextSaver::saveCurrentdata() from context '' in /home/lian/public_html/blog/wp-content/themes/arthemia/single.php on line 50

  11. Darathor dit :

    Ah ben voilà, avec le message d’erreur c’est tout ce suite plus clair : j’ai fait une boulette dans mes copié/collé et oublié de passer les deux méthodes en accès publique (là, seule une méthode de la classe est autorisée à les appeler).

    Donc il faut remplacer les private function par des public function et ça devrait tout de suite aller mieux ;)

    Et il faut bien les encadrer de <?php et >, car ça doit être exécuté comme du PHP.

  12. Li-An dit :

    Ça marche enfin ! Un grand merci. Je suis étonné que ce code ne soit pas trouvable sur le Web vu le nombre de plugins qui permettent d’insérer des boucles indépendantes dans les billets et l’ergonomie que ça apporte. Ça fait déjà un certain temps que je cherchais quelque chose de ce genre.

  13. Darathor dit :

    Faudrait que je prenne le temps d’en faire un tuto propre… Un jour :p

Laisser un commentaire

Vous pouvez utiliser ces tags XHTML : <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

Ce site fait partie du réseau Edforum.net. À ce titre, il suit les règles globales du réseau, merci d'en prendre connaissance avant de poster votre message.