Cómo personalizar los extractos en WordPress

Publicada en WordPress.

Mira nuestro vídeo

Existe una versión mejor de tu web

Comparte este artículo

El extracto es un texto opcional que puedes añadir a tus entradas a modo de resumen de las mismas. Si estás usando el nuevo editor, verás que hay una opción en la barra lateral llamada Extracto:

Extractos en Gutenberg
Extractos en Gutenberg.

Si no aparece, es posible que tengas que activar la opción desde los ajustes de Gutenberg. Haz clic en los puntos suspensivos de la esquina superior derecha del editor y a continuación pincha en Opciones:

Ajustes de Gutenberg
Ajustes de Gutenberg.

Entre las opciones que aparecen, busca Extracto y actívalo:

Cómo activar el panel para editar el extracto de una entrada
Cómo activar el panel para editar el extracto de una entrada.

Según cómo esté configurado tu tema, el extracto es el fragmento de texto que acompaña a tus entradas en páginas como el blog, los resultados de una búsqueda, etc. Por ejemplo, en nuestro blog puedes ver como todas nuestras entradas se presentan con su pequeño resumen asociado:

Entradas en el blog de Nelio con sus extractos
Entradas en el blog de Nelio con sus extractos.

Ahora bien, ¿es obligatorio escribir siempre el extracto? Si no ponemos ninguno, ¿qué hace WordPress? Pues vamos a responder estas preguntas en lo que queda de entrada y, además, veremos qué opciones tenemos para personalizar los extractos que genera WordPress.

Cómo funcionan los extractos en WordPress

WordPress dispone de dos funciones para obtener el extracto de una entrada en concreto: get_the_excerpt y the_excerpt. Ambas están definidas en wp-includes/post-template.php y si echas un vistazo a su código fuente descubrirás que the_excerpt lo único que hace es un echo de get_the_excerpt (después de pasarlo por un filtro específico: the_excerpt). Así que, a efectos prácticos, lo único que debes entender para saber cómo funcionan los extractos en WordPress es la función get_the_excerpt.

Tal y como puedes ver, get_the_excerpt es una función extremadamente sencilla:

function get_the_excerpt( $post = null ) {
  // ...
  $post = get_post( $post );
  if ( empty( $post ) ) {
    return '';
  }
  // ...
  return apply_filters( 'get_the_excerpt', $post->post_excerpt, $post );
}

Básicamente, obtiene la entrada que le pasas como parámetro (o, si no le pasas ninguna, utiliza la entrada que haya cargada en el loop de WordPress ) y devuelve como resultado el valor del atributo post_excerpt, el cual es, precisamente, el extracto que hayas escrito en el editor.

Entonces parece que ya hemos resuelto la duda, ¿no? Si no escribimos ningún extracto, WordPress no pintará nada…

No tan rápido, amigo.

Fíjate que, en realidad, esta función no escribe directamente el valor de post_excerpt, sino que, de nuevo, lo pasa por un filtro antes: get_the_excerpt. Así que si hay acciones asociadas a ese filtro, es posible que el resultado que acabe saliendo sea diferente de lo que esperamos.

Y, efectivamente, podemos comprobarlo por nosotros mismos. Si dejamos una entrada con contenido sin extracto, esto es lo que veremos en nuestra web:

Extracto automático
Extracto automático generado por WordPress.

Las primeras palabras de nuestro contenido seguidas de unos puntos suspensivos.

La función wp_trim_excerpt

Si realizamos una búsqueda rápida en el código fuente de WordPress veremos que, por defecto, solo hay una única acción asociada al filtro get_the_excerpt. En concreto, en el fichero wp-includes/default-filters.php vemos que se añade la función wp_trim_excerpt.

Según la documentación de WordPress, wp_trim_excerpt se encarga de generar un extracto a partir del contenido de la entrada «si es necesario». Y ahí está la clave: la función considera que «es necesario» si no existe ya un extracto (lo que, en general, es equivalente a decir que el usuario no ha escrito un extracto en el editor). Esto lo puedes ver en el código fuente de la función:

function wp_trim_excerpt( $text = '', $post = null ) {
  $raw_excerpt = $text;
  if ( '' == $text ) {
    $post = get_post( $post );
    $text = get_the_content( '', false, $post );
    // [...] » Genera el excerpt a partir del texto
  }
  return apply_filters( 'wp_trim_excerpt', $text, $raw_excerpt );
}

¿Ves? Si no hay un extracto (parámetro $text), recupera el contenido de la entrada actual (get_the_content de $post).

A partir de este punto podemos ir tirando del hilo y ver cómo genera exactamente el extracto a partir del contenido (algo que he omitido en el fragmento que he compartido en esta entrada, pero que puedes ver en el enlace al código fuente original). Pero, en definitiva, tenemos la respuesta en la propia documentación:

Devuelve un máximo de 55 palabras con puntos suspensivos al final.

Este límite se puede modificar usando el filtro excerpt_length. Los puntos suspensivos se pueden cambiar usando el filtro excerpt_more.

Documentación de wp_trim_excerpt

Así que ahora ya tienes a tu alcance todas las herramientas para personalizar totalmente los extractos automáticos que genera WordPress por ti.

Cómo personalizar los extractos automáticos

Veamos algunos ejemplos de cómo podemos usar los filtros que hemos visto a lo largo de la entrada de hoy para personalizar los extractos automáticos. Por cierto, recuerda que para poder añadir cualquiera de estas modificaciones en tu web deberás crear un plugin como te contamos aquí.

a) Cómo cambiar el número de palabras que quiero en mis extractos

Esta es una de las más sencillas. Ya hemos visto que tenemos a nuestra disposición el filtro excerpt_length para escoger cuántas palabras queremos que tengan nuestros extractos, así que vamos a usarlo:

function nelio_100_word_excerpts( $length ) {
  if ( is_admin() ) {
    return $length;
  }
  return 100;
}
add_filter( 'excerpt_length', 'nelio_100_word_excerpts', 99 );

Fíjate que lo primero que hacemos en nuestra función es añadir un pequeño control que garantice que nuestro cambio únicamente lo vamos a aplicar en el front-end de la web. Si estamos en el escritorio de WordPress (is_admin), mejor no tocamos nada. Y luego todo es cuestión de devolver siempre el número mágico que queramos. En mi ejemplo: 100 palabras.

b) Cómo cambiar el texto que aparece después de un extracto automático

Esta también está chupada, porque ya hemos visto que existe un filtro para ello:

function nelio_clickable_read_more( $more ) {
  if ( is_admin() ) {
    return $more;
  }
  return sprintf(
    '<a href="%s">¡Me interesa!</a>',
    esc_url( get_the_permalink() )
  );
}
add_filter( 'excerpt_more', 'nelio_clickable_read_more', 99 );

En este caso lo que hacemos es devolver (cuando toca) un enlace con el texto «¡Me interesa!» que lleva al visitante a la propia entrada. ¡Fácil y sencillo, amigos!

c) Cómo limitar la longitud de un extracto a un cierto número de caracteres

Si te has fijado, la función wp_trim_words tiene un filtro homónimo que podemos usar para modificar el extracto final que se genera. Así que vamos a usarlo:

function nelio_140_char_excerpts( $excerpt, $raw_excerpt ) {
  if ( is_admin() ) {
    return $excerpt;
  }
  if ( '' !== $raw_excerpt ) {
    return $excerpt;
  }
  return mb_substr( $excerpt, 0, 140 );
}
add_filter( 'wp_trim_excerpt', 'nelio_140_char_excerpts', 99, 2 );

El filtro wp_trim_words aplica tanto a los extractos automáticos como a los extractos que ha definido el usuario. En mi ejemplo, a mí me interesa únicamente modificar aquellos extractos que se han generado automáticamente, así que tengo que añadir alguna condición adicional. Si recuerdas, wp_trim_words únicamente genera un extracto automático si el original estaba vacío, así que basta con hacer esta comprobación para obtener el resultado deseado.

Por otro lado, merece especial mención el uso de la función mb_substr en lugar de la clásica substr. El motivo es sencillo: si en tu blog escribes en un idioma diferente al inglés es posible que aparezcan caracteres multi-byte… y con substr las cosas pueden fallar. Te dejo aquí un enlace a la documentación de PHP.

d) Cómo crear extractos con el primer párrafo del contenido

Y ya para acabar, un ejemplo de cómo crear un extracto usando exactamente el primer párrafo de tu entrada. En este caso, voy a dejar que seas tú el que entienda qué estoy haciendo en el código:

function nelio_first_paragraph_excerpts( $excerpt, $raw_excerpt ) {
  if ( is_admin() ) {
    return $excerpt;
  }
  if ( '' !== $raw_excerpt ) {
    return $excerpt;
  }
  $content = apply_filters( 'the_content', get_the_content() );
  return substr( $content, 0, strpos( $content, '</p>' ) + 4 );
}
add_filter( 'wp_trim_excerpt', 'nelio_first_paragraph_excerpts', 99, 2 );

En definitiva

La gran potencia de WordPress radica en su extensibilidad. Hoy hemos visto en detalle cómo WordPress genera los extractos de tus entradas y todos los filtros y funciones que te ofrece para poder personalizar y adaptar el resultado final a tus necesidades.

Espero que te haya gustado la entrada de hoy. Compártela con tus amigos para que más gente conozca las ventajas de WordPress!

Imagen destacada de Aaron Burden en Unsplash.

2 comentarios en «Cómo personalizar los extractos en WordPress»

  1. Hola excelente post, pero una pregunta, ¿hay algun modo en que cuando pego el enlace al post, en facebook aparezca el extracto y no solo la foto?, gracias.

Deja una respuesta

No publicaremos tu correo electrónico. Los campos obligatorios están marcados con: •

He leído y acepto la Política de privacidad de Nelio Software

Al marcar la casilla de aceptación estás dando tu legítimo consentimiento para que tu información personal se almacene en SiteGround y sea usada por Nelio Software con el propósito único de publicar aquí este comentario. Contáctanos para corregir, limitar, eliminar o acceder a tu información.