var Phenix = function () {

Troll du Web depuis 1996

Afficher le fichier template utilisé par Wordpress

Souvent, quand on récupère le Wordpress d’un client avec 1 zillions de plugins et un thème « premium theme forest », c’est souvent la merde pour savoir quel fichier édités pour ajouter le bouton de partage Facebook.

Wordpress, dans un soucis d’épurer le code, ne possède pas de méthode « mode inclure » comme SPIP, c’est bien dommage.

Heureusement, on peut en bricoler un dans function.php :

  1. <?php
  2. add_action('wp_head', 'show_template');
  3. function show_template() {
  4. global $template;
  5. print_r($template);
  6. }

Cela va afficher le fichier template utilisé par Wordpress dans l’en-tête de toutes les pages du site.

C’est pas la panacée mais ça aide un peu.

Voir en ligne : Which template page is being used ?

Récupérer l’ID d’un post Wordpress depuis le post_name

Une petite fonction Wordpress pratique quand on travaille avec des pages qui ont un layout spécifique. Le nom est souvent plus parlant et moins limité que l’ID du post/page.

  1. <?php
  2. /**
  3.  * Récupère l'ID d'un post en fonction de son post_name
  4.  *
  5.  * @param string $post_name
  6.  * @access public
  7.  * @global objet $wpdb
  8.  * @return int
  9.  */
  10. function get_page_id_by_name( $post_name ) {
  11. global $wpdb;
  12.  
  13. $key_cache = 'id_post_'.$post_name;
  14. $id = wp_cache_get( $key_cache );
  15.  
  16. if ( ! $id ) {
  17. $id = $wpdb->get_var(
  18. $wpdb->prepare(
  19. 'SELECT ID FROM '.$wpdb->posts.' WHERE post_name = %s',
  20. $post_name
  21. )
  22. );
  23. wp_cache_set( $key_cache, $id );
  24. }
  25.  
  26. return $id;
  27. }

Le DNS expliqué à vos managers

Le DNS est un pilier central de l’internet. Vous l’utilisez tous les jours, parfois sans vous en rendre compte.
Et pourtant, même parmi les informaticiens, c’est un domaine obscur et mal connu.

Donc forcément, quand il s’agit d’expliquer à un néophyte comment fonctionne le DNS, on fini généralement pas passer pour un chaman.

Il n’y aura pas d’explication technique ici, c’est un article à vocation pédagogique. Donc cela veut aussi dire que des raccourcis vont être utilisé et qu’il y aura un grand nombre d’approximations technique. Pas taper !
En partie aussi parce que je suis très loin d’être un expert du sujet.

Pour des informations plus techniques, il y a les exposés de Stéphane Bortzmeyer qui sont bien complet sur le sujet.

Les grands livres

Les DNS c’est un peu comme des grands livres. Il y en a plusieurs : le livre .org, le livre .net, le livre .com, etc.
Ces grands livres contiennent les titres d’autres livres, plus petits : Gandi, OVH, one.com... Qui eux même contiennent les adresses des serveurs web qui contiennent le site en question.
Grosso modo, tout ceux qui vendent des noms de domaine, possèdent un livre.

Lorsque l’ordinateur cherche à savoir ou ce trouve un nom de domaine précis, henix.be par exemple, il commence par regarder dans le grand livre .be quel petit livre il faut consulter.
.be ne sait pas exactement ou se trouve henix.be, mais par contre, il contient la référence du livre qui contient l’endroit ou ce trouve henix.be : all2all.org.

L’ordinateur regarde alors dans le petit livre all2all.org ou ce trouve henix.be.
All2all.org sachant exactement ou ce trouve henix.be va le dire à l’ordinateur, qui a alors trouvé ce qu’il cherchait et peut demander au bon serveur d’afficher le site web.


C’est une métaphore très simple, qui peut être comprise facilement par tout le monde.
Plus d’excuse pour ne pas expliquer aux autres !


Utiliser les forums de #SPIP sur d’autres types d’objets

Parce que dans SPIP, il n’y a pas que des articles !

J’en ai marre de ne jamais me souvenir de cette procédure donc je vais la noter une bonne fois pour toutes :’-) .

Procédure :

Il faut déclarer quelques petites choses pour réussir à implémenter les forums de SPIP sur d’autres objets que les articles :

On commence par définir la fonction qui permet au formulaire de forum de trouver le titre de l’objet. Mettons que vous ayez un plugin qui définit un objet « annexe » sur lequel vous voulez utiliser les forums :

Dans le fichier de fonctions.php du plugin :

  1. /**
  2.  * Récupérer le titre des annexes pour les forums
  3.  *
  4.  * @param int $id_objet
  5.  * @access public
  6.  * @return string le titre de l'annexe
  7.  */
  8. function annexe_forum_extraire_titre($id_objet) {
  9. include_spip('inc/filtres');
  10. return generer_info_entite($id_objet, 'annexe', 'titre');
  11. }

Ensuite, il faut définir le pipeline qui va permettre à la balise #FORMULAIRE_FORUM de trouver automatiquement l’objet du forum :

Dans le fichier pipelines.php :

  1. function prefix_forum_objets_depuis_env($objets) {
  2. $objets['annexe'] = id_table_objet('annexe');
  3. return $objets;
  4. }

On n’oublie pas d’ajouter le pipeline dans le paquet.xml :

  1. <pipeline nom="forum_objets_depuis_env" inclure="prefix_pipelines.php" />

Dans le cas où les forums sont désactivés partout, on peut forcer le passage avec une fonction à déclarer dans le fichier inc/annexe_accepter_forums_publics.php :

  1. function inc_annexe_accepter_forums_publics_dist($arg = null) {
  2. return 'abo'; // chaine de 3 caractere parmi 'non','pos','pri','abo'
  3. }

Normalement à ce stade, la balise #FORMULAIRE_FORUM affiche le formulaire sur votre objet :).

Il ne faut pas oublier d’ajouter le critère {id_annexe ?} dans la boucle principale des forums et dans celle qui compte les messages. Sans quoi, SPIP va afficher tous les messages sans distinction.

Limitation :

Il y a cependant une configuration qui ne fonctionne pas correctement :

Si les forums sont désactivés sur les articles, il est impossible d’utiliser le mécanisme de réponse car #PARAMETRES_FORUM ne renvoie rien.
Le problème vient de cette partie du code, qui est spécifique à la configuration des articles.
Il est toujours possible de faire une surcharge brutale de la balise pour faire sauter cette limitation. Mais, du coup, le formulaire de configuration de l’admin n’a plus aucun sens.

Conclusion :

Les forums de SPIP ne sont pas encore complètement portables sur d’autres objets. Il y a visiblement eu du travail dans ce sens, mais ce n’est pas encore complet.
Cependant, il suffit souvent d’activer les forums d’articles pour que tout se passe pour le mieux.


Contrôler les index des tableaux #SPIP

SPIP possède un mécanisme de tableau dans le compilateur. C’est plutôt rudimentaire et mériterait certainement plus d’attention de la part des développeurs.

Dans beaucoup de cas, ils sont de précieux alliés mais rapidement limités. On les abandonne généralement rapidement au profit d’une fonction php. Soit parce que le code devient illisible, soit parce qu’ils ne sont pas assez souples.

Cependant, il y a quand même moyen de faire des choses assez puissantes sans prise de tête particulière. L’installation de spip_bonux est indispensable, cela permet d’accéder aux balises #SET_PUSH et #SET_MERGE qui rendent le code plus lisible.

Un système de news par secteur ET par mots-clés

J’ai besoin d’afficher tous les articles d’un secteur mélangés avec les articles qui possèdent un mot-clé défini.
L’idée est de créer un module de « news » qui peut être enrichi par des articles qui ne seraient pas dans la rubrique « news ».
L’idée est simple : remplir un tableau a l’aide de deux boucles SPIP et puis l’afficher avec une boucle DATA.

  1. [(#REM) Initialiser le tableau ]
  2. [(#SET{news, #ARRAY})]
  3. <BOUCLE_article(ARTICLES){id_secteur=1}{par date}{inverse}{lang}{0,2}>
  4. [(#SET_PUSH{news, #ID_ARTICLE})]
  5. </BOUCLE_article>
  6.  
  7. [(#REM) Recherche sur le mot-clé "news" ]
  8. <BOUCLE_mot(ARTICLES){id_mot=42}{par date}{inverse}{lang}{0,2}>
  9. [(#SET_PUSH{news, #ID_ARTICLE})]
  10. </BOUCLE_mot>

#GET{news} contient maintenant 4 id_articles : les deux derniers articles du secteur 1 et les deux derniers articles possédant le mot-clé 42.

Mais comme c’est un système de news, il faut tirer l’affichage par date. Or, les données du tableau sont tirées par ordre de boucles : d’abord, les informations de la boucle article, ensuite les informations de la boucle d’article_mot.

En réalité, ce dont j’ai besoin, c’est de la possibilité de trier mon tableau par date une fois qu’il a été généré par les boucles. Il faut donc que je sauvegarde la date de l’article dans mon tableau.

  1. [(#REM) Initialiser le tableau ]
  2. [(#SET{news, #ARRAY})]
  3. <BOUCLE_article(ARTICLES){id_secteur=1}{par date}{inverse}{lang}{0,2}>
  4. [(#SET_PUSH{news, #ARRAY{id_article, #ID_ARTICLE, date, #DATE}})]
  5. </BOUCLE_article>
  6.  
  7. [(#REM) Recherche sur le mot-clé "news" ]
  8. <BOUCLE_mot(ARTICLES){id_mot=42}{par date}{inverse}{lang}{0,2}>
  9. [(#SET_PUSH{news, #ARRAY{id_article, #ID_ARTICLE, date, #DATE}})]
  10. </BOUCLE_mot>

Voilà, donc maintenant, #GET{news} est un tableau qui contient 4 tableaux à deux clés : id_article et date.

Ensuite, via une petite astuce php, on va utiliser une des deux valeurs comme clé pour recomposer un tableau. Rien de complexe, tout est dans PHP :

  1. [(#REM) Simplifier le tableau pour avoir id_article => date ]
  2. [(#SET{news, #GET{news}|array_column{date, id_article}})]

Array_column est une fonction PHP 5.5. Mais spip_bonux l’apporte au version inférieur.

Ensuite, il ne reste plus qu’à faire une boucle data triée par valeur.

Voici le code complet :

  1. [(#REM)
  2. On va calculer les news:
  3. - Soit cela se trouve dans le secteur des news
  4. - Soit il y a le mot-clé news
  5. ]
  6.  
  7. [(#REM) Initialiser le tableau ]
  8. [(#SET{news, #ARRAY})]
  9. <BOUCLE_article(ARTICLES){id_secteur=1}{par date}{inverse}{lang}{0,2}>
  10. [(#SET_PUSH{news, #ARRAY{id_article, #ID_ARTICLE, date, #DATE}})]
  11. </BOUCLE_article>
  12.  
  13. [(#REM) Recherche sur le mot-clé "news" ]
  14. <BOUCLE_mot(ARTICLES){id_mot=42}{par date}{inverse}{lang}{0,2}>
  15. [(#SET_PUSH{news, #ARRAY{id_article, #ID_ARTICLE, date, #DATE}})]
  16. </BOUCLE_mot>
  17.  
  18. [(#REM) Simplifier le tableau pour avoir id_article => date ]
  19. [(#SET{news, #GET{news}|array_column{date, id_article}})]
  20.  
  21. <section class="section-news">
  22. <span class="label article-section"><:titre_news:></span>
  23. [(#REM) Affichage de articles du tableau ]
  24. <B_data_news>
  25. <ul class="news-list">
  26. <BOUCLE_data_news(DATA){source tableau, #GET{news}}{par valeur}{inverse}{0,2}>
  27. <li><INCLURE{fond=inclure/article_resume, id_article=#CLE} /></li>
  28. </BOUCLE_data_news>
  29. </ul>
  30. </B_data_news>
  31. </section>