Article Précédent / Article Suivant

Le but est d’afficher des liens vers l’article précédent, puis vers l’article suivant en bas ou en haut de page d’un article.

Articles triés par date

Dans ce cas il suffit de se reporter à la documentation officielle qui donne l’astuce dans la page parlant des dates de publication.
À vous, bien sûr, d’améliorer l’affichage selon votre site !

<BOUCLE_principale(ARTICLES){id_article}>
<!--ici l'affichage concernant l'article en cours (#TEXTE, #NOTES et autres) -->

<!-- le lien vers l'article précédent, par ordre chronologique} -->
<BOUCLE_precedent(ARTICLES){age_relatif>=0}{par date}{inverse}{1,1}>
Article précédent : <a href='#URL_ARTICLE'>#TITRE</a> #DATE
</BOUCLE_precedent>

<!-- le lien vers l'article suivant, par ordre chronologique-->
<BOUCLE_suivant(ARTICLES){age_relatif<0}{par date}{0,1}>
Article suivant : <a href='#URL_ARTICLE'>#TITRE</a> #DATE
</BOUCLE_suivant>

<!-- fin de votre boucle article-->
</BOUCLE_principale>

Et si je veux un autre critère de tri ?

Si vous voulez classer vos articles par ordre alphabétique, le code précédent n’est pas si dur à adapter avec spip 1.8, une fois que vous vous souvenez du critère #_nom_de_boucle:BALISE et que vous relisez son utilisation (il faut faire attention, dans un classement alphabétique aux articles qui auraient le même Titre).

<BOUCLE_principale(ARTICLES){id_article}>
<!-- ici l'affichage concernant l'article en cours (#TEXTE, #NOTES et autres) -->

<!-- le lien vers l'article précédent, par ordre alphabétique-->
<BOUCLE_art_prec(ARTICLES){id_rubrique}{titre<=#_principale:TITRE}{par titre}{0,1}{inverse}>
<div>Article précédent : <a href='#URL_ARTICLE'>#TITRE</a></div>
</BOUCLE_art_prec>

<!-- le lien vers l'article suivant, par ordre alphabétique-->
<BOUCLE_art_suiv(ARTICLES){id_rubrique}{titre>#_principale:TITRE}{exclus}{par titre}{0,1}>
<div align='right'>Article suivant : <a href='#URL_ARTICLE'>#TITRE</a></div>
</BOUCLE_art_suiv>

<!-- fin de votre boucle article--> 
</BOUCLE_principale>

variantes bienvenues !

Voir aussi le plugin Critères precedent et suivant.

Discussion

11 discussions

  • Obtenir l’article suivant et précédent via le critère age_relatif fonctionne très bien si les articles ne sont pas à la même heure. Sinon, le fonctionnement est aléatoire...

    Une suggestion pour résoudre ce souci :

    #SET{DATE_COURANTE,#DATE}
     
    <BOUCLE_precedent(ARTICLES){id_rubrique}{!par date}{date<#GET{DATE_COURANTE}}{0,1}>
    <a href='[(#URL_ARTICLE)]'>
    <nobr>&lt;&nbsp;article pr&eacute;c&eacute;dent</nobr>
    </a>
    </BOUCLE_precedent>
    </td>
    <td align=right>
     
    <BOUCLE_suivant(ARTICLES){id_rubrique}{par date}{date>#GET{DATE_COURANTE}}{0,1}>
    <a href='[(#URL_ARTICLE)]'>
    <nobr>article suivant&nbsp;&gt;</nobr>
    </a>
    </BOUCLE_suivant>

    Répondre à ce message

  • 4
    FabriceN

    Bonjour,

    j’ai bien galéré avant de trouver cette solution (pourtant simple), donc je vous la livre.
    Le but était ici de naviguer vers l’article suivant/précédent dans un tri par num titre.
    Tout d’abord, j’ai créé un squelette pour pouvoir ensuite l’inclure au besoin : inc-previous_next.html

    <div align='center'>
    <BOUCLE_previous(ARTICLES){id_rubrique}{!par num titre}{titre < #TITRE*}{0,1}>
    <a href='#URL_ARTICLE'>
    	<img class="no_image_filtrer" src="/plugins/auto/couteau_suisse/img/decoupe/precedent.gif" align="middle">
    	<multi>
    		[fr]Précédent
    		[en]Previous
    	</multi>
    </a>   
    </BOUCLE_previous>
     
    <BOUCLE_next(ARTICLES){id_rubrique}{par num titre}{titre > #TITRE*}{0,1}>
       
    <a href='#URL_ARTICLE'>
    	<multi>
    		[fr]Suivant
    		[en]Next
    	</multi>
    	<img class="no_image_filtrer" src="/plugins/auto/couteau_suisse/img/decoupe/suivant.gif" align="middle">
    </a>
    </BOUCLE_next>
    </div>

    Puis je l’ai inclus dans mon article :

    [(#INCLURE{fond=inc-previous_next}{titre=[(#TITRE*)]}{id_rubrique})]

    Et voilà. Ya plus qu’à.

    • Merci Fabrice !

      C’est exactement ce que je cherchais.
      Plus besoin de me casser la tête...

    • Variante, en forme de liste. Propose également lien sur tête de rubrique et de secteur :

      <div id="spip-mininav">
      <h2><:navigation_rapide:></h2>
      <ul>
      <BOUCLE_precedent(ARTICLES){id_rubrique}{!par num titre}{titre < #TITRE*}{0,1}>
      	[<li><:article_precedent_:><a href="#URL_ARTICLE" title="[(#SURTITRE): ][(#TITRE|supprimer_numero|trim)]">[(#SURTITRE): ](#TITRE|supprimer_numero)</a></li>]
      </BOUCLE_precedent>
      <BOUCLE_suivant(ARTICLES){id_rubrique}{par num titre}{titre > #TITRE*}{0,1}>
      	[<li><:article_suivant_:><a href="#URL_ARTICLE" title="[(#SURTITRE): ][(#TITRE|supprimer_numero|trim)]">[(#SURTITRE): ](#TITRE|supprimer_numero)</a></li>]
      </BOUCLE_suivant>
      <BOUCLE_page1(RUBRIQUES){id_rubrique}{0,1}>
      	<li><:accueil_rubrique_:><a href="#URL_RUBRIQUE">[(#TITRE|supprimer_numero)]</a></li>
      </BOUCLE_page1>
      <BOUCLE_secteur(RUBRIQUES){id_secteur}{0,1}>
      	<li><:accueil_secteur_:><a href="#URL_RUBRIQUE">[(#TITRE|supprimer_numero)]</a></li></BOUCLE_secteur>
      </ul>
      </div>

      Là aussi bien sûr, ne pas oublier de numéroter les titres d’article.

    • J’oubliais l’include de rappel à placer dans le squelette article.html :

      [(#INCLURE{fond=inc-mininav}{titre=[(#TITRE*)]}{id_secteur}{id_rubrique})]
    • @FabriceN : merci ça marche super bien ! Et j’ai appris en même temps qu’on pouvait mettre une balise <multi> dans les pages HTML... Yé !

    Répondre à ce message

  • 2

    Bonjour,

    Merci FabriceN pour ta solution, je l’utilise et elle fonctionne seulement. J’ai réalisé une variante car dans certains cas particulier la solution original n’arrivait pas à trouver l’article précédent. J’ai rajouter une fonction qui permet d’extraire le numéro du titre pour comparer uniquement les numéros et avoir un résultat cohérent.

    Voici la solution :

    créer un fichier mes_fonctions.php dans votre répertoire squelletes :

    <?php
     
        function extraire_numero ($titre) {
                if (ereg("([0-9]+)\.", $titre, $match)) {
                        return $match[1];
                }
                else return $titre;
        }
     
    ?>

    créer un fichier squellete : navigation.html dans le répertoire squellete

        <BOUCLE_next(ARTICLES){id_rubrique}{par num titre}{titre > (#TITRE*|extraire_numero)}{0,1}>
       		<div align="left"><b>Article suivant : <a href='#URL_ARTICLE'>[(#TITRE|supprimer_numero)]</a></b></div>
        </BOUCLE_next>
        <BOUCLE_previous(ARTICLES){id_rubrique}{!par num titre}{titre < (#TITRE*|extraire_numero)}{0,1}>
       		<div align="left"> <b>Article précédent :<a href='#URL_ARTICLE'>[(#TITRE|supprimer_numero)]</a></b></div>
        </BOUCLE_previous>

    rajouter ensuite la balise inclure suivante dans votre squellette article et la pagination fonctionne :

    [(#INCLURE{fond=navigation}{titre=[(#TITRE*)]}{id_rubrique})]

    Bon SPIP à tous

    • CharliesAngel

      Un grand merci pour ta contribution elle marche très bien c’est exactement ce que je cherchais !!

    • désoler je n’arrive pas a faire fonctionner ton code ...
      j’ai créer le fichier mes_fonctions.php dans squelettes
      puisnavigation.html dans squelettes aussi
      puis inlus ton code dans articles.html ..
      j’ai louper quoi ?
      Merci

    Répondre à ce message

  • 1
    robomatix

    J’ai remarqué un problème avec les boucles avec un classement par titre. La boucle suivant boucler (héhé !) sur deux articles commençant par J’... Je me suis penché sur ce problème et j’ai pondu ça :

    [(#REM) On cherche l'emplacement de l'article dans les boucles ]
    <BOUCLE_art_prec_suiv(ARTICLES){id_rubrique}{par titre}>
    [(#ID_ARTICLE|=={#_article_principal:ID_ARTICLE}|?{[(#SET{place_article,#COMPTEUR_BOUCLE})]})]
    </BOUCLE_art_prec_suiv>
    #SET{place_article_precedent,#GET{place_article}|moins{2}}
    
    <div class="precedent_suivant">
    
    <!-- le lien vers l'article précédent, par ordre alphabétique-->
    <BOUCLE_art_prec(ARTICLES){id_rubrique}{par titre}{#GET{place_article_precedent},1}>
    <a href='#URL_ARTICLE' class="precedent">< Spectacle précédent</a>
    </BOUCLE_art_prec>
    
    <!-- le lien vers l'article suivant, par ordre alphabétique-->
    <BOUCLE_art_suiv(ARTICLES){id_rubrique}{par titre}{#GET{place_article},1}>
    <a href='#URL_ARTICLE' class="suivant">Spectacle suivant ></a>
    </BOUCLE_art_suiv>
    </div>

    En espérant que ça en aide d’autres !

    Répondre à ce message

  • 5

    Il y a un oubli :
    il manque exclus dans la boucle « article précédent » :


    <BOUCLE_art_prec(ARTICLES)id_rubriquetitre<=#_principale:TITREexcluspar titre0,1inverse>

    Article précédent : #TITRE
    • ou plutôt, enlever le “=” de l’expression “<=” dans la boucle “BOUCLE_art_prec”

      Aussi, attention les espaces des titres ne sont pas supportés dans l’expression “#_principale:TITRE”

      => Préfixez donc vos titres d’article par "01. le premier article", "02. le deuxième article", .... et utilisez ensuite “(#TITRE

    • Je me permet de rendre attentif les personnes qui trie leur article avec l’explication ci-dessu poster par Sly, ne foncitonne pas si dans : mes_options.php il est inscrit le code :

      $table_des_traitements[’TITRE’][]=’supprimer_numero(typo(%s))’ ;

      Il faut donc effacer ce code et alors ou peut utiliser les balises (#TITRE

      Avec Spip 1.9.2d
      Julien

    • Bonjour Julien,

      Si vous aviez le temps de regarder mon problème ce serait très sympath.

      Patrick ROUDEIX, Provence Infos.
      Manosque dans le 04 - 04 9272 8000 - 06 8151 0663 - provenceinfos@wanadoo.fr

      Bon week end quand même.

      -  Site : www.andrebeaurepaire.com
      -  SPIP 1.9.2d [11132]
      -  Plugins : Lecteur Multimédia en Flash (MP3,flv)
      -  Page avec articles préc et suivants : Rubrique TRAVAIL, sous rubrique Peinture
      -  http://www.andrebeaurepaire.com/spip.php?article2
      -  Titre des articles : 01. xxxxxxx/ 02. yyyyyyyyyyy et suivants
      -  Code source :
      BOUCLE_navig(ARTICLES) id_rubrique=6 id_article
       !— le lien vers l’article précédent, par ordre alphabétique—
      BOUCLE_art_prec(ARTICLES)id_rubriquetitre<=#_principale:TITREexcluspar titre0,1inverse
      div align="left"
      a href=’#URL_ARTICLE’>Tableau précédent /a
      /div
      /BOUCLE_art_prec
      /td
      td width="50%"
      !-- le lien vers l'article suivant, par ordre alphabétique--
      BOUCLE_art_suiv(ARTICLES){id_rubrique}{titre>#_principale:TITRE
      excluspar titre0,1
      div align=« right »
      a href=’#URL_ARTICLE’ img src=« ../IMG/droite.gif » alt=« Tableau suivant » border=« 0 »
      /a
      /div
      /BOUCLE_art_suiv
      /td
      /tr
      /table
      /BOUCLE_navig

    • Bonjour,

      Malgré tous mes efforts et essais nombreux, je n’arrive pas à obtenir l’article précédent selon l’ordre alphabétique.

      1- Si je mets la boucle telle qu’elle est dans l’article ci-dessus, « article précédent » me renvoie l’article de la page visitée.

      2 - Si j’enlève le =

      Le site public affiche :
      # Erreur sur le site, boucle critère inconnu
      # (articles)
      Erreur MySQL
      articles.id_article, articles.lang FROM spip_articles AS `articles` WHERE (articles.id_rubrique = ’147’) AND titre() AND (articles.statut = « publie ») AND (articles.date < NOW()) ORDER BY articles.titre DESC LIMIT 0,1
      You have an error in your SQL syntax ; check the manual that corresponds to your MySQL server version for the right syntax to use near ’() AND (articles.statut = "publie") AND (articles.date < NOW()) ORDER BY artic’ at line 4

      3 - Si je mets :

      <BOUCLE_principal(ARTICLES){id_article}>
      <BOUCLE_avant(ARTICLES){id_rubrique}{titre<=#_principal:TITRE*}{exclus}{par titre}{0,1}{inverse}>
      [(#LOGO_ARTICLE|center|#URL_ARTICLE||reduire_image{0,100}|)]
      </BOUCLE_avant>--

      Lorsque je suis sur l’article : 002.
      Précédent : il n’affiche rien (alors qu’il existe un article 001.)

      Lorsque je suis sur l’article : 003.
      Précédent : il n’affiche rien (alors qu’il existe un article 002.)

      **************

      Le site est en 1.9.2c
      Quelqu’un peut-il m’aider ?

      Merci par avance !

    • @Voldor
      Essaie avec {1,1} et non {0,1}.

      Mathieu

    Répondre à ce message

  • Juste pour info ça marche très bien avec les rubriques également, merci pour cette « contrib » très utile !

    Mathieu

    Répondre à ce message

  • robomatix

    Le ’_article_principal’ vient du nom de la boucle qui englobe la page html...

    Répondre à ce message

  • Installation sur Art’s Web Gallery pour la visite de la galerie d’artistes : nickel

    Répondre à ce message

  • 2

    Un tri qui serait particulièrement intéressant est le {par num titre} (basé sur l’ordre arbitraire donné dans le titre), mais ça ne fonctionne pas avec {titre>#TITRE} pour des listes supérieures à 10 items (cf. http://thread.gmane.org/gmane.comp....).

    Il y a bien une solution proposée par rpapa, mais elle est un peu compliquée.

    François

    • Dans mon site c’est un peu plus compliqué parce que les articles sont tous dans des rubriques (un article par rubrique, pas plus d’un article).

      J’ai essayé ça, mais ça ne marche pas :

      <BOUCLE_tete_de_page(ARTICLES) {id_article}>
      
      …
      
      <BOUCLE_rub1(RUBRIQUES) {id_rubrique}>
      <BOUCLE_precedent(RUBRIQUES) {meme_parent} {debut_p,1} {par titre}>
      <BOUCLE_prec(ARTICLES) {id_rubrique}>
      Precedent : 
      #TITRE
      </BOUCLE_prec>
      </BOUCLE_precedent>
      </BOUCLE_rub1>
              
      …
                              
      <BOUCLE_rub2(RUBRIQUES) {id_rubrique}>
      <BOUCLE_suivant(RUBRIQUES) {meme_parent} {debut_s,1} {par titre} {inverse}>
      <BOUCLE_suiv(ARTICLES) {id_rubrique}>
      Suivant : 
      #TITRE
      </BOUCLE_suiv>
      </BOUCLE_suivant>
      
      </BOUCLE_rub2>
      </BOUCLE_tete_de_page>

      J’arrive bien (enfin !) à atteindre le bon niveau hiérarchique, mais ça ne m’affiche pas l’article précédent ni l’article suivant à l’article en cours. Ce qui est affiché est un peu aléatoire.

      Comment faire ?

      Merci

    • Il faut trier les boucles ARTICLES (BOUCLE_prec et BOUCLE_suiv) avec un critère {par }, sinon, il n’affiche rien d’aléatoire mais bien les articles par id_article.

    Répondre à ce message

  • Moi, je voudrais avoir « Brève suivante » / « Brève précédente », et ce qui est indiqué ne marche pas.

    J’ai essayé aussi avec quelque chose du style id_breve>#_breve_en_cours#ID_BREVE, mais je n’arrive pas à trier, spip transformant ça en « ...WHERE (breves.id_breve > ’id_breve’)... ».

    Une petite idée, peut-être ?

    Répondre à ce message

Ajouter un commentaire

Qui êtes-vous ?

Pour afficher votre trombine avec votre message, enregistrez-la d’abord sur gravatar.com (gratuit et indolore) et n’oubliez pas d’indiquer votre adresse e-mail ici.

Ajoutez votre commentaire ici

Ce champ accepte les raccourcis SPIP {{gras}} {italique} -*liste [texte->url] <quote> <code> et le code HTML <q> <del> <ins>. Pour créer des paragraphes, laissez simplement des lignes vides.

Ajouter un document

Suivre les commentaires : RSS 2.0 | Atom

Dernière modification de cette page le 14 juin 2012