Agenda, de Aaron Burden

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.

10 respuestas a «Cómo personalizar los extractos en WordPress»

  1. Avatar de RAUL LILLOY
    RAUL LILLOY

    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.

    1. Avatar de David Aguilera

      Hola Raúl. Para ello necesitas que tu web incluya algunas meta-etiquetas especiales en tu web. En esta entrada del blog, Ruth te cuenta cuáles y cómo puedes ponerlas con un plugin como Yoast SEO.

  2. Avatar de Alex
    Alex

    ¡Hola! Entonces, imagino que se puede hacer algo para evitar que genere los extractos automáticamente. ¿Cierto?

    1. Avatar de David Aguilera

      Hola, Alex. No entiendo muy bien qué estás intentando conseguir. En esta entrada te explico cómo personalizar el extracto. Si quisieras, podrías hacer que el extracto fuera un texto vacío… Pero los extractos aparecen allí donde el tema los pide, así que, si cuando dices «evitar que los genere» quieres decir que no estén, lo mismo debes editar tu tema.

      ¿Qué intentas hacer?

  3. Avatar de David
    David

    Hola,
    Mi plantilla incluye el extracto manual en el post, justo debajo del título. Y preferiría que no apareciera en el post. Puedo modificar eso? Cómo?

    1. Avatar de David Aguilera

      Puedes usar el filtro get_the_excerpt para modificar cuál es el excerpt que se debe mostrar en un caso u otro. Si estás viendo la entrada directamente (lo cual puedes comprobar con un if usando la función is_single), devuelves el string vacío '' (es decir, que no hay extracto). Sino, devuelves el extracto tal cual te entraba como parámetro.

  4. Avatar de Jota
    Jota

    Hola David, muy interesante tu post sobre los extractos.

    Tengo una duda que no se ha tocado en el post.

    Si tengo un entrada de un blog con acceso restringido con contraseña, no se me muestra el extracto.

    ¿Cómo puedo hacer para mostrar el extracto sí o sí? Forzarlo por decirlo así.

    Gracias por tu tiempo.

    1. Avatar de David Aguilera

      ¿En qué contexto quieres que funcione? ¿En la lista de entradas?

  5. Avatar de Alfonso
    Alfonso

    Hola David,

    que puedo hacer para el contenido del extracto del cluster se muestre centrado y no a la izquierda??

    Gracias y Saludos

    1. Avatar de David Aguilera

      Deberás añadir alguna regla CSS a tu tema para que aparezca centrado. Pásanos un enlace a tu web, donde se vean los extractos sin centrar, e intentamos ver cómo hacerlo.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

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

Tus datos personales se almacenarán en SiteGround y serán usados por Nelio Software con el único objetivo de publicar tu comentario aquí. Con el envío de este comentario, nos das el consentimiento expreso para ello. Escríbenos para acceder, rectificar, limitar o eliminar tus datos personales.