Solution au problème des URLs dans la fonction Billet suivant/précédent de Dotclear

J’avais posté une version améliorée de l’astuce dotclear 1 : billet suivant – précédent de la catégorie, permettant de créer une mise en page un peu évoluée et d’avoir un léger résumé des billets.

Un de mes lecteurs (Djoh qui au passage à un très joli blog) m’a posé une question récemment à propos d’un problème lié aux urls affichées dans ces blocs d’information.

En effet, les adresses des billets utilisées n’étais pas égales aux adresses réelles mais bien au titre exact du billet. Pour peu que l’on soit adepte des URLs optimisées, comme moi, on se retrouvait vite avec des liens morts.

Voici donc la solution, attention, ce n’est pas très propre, je le rappelle, je ne suis pas développeur :

Il faut reprendre le code que j’avais fourni dans le billet précédent et le modifier ainsi :

  	$strReq = 'SELECT post_id, post_titre, post_dt, post_chapo, post_content, post_titre_url '.
  			'FROM '.$blog->t_post.' '.
  			'WHERE UNIX_TIMESTAMP(post_dt) '.$sign.' \''.$ts.'\' '.
  			$reqPlus.
  			'ORDER BY post_dt '.$blog->con->escapeStr($order).' '.
  			'LIMIT 0,1 '; 	if (($rs = $blog->con->select($strReq)) !== false) {
  		return $rs;
  	}

On a ajouté le SELECT sur post_titre_url, qui manquait cruellement à la fonction.

Ensuite on va créer une variable reprenant cette valeur, comme je suis d’humeur joyeuse, on va l’appeler $youpla et l’on va modifier la partie du script touchant à la variable $url qui fait appel à la variable $titre, en remplaçant la variable $titre par $youpla, ce qui nous donne la chose suivante :

		$id = $rs->f('post_id');
		$titre = $rs->f('post_titre');
		$date = $rs->f('post_dt');
		$ts = strtotime($date);
		$youpla = $rs->f('post_titre_url');
		$url = sprintf($blog->front_url['post'],date('Y',$ts),
		date('m',$ts),date('d',$ts),$id,$blog->str2url($youpla));

Ce qui donne au final le code complet suivant à ajouter dans le fichier prepend.php de votre thème :

  /** * Naviguer d'un billet a l'autre dans la meme categorie
  * @function dcPostNextInCat
  */
  function myGetNextID($ts,$dir=1,$cat=0) {
  	global $blog;
  	$ts = (integer) $ts;
  	$reqPlus = ''; 	if($dir > 0) {
  		$sign = '>';
  		$order = 'ASC';
  	} else {
  		$sign = '<';
  		$order = 'DESC';
  	}
  	if ($blog->pub_mode !== NULL) {
  		$reqPlus .= 'AND post_pub = '.$blog->pub_mode.' ';
  	}
  	if ($blog->lang !== NULL) {
  		$reqPlus .= 'AND post_lang = \''.$blog->con->escapeStr($blog->lang).'\' ';
  	}
  	if ($cat !== 0) {
  	   $reqPlus .= 'AND cat_id = '.$cat.' ';
  	}
  	$strReq = 'SELECT post_id, post_titre, post_dt, post_chapo, post_content, post_titre_url '.
  			'FROM '.$blog->t_post.' '.
  			'WHERE UNIX_TIMESTAMP(post_dt) '.$sign.' \''.$ts.'\' '.
  			$reqPlus.
  			'ORDER BY post_dt '.$blog->con->escapeStr($order).' '.
  			'LIMIT 0,1 '; 	if (($rs = $blog->con->select($strReq)) !== false) {
  		return $rs;
  	} else {
  		$blog->setError('MySQL : '.$blog->con->error(),2000);
  		return false;
  	}
  }
  function dcPostNextInCat($dir,$s='%1$s %2$s %3$s') {
  	global $blog;
  	global $news;
  	$rs = myGetNextID($news->getTS(), $dir, $news->f('cat_id'));
  	if (!$rs->isEmpty())
  	{
		$id = $rs->f('post_id');
		$titre = $rs->f('post_titre');
		$date = $rs->f('post_dt');
		$ts = strtotime($date);
		$youpla = $rs->f('post_titre_url');
		$url = sprintf($blog->front_url['post'],date('Y',$ts),
		date('m',$ts),date('d',$ts),$id,$blog->str2url($youpla));
  		
  		if ($rs->f('post_chapo') != '') {
  			$desc = strip_tags($rs->f('post_chapo'));
  		} else {
  			$desc = util::cutString(strip_tags($rs->f('post_content')),150).'...';
  		}
  		printf($s,$id,$titre,$url,$desc);
  	}
  	else {
  	printf('< h5 >Vous êtes sur le dernier article de la rubrique< /h5 >< p >Le prochain article est, probablement, en cours de rédaction.< /p >< p >Cordialement,< br / >Aymeric Jacquet< /p >');
  	}
  }

N’oubliez pas de personnaliser le texte de remplacement à la fin du code.

Et voila, maintenant nos liens vers les articles précédents et suivants sont bien les liens réels des articles et non plus le titre inséré en lien.

Cordialement,
Aymeric Jacquet

Tags : ,

Be Sociable, Share!

4 Commentaires pour Solution au problème des URLs dans la fonction Billet suivant/précédent de Dotclear

  • Efficace !

    Pour une meilleur compréhension des lecteurs, il serait préférable de remettre tout le code.

    Vive Dotclear, Vive Aymeric !

    Le 3 juillet 2008 à 19 h 39 min

  • Djoh : oui, à défaut d’être élégant, ça fonctionne.

    J’ai ajouté le code complet.

    Le 4 juillet 2008 à 9 h 30 min

  • En tout cas, merci !

    Je dois t’avouer que j’ai modifié toutes mes URL la semaine dernière, n’arrivant pas à résoudre le problème… Mais maintenant, je peux y revenir, c’est toujours ça ! :)

    Le 4 juillet 2008 à 16 h 57 min

  • C’est très pratique, merci.

    Le 23 août 2008 à 15 h 00 min