Personalizar la longitud y permitir HTML en el extracto de WordPress

El extracto es una funcionalidad bastante práctica dentro de WordPress. Básicamente nos permite mostrar una versión reducida del inicio del contenido de nuestras entradas. Esto suele ser muy apropiado para mostrar listados o páginas de archivo de entradas, donde es más importante listar que profundizar en el contenido. A través de la función the_excerpt() en WordPress podemos mostrar un extracto de la entrada con unas particularidades muy importantes:

  • Su longitud es limitada a un número determinado de palabras, 55 por defecto.
  • Elimina las etiquetas HTML, dejando exclusivamente el texto en formato plano.
  • Termina incluyendo un texto con el enlace tipo “Leer más”, que dirige a la entrada.

Para usos sencillos podemos usar tanto la función the_excerpt(), que directamente muestra el contenido en nuestra página o también get_the_excerpt() que retorna el contenido del extracto para almacenar en una variable. Si queremos hacer diseños más personalizados o con limitaciones de maquetación, es posible que necesitemos ser más creativos con el uso de los extractos y también del contenido.

En muchas ocasiones es necesario reducir la longitud de los extractos, ya que tenemos un diseño con unas limitaciones muy precisas o lo que también se describe, así evitar que los extractos que retorna WordPress no contengan ciertas etiquetas HTML, como párrafos, saltos de líneas, titulares o enlaces. Veamos algunas posibilidades que podemos aplicar en nuestros temas.

Limitar la longitud del extracto a una cantidad fija de caracteres

Una solución habitual para el extracto es modificar la longitud a un valor determinado. En la documentación de WordPress se explica con un filtro llamado excerpt_length que admite un entero. Por tanto como se indica en este ejemplo en la documentación, para modificar el valor por defecto de 55 palabras a 20, colocaríamos en nuestro archivo functions.php o en un plugin aparte la siguiente función:


function custom_excerpt_length( $length ) {
return 20;
}
add_filter( 'excerpt_length', 'custom_excerpt_length', 999 );

Para situaciones sencillas, nos resultaría suficiente. Pero ¿qué pasa cuándo queremos controlar sistemáticamente la longitud del extracto? Esto podría ser interesante para modificar la longitud del extracto en función de ciertas páginas o listados. Por tanto necesitamos una función, donde le pasaramos un valor númerico por argumento, y representaría la cantidad de palabras devueltas. Podríamos hacer lo siguiente:

function excerpt($limit) {
      $excerpt = explode(' ', get_the_excerpt(), $limit);
      if (count($excerpt)>=$limit) {
        array_pop($excerpt);
        $excerpt = implode(" ",$excerpt).'...';
      } else {
        $excerpt = implode(" ",$excerpt);
      } 
      $excerpt = preg_replace('`\[[^\]]*\]`','',$excerpt);
      return $excerpt;
    }

Esta sencilla función lo que permite es determinar si es necesario indicar con unos puntos suspensivos si existe más contenido del extracto, una vez se han calculado las palabras según el limite establecido. También reemplaza ciertos caracteres que pueden proceder de shortcodes. La cuestión es que es fácil indicar en el tema que longitud queremos para el extracto, por ejemplo usando la sencilla función excerpt(25). Esta función devolvería el extracto en 25 palabras. Si el extracto es más largo (recordar que por defecto es de 55 palabras), se añadirían unos puntos suspensivos, para indicar que hay más contenido.

Para soluciones sencillas también es posible usar la función de WordPress wp_trim_words()

Soluciones avanzadas para mostrar el extracto o el contenido en WordPress

Recientemente me he encontrado con la necesidad de adaptar la presentación de un extracto en función del largo del texto de la entrada. Debido a que en la página web se mezclaban entradas largas con entradas cortas (en formato poesía), era necesario un método para mejorar la presentación. Puesto que las poesías necesitan mantener un formato con saltos de línea, la solución de distinguir entre extracto y contenido tenía el mismo problema. Extraer el contenido con get_the_content(), eliminaba eliminaba las etiquetas html. Personalizar en este caso la presentación requería una solución especial.

La primera solución implicaba contar las palabras del extracto y en función de la longitud escogida, añadía una clase en el HTML. Luego con CSS se adaptaba para que el texto más reducido apareciera con fuente más grande. Primero hace falta una función auxiliar que nos cuente las palabras de la entrada:


function word_count() {
    $content = get_post_field( 'post_content', $post->ID );
    $word_count = str_word_count( strip_tags( $content ) );
    return $word_count;
}

Luego asignar la clase en función del tamaño devuelto por la función anterior.

$num_palabras = word_count();
$cuenta = ($num_palabras >=32) ? 'larga' : 'corta';     
$tipo = 'poesía completa'; ?>

Esta solución funciona satisfactoriamente, pero cuenta con un detalle importante: si las poesías son muy largas no nos vale porque, al devolver el extracto con get_the_excerpt() ya sabemos que nos elimina las etiquetas HTML y los saltos de línea. Por tanto hace falta una solución mucho más robusta. Afortunadamente y gracias a la popularidad de WordPress existen personas que han desarrollado soluciones para controlar el extracto y el contenido, respetando las etiquetas.

El código que se muestra a continuación permite controlar la longitud del extracto y además, nos permite respetar las etiquetas HTML que le indiquemos. Por tanto es la solución perfecta para controlar con detalle la presentación y la longitud del extracto.

Como se puede ver en el código, existen una serie de etiquetas HTML permitidas en el extracto, y luego se trata de, a través de un complejo proceso, extraer las palabras indicadas y procesar el extracto (o el contenido) según las funciones indicadas. Con esto podremos insertar HTML en nuestro extracto o el contenido que se obtiene a través de la función get_the_content(). Como se indicaba, esto nos ofrece mucha flexibilidad para maquetar temas avanzados que aprovechen el extracto para ofrecer información, en contenedores de limitado tamaño.