Tips pour pluxml

Pluxml est de plus en plus utilisé dans la sphère des Seo même si plein d’autres cms sans base de données sont plutôt cools.

Ce tips concerne donc l’affichage d’une partie de l’article sur la home, les tags, la catégorie mais aussi dans le flux rss.

De base, dans pluxml, il est possible de mettre un chapeau à l’article et c’est avec ce chapeau qu’il présente votre article sur les différentes pages.

Donc, comme je n’aime pas réinventer la roue, je vais chercher la fonction truncate dans une class du framework cakephp.

Ceci donc à copier dans un fichier que l’on nommera truncate.php

<?php
 function truncate($text, $length = 100, $options = array()) {
 $default = array(
 'ellipsis' => '...', 'exact' => true, 'html' => false
 );
 if (isset($options['ending'])) {
 $default['ellipsis'] = $options['ending'];
 } elseif (!empty($options['html']) && Configure::read('App.encoding') === 'UTF-8') {
 $default['ellipsis'] = "\xe2\x80\xa6";
 }
 $options = array_merge($default, $options);
 extract($options);
if (!function_exists('mb_strlen')) {
 class_exists('Multibyte');
 }
if ($html) {
 if (mb_strlen(preg_replace('/<.*?>/', '', $text)) <= $length) {
 return $text;
 }
 $totalLength = mb_strlen(strip_tags($ellipsis));
 $openTags = array();
 $truncate = '';
preg_match_all('/(<\/?([\w+]+)[^>]*>)?([^<>]*)/', $text, $tags, PREG_SET_ORDER);
 foreach ($tags as $tag) {
 if (!preg_match('/img|br|input|hr|area|base|basefont|col|frame|isindex|link|meta|param/s', $tag[2])) {
 if (preg_match('/<[\w]+[^>]*>/s', $tag[0])) {
 array_unshift($openTags, $tag[2]);
 } elseif (preg_match('/<\/([\w]+)[^>]*>/s', $tag[0], $closeTag)) {
 $pos = array_search($closeTag[1], $openTags);
 if ($pos !== false) {
 array_splice($openTags, $pos, 1);
 }
 }
 }
 $truncate .= $tag[1];
$contentLength = mb_strlen(preg_replace('/&[0-9a-z]{2,8};|&#[0-9]{1,7};|&#x[0-9a-f]{1,6};/i', ' ', $tag[3]));
 if ($contentLength + $totalLength > $length) {
 $left = $length - $totalLength;
 $entitiesLength = 0;
 if (preg_match_all('/&[0-9a-z]{2,8};|&#[0-9]{1,7};|&#x[0-9a-f]{1,6};/i', $tag[3], $entities, PREG_OFFSET_CAPTURE)) {
 foreach ($entities[0] as $entity) {
 if ($entity[1] + 1 - $entitiesLength <= $left) {
 $left--;
 $entitiesLength += mb_strlen($entity[0]);
 } else {
 break;
 }
 }
 }
$truncate .= mb_substr($tag[3], 0 , $left + $entitiesLength);
 break;
 } else {
 $truncate .= $tag[3];
 $totalLength += $contentLength;
 }
 if ($totalLength >= $length) {
 break;
 }
 }
 } else {
 if (mb_strlen($text) <= $length) {
 return $text;
 }
 $truncate = mb_substr($text, 0, $length - mb_strlen($ellipsis));
 }
 if (!$exact) {
 $spacepos = mb_strrpos($truncate, ' ');
 if ($html) {
 $truncateCheck = mb_substr($truncate, 0, $spacepos);
 $lastOpenTag = mb_strrpos($truncateCheck, '<');
 $lastCloseTag = mb_strrpos($truncateCheck, '>');
 if ($lastOpenTag > $lastCloseTag) {
 preg_match_all('/<[\w]+[^>]*>/s', $truncate, $lastTagMatches);
 $lastTag = array_pop($lastTagMatches[0]);
 $spacepos = mb_strrpos($truncate, $lastTag) + mb_strlen($lastTag);
 }
 $bits = mb_substr($truncate, $spacepos);
 preg_match_all('/<\/([a-z]+)>/', $bits, $droppedTags, PREG_SET_ORDER);
 if (!empty($droppedTags)) {
 if (!empty($openTags)) {
 foreach ($droppedTags as $closingTag) {
 if (!in_array($closingTag[1], $openTags)) {
 array_unshift($openTags, $closingTag[1]);
 }
 }
 } else {
 foreach ($droppedTags as $closingTag) {
 $openTags[] = $closingTag[1];
 }
 }
 }
 }
 $truncate = mb_substr($truncate, 0, $spacepos);
 }
 $truncate .= $ellipsis;
if ($html) {
 foreach ($openTags as $tag) {
 $truncate .= '</' . $tag . '>';
 }
 }
return $truncate;
 }
 ?>

On le place alors dans le dossier principal du pluxml au côté de sitemap.php feed.php …Dans le thème sur le fichier home.php

<?php include(dirname(__FILE__).'/header.php'); 
      include('./truncate.php'); ?>

puis plus bas pour afficher la partie de l’article:

<div class="article-content">
<?php ob_start();
$plxShow->artContent($chapo=true);
$content = ob_get_clean();
echo truncate($content,120,array(
'ellipsis' => '...',
'exact' => false
));
?>
</div>

Opération à répéter pour les fichiers categorie.php et tags.php

On passe maintenant au flux rss. Dans /core/lib/class.plx.feed.php à la ligne 219:

public function getRssArticles() {

        include('./truncate.php');

puis ligne 241 on modifie pour obtenir:

		# On va boucler sur les articles (si il y'en a)
		if($this->plxRecord_arts) {
			while($this->plxRecord_arts->loop()) {
				# Traitement initial
				if($this->aConf['feed_chapo']) {
					$content = $this->plxRecord_arts->f('chapo');
					if(trim($content)=='') $content = truncate(
    $this->plxRecord_arts->f('content'),
    120,
    array(
        'ellipsis' => '...',
        'exact' => false
    ));
				} else {
					$content = $this->plxRecord_arts->f('chapo').$this->plxRecord_arts->f('content');
					$content = truncate(
    $content,
    120,
    array(
        'ellipsis' => '...',
        'exact' => false
    ));
				}
				$content .= $this->aConf['feed_footer'];

Bon évidemment, il serait mieux d’avoir un plugin qui gère cela jusqu’au flux rss mais bon pour le moment ça me suffit.

Partagez en commentaires si vous avez des astuces de cet ordre.

One Comment

  1. Sylvain dit:

    Top, je vais tester tout ça.

    Pratique pour éviter la duplication.