Je me réponds à moi-même :
On peut réaliser une alternative à la boucle page en utilisant le plugin FILTRECALCUL, des variables et une boucle REPETER.
C'est simple et clair, et on n'est pas limité par les paramètres de la boucle produit.
Voici le code pour un affichage de 12 produits par page :
#SET{compteur,0}
#SET{min,#FILTRE_calcul(#ENV{page,1},*,12)}
#SET{min,#FILTRE_calcul(#GET{min},-,12)}
#SET{max,#FILTRE_calcul(#GET{min},+,13)}
<THELIA_PROD type="PRODUIT">
<TEST_selection variable="xxx" test="egal" valeur="yyy">
#SET{compteur,#FILTRE_calcul(#GET{compteur},+,1)}
<TEST_min variable="#GET{compteur}" test="superieur" valeur="#GET{min}">
<TEST_max variable="#GET{compteur}" test="inferieur" valeur="#GET{max}">
<div class="produit grid_3">
</div><!-- .produit -->
</TEST_max>
<//TEST_max>
</TEST_min>
<//TEST_min>
</TEST_selection>
<//TEST_selection>
</THELIA_PROD>
<TEST_page variable="#GET{compteur}" test="superieur" valeur="12">
#SET{dern,#FILTRE_calcul(#GET{compteur},+,6)}
#SET{dern,#FILTRE_calcul(#GET{dern},/,12,0)}
#SET{prec,#FILTRE_calcul(#ENV{page,1},-,1)}
#SET{suiv,#FILTRE_calcul(#ENV{page,1},+,1)}
<div id="pager" class="grid_12">
<ul>
<TEST_prec variable="#ENV{page,1}" test="superieur" valeur="1">
<li class="pagePrec"><a href="#URLFOND(zzz,selection=#ENV{selection}&page=#GET{prec})">::pageprecedente::</a></li>
</TEST_prec>
<//TEST_prec>
<REPETER_numero debut="1" fin="#GET{dern}">
<TEST_actuelle variable="#INDEX" test="egal" valeur="#ENV{page,1}">
<li class="page current"><a href="" onclick="return false;">#INDEX</a></li>
</TEST_actuelle>
<li class="page"><a href="#URLFOND(zzz,selection=#ENV{selection}&page=#INDEX)">#INDEX</a></li>
<//TEST_actuelle>
</REPETER_numero>
<TEST_suiv variable="#ENV{page,1}" test="inferieur" valeur="#GET{dern}">
<li class="pageSuiv"><a href="#URLFOND(zzz,selection=#ENV{selection}&page=#GET{suiv})">::pagesuivante::</a></li>
</TEST_suiv>
<//TEST_suiv>
</ul>
</div><!-- #pager -->
</TEST_page>
<//TEST_page>
Y a surement un truc.