Cómo mostrar the_excerpt en lugar de the_content en WordPress
Corto y al grano — quería mostrar el extracto de una publicación en lugar de the_content
en ciertas páginas. Naturalmente, si no hay extracto disponible, se generaría uno a partir del contenido. Entiendo que podría editar los archivos del tema, pero prefiero un método menos invasivo.
Al ver que algo como lo siguiente funciona:
add_action( 'the_content', 'myFunc' );
function myFunc ( $content ) {
the_title();
}
Pensé en intentar esto:
add_action( 'the_content', 'myFunc' );
function myFunc ( $content ) {
the_excerpt();
}
Esto. Falla. Gloriosamente. De hecho, resulta en un error fatal:
ERROR FATAL: ¡SE HA ALCANZADO EL NIVEL MÁXIMO DE ANIDACIÓN DE FUNCIONES '100', ABORTANDO! EN C:\WAMP\WWW\WORDPRESS\WP-INCLUDES\POST.PHP EN LA LÍNEA 555
Esto va seguido de una enorme pila de llamadas, que parece haber entrado en un frenesí de llamadas recursivas.
Cambiando las tornas
Esto me dejó curioso, así que probé lo opuesto. Mostrar the_content
en lugar de the_excerpt
:
add_action( 'the_excerpt', 'myFunc' );
function myFunc ( $content ) {
the_content();
}
Para mi sorpresa, esto funcionó perfectamente. Lo que entiendo es que the_excerpt
llama a the_content
, pero the_content
no llama a the_excerpt
— esto ciertamente explicaría por qué funciona en un sentido pero no en el otro, causando una recursión infinita.
No estoy muy familiarizado con el funcionamiento interno de estas dos funciones, así que me preguntaba qué podría aportar la comunidad aquí en forma de ideas. ¿Cuál es el problema con engancharse a the_content
y llamar a the_excerpt
?
¿Cómo puedo lograr este efecto sin llamar directamente a the_content
? Entiendo que podría proporcionar mi propia lógica de extracto personalizada, pero esto desnormalizaría la lógica de extractos en mi sitio, lo que significa que tendría algunos extractos creados mediante código personalizado en functions.php, y otros creados mediante los métodos internos de WordPress — idealmente, me gustaría evitar esto y usar solo los métodos internos si es posible.

Todos son buenos ejemplos. Pero no funcionaban para mí con el tema (pinboard) y el plugin que estaba usando (secondary-html-content) y lo que quería hacer.
El primer desafío fue asegurarme de obtener ambas partes del contenido en lugar de solo una. El segundo desafío fue reemplazar el extracto en la página de inicio con el contenido real.
Así que creé un nuevo plugin que hace esto:
function okmAddingContentExcerpt() {
global $post;
$content = '<div class="comment-first">'.$post->post_content.'</div>';
// Adia Review es el nombre de la etiqueta del plugin secondary-html-content
$content .= '<div class="comment-second">'.get_secondary_content('Adia Review',$post->ID).'</div>';
return $content;
}
add_filter('the_excerpt', 'okmAddingContentExcerpt');
function okmAddingContentSingle() {
global $post;
$content = '<div class="comment-first">'.$post->post_content.'</div>';
// elimina el filtro para que no se repita una y otra vez
remove_filter('the_content','okmAddingContentSingle');
$content .= '<div class="comment-second">'.get_secondary_content('Adia Review',$post->ID).'</div>';
return $content;
}
add_filter('the_content', 'okmAddingContentSingle');
Observa cómo quería mantener el contenido en lugar del extracto en la página principal.
Ah sí, si quieres descargar el plugin, lo agregué a mi blog: http://okmaya.com/wordpress-plugin-for-pinboard-theme-and-secondary-html-content-plugin/

En realidad, the_excerpt()
llama a get_the_excerpt()
, que muestra $post->post_excerpt
.
Una cosa más: ¿no deberías estar usando add_filter()
en lugar de add_action()
?
¿Por qué estás usando the_excerpt()
/the_content()
/the_title()
, en lugar de establecer $content
= get_the_excerpt()
etc., y luego devolver $content
? Por ejemplo, esto:
add_filter( 'the_content', 'myFunc' );
function myFunc ( $content ) {
the_excerpt();
}
...normalmente se escribiría así:
add_filter( 'the_content', 'myFunc' );
function myFunc ( $content ) {
$content = get_the_excerpt();
return $content;
}
No estoy seguro de si algo de esto resolverá tu problema del bucle recursivo...
EDITAR
Tu último comentario me dio una idea: ¿por qué no simplemente pasar $content a través de wp_trim_excerpt()
y terminarlo?
add_filter( 'the_content', 'myFunc' );
function myFunc( $content ) {
$excerpt = wp_trim_excerpt( $content );
return $excerpt;
}
EDITAR 2
Vale, ahora te entiendo. ¿Qué tal si creamos nuestra propia función de extracto?
add_filter( 'the_content', 'myFunc' );
function myFunc( $content ) {
$text = strip_shortcodes( $content );
$text = str_replace(']]>', ']]>', $text);
$text = strip_tags($text);
$excerpt_length = apply_filters('excerpt_length', 55);
$excerpt_more = apply_filters('excerpt_more', ' ' . '[...]');
$words = preg_split("/[\n\r\t ]+/", $text, $excerpt_length + 1, PREG_SPLIT_NO_EMPTY);
if ( count($words) > $excerpt_length ) {
array_pop($words);
$text = implode(' ', $words);
$text = $text . $excerpt_more;
} else {
$text = implode(' ', $words);
}
return $text;
}

No me refería a que the_excerpt
llame directamente a the_content
, disculpa la confusión. the_excerpt
llama a wp_trim_excerpt
que a su vez llama a get_the_content
. Honestamente, no estoy seguro de dónde está ocurriendo el problema. Las otras sugerencias en tu respuesta no ayudaron, desafortunadamente. Ya sea que use add_action
o add_filter
, no hizo ninguna diferencia en este caso. También cambié a devolver los valores en lugar de mostrarlos implícitamente con las funciones the_
- aún así no hubo mejora.

Acabo de darme cuenta de que olvidé un detalle importante. No hay extractos - los extractos deberían generarse a partir del contenido. Así que algo como global $post; return $post->post_excerpt;
funcionaría, pero estaría vacío.

Mmm... está bien, mira la respuesta actualizada para una idea diferente.

También he probado eso, de hecho. Curiosamente, solo devuelve un contenido formateado, sin límite de caracteres como se esperaba.

wp_trim_excerpt()
llama a $text = apply_filters('the_content', $text);
que es la causa de las llamadas recursivas. Quizás intenta extraer el código de wp_trim_excerpt()
desde /wp-includes/formatting.php línea 1830, omitiendo la línea mencionada, aunque no tengo idea de cuán esencial es esta línea para los extractos.

Vale, mira la Edición #2; intentemos crear nuestra propia función de recorte de extractos.

@Chip Definitivamente podría escribir mi propia lógica, sin embargo, entonces comenzaría a fracturar mi lógica de extractos en todo el sitio. Es decir, a menos que proporcione una reescritura global para todos los extractos, y no solo aquellos proporcionados en lugar de the_content
.
