Diminuer le nombre de requêtes dans un squelette SPIP,

Comment transformer une série complexe de boucles SPIP imbriquées, en une seul boucle SPIP simple ?

Sur un site, il a fallu afficher une liste un peu compliquée :
- la liste des auteurs-organisations
- ayant un logo,
- ayant au moins un contact-auteur
— ayant écrit au moins un article,
— ayant le statut publié...

Un résultat juste (mais fastidieux...) peut être obtenu avec un enchevêtrement complexe de boucles SPIP, demandant l’exécution d’un grand nombre de requêtes SQL :

Si on parvient à déporter les requêtes SQL correspondant à ce squelette, dans un filtre SPIP utilisable dans une simple boucle, on peut simplifier grandement l’écriture de la boucle, et diminuer significativement le nombre total de requêtes SQL qui seront exécutées :

Pour créer ce filtre (que l’on a appelé "ayant_publie"), on commence par ajouter une fonction dans le fichier de fonctions du plugin (ou dans mes_fonctions.php) qui retourne simplement un tableau (vide...) d’id_auteur :

Puis on va créer une première requête SQL listant tous les auteurs ayant écrit au moins un article publié. En SQL ça donne ceci (on crée d’abord la requête en SQL afin de la tester sur le serveur de BDD) :

Si on "traduit" cette requête en langage SPIP, ça donne :

Ensuite, on crée une seconde requête qui va sélectionner les organisations d’origine des contacts précédemment sélectionnés.

Pour tester la requête en SQL, on récupère une partie du résultat de la requête précédente, que l’on va utiliser comme critère "IN" de notre requête. On récupère le résultat (les contacts auteurs ayant écrit au moins un article publié) sous forme d’une liste séparée par des virgules (liste donnée à titre d’exemple !) :

La requête en format SQL donne ceci :

Et la même requête, au format SPIP, va donner ceci, avec comme différence essentielle que le critère "IN" va être le tableau obtenu par la première requête :

Le code global de fonction "ayant_publie" est le suivant :

Et voila !
Merci Matthieu ;-)