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


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.


4 réponses à “Solution au problème des URLs dans la fonction Billet suivant/précédent de Dotclear”

  1. Efficace !

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

    Vive Dotclear, Vive Aymeric !

  2. 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 ! :)