SummArg | Cursos y recursos para webmasters

31/07/2012

Limitar el contenido de texto en WordPress

Limitar el contenido de texto puede ser útil para el diseño de diferentes layouts en nuestro theme WordPress, y la plataforma nos ofrece pocas posibilidades:

  • Colocar el texto completo con the_content()
  • Colocar las primeras 55 palabras con the_excerpt()
  • Colocar lo que hayamos puesto antes del < ! — more–>

Pero que sucede cuando necesitamos que un conjunto de entradas en nuestra portada tenga un máximo de 300 caracteres y otro conjunto 150? Modificar la longitud de the_excerpt no servirá de nada, ya que no nos permite tener dos the_excerpts diferentes. Y modificar el contenido antes de la etiqueta more resulta engorroso.

Una solución posible es el plugin “Limit Posts” de La Bitacora, el cual tiene mas de 3 años de antiguedad y sigue funcionando de maravillas. Simplemente coloquen el siguiente código en el archivo functions.php de su theme activo.

/*
 Original Plugin URI: http://labitacora.net/comunBlog/limit-post.phps
 Usage: the_content_limit($max_charaters, $more_link)
 */
function the_content_limit($max_char, $more_link_text = '(more...)', $stripteaser = 0, $more_file = '') {
 $content = get_the_content($more_link_text, $stripteaser, $more_file);
 $content = apply_filters('the_content', $content);
 $content = str_replace(']]>', ']]&gt;', $content);
 $content = strip_tags($content);
if (strlen($_GET['p']) > 0) {
 echo "<p>";
 echo $content;
 echo "...";
 echo "&nbsp;<a href='";
 the_permalink();
 echo "'>".$more_link_text."</a>";
 echo "</p>";
 }
 else if ((strlen($content)>$max_char) && ($espacio = strpos($content, " ", $max_char ))) {
 $content = substr($content, 0, $espacio);
 $content = $content;
 echo "<p>";
 echo $content;
 echo "...";
 echo "&nbsp;<a href='";
 the_permalink();
 echo "'>Leer nota</a>";
 echo "</p>";
 }
 else {
 echo "<p>";
 echo $content;
 echo "...";
 echo "&nbsp;<a href='";
 the_permalink();
 echo "'>Leer nota</a>";
 echo "</p>";
 }
 }

Luego, para usarlo en nuestro theme, colocamos dentro del bucle la función y la cantidad de caracteres que queramos.

<?php the_content_limit('150'); ?>

Otra solución es el siguiente snippet de GraphicBeacon que nos permite acortar la cantidad de caracteres del título y del contenido.

// Limit Post Title by amount of characters
 function short_title($num) {
 $limit = $num+1;
 $title = str_split(get_the_title());
 $length = count($title);
 if ($length>=$num) {
 $title = array_slice( $title, 0, $num);
 $title = implode("",$title)."...";
 echo $title;
 } else {
 the_title();
 }
 }
 // Limit Post Content by Amount of Characters
 function short_content($num) {
 $limit = $num+1;
 $content = str_split(get_the_content());
 $length = count($content);
 if ($length>=$num) {
 $content = array_slice( $content, 0, $num);
 $content = implode("",$content)."...";
 echo '<p>'.$content.'</p>';
 } else {
 the_content();
 }
 }

Y su uso será:

<?php
 // Limit title by 10 characters
 short_title(10);
 // Limit content by 20 characters</div>
 short_content(20);
 ?>

Finalmente otra opción similar a estas dos es la postulada por DivineDeveloper, que nos parece bastante prolija porque quita todas las etiquetas que pueda encontrar en una entrada y funciona muy bien.

<?php
 ////////////////////////////////////////////////////////////////////////////////
 // Find and close unclosed xhtml tags
 function close_tags($text) {
 $patt_open = "%((?<!</)(?<=<)[s]*[^/!>s]+(?=>|[s]+[^>]*[^/]>)(?!/>))%";
 $patt_close = "%((?<=</)([^>]+)(?=>))%";
 if (preg_match_all($patt_open,$text,$matches))
 {
 $m_open = $matches[1];
 if(!empty($m_open))
 {
 preg_match_all($patt_close,$text,$matches2);
 $m_close = $matches2[1];
 if (count($m_open) > count($m_close))
 {
 $m_open = array_reverse($m_open);
 foreach ($m_close as $tag) $c_tags[$tag]++;
 foreach ($m_open as $k => $tag) if ($c_tags[$tag]--<=0) $text.='</'.$tag.'>';
 }
 }
 }
 return $text;
 }
 ////////////////////////////////////////////////////////////////////////////////
 // Content Limit
 function content($num, $more_link_text = '(more...)') {
 $theContent = get_the_content($more_link_text);
 $output = preg_replace('/<img[^>]+./','', $theContent);
 $limit = $num+1;
 $content = explode(' ', $output, $limit);
 array_pop($content);
 $content = implode(" ",$content);
 $content = strip_tags($content, '<p><a><address><a><abbr><acronym><b><big><blockquote><br><caption><cite><class><code><col><del><dd><div><dl><dt><em><font><h1><h2><h3><h4><h5><h6><hr><i><img><ins><kbd><li><ol><p><pre><q><s><span><strike><strong><sub><sup><table><tbody><td><tfoot><tr><tt><ul><var>');
 echo close_tags($content);
 echo "<p><a href='";
 the_permalink();
 echo "'>".$more_link_text."</a></p>";
 }?>

Y su uso es:

<?php content(100, __('(more...)')); ?>

Entradas Relacionadas

  • Sin entradas similares

Dejar un comentario

  1. waldemar

    hola muy interesante tu website, dime alguna manera de hacerlo sin instalar plugins?.

  2. Me sirvio un monton muchas gracias

  3. amigo tengo un problema necesito limitar el texto pero no las imagenes del content alguna sugerencia? agradecere tu ayuda

Dejar un comentario