Mostrar solo el comienzo del post
Sé que normalmente esta es una pregunta obvia con muchas respuestas (como aquí), pero me gustaría mostrar solo el comienzo de los posts con un botón de "leer más". No uso extractos, así que me gustaría que WordPress tomara automáticamente las primeras 55 palabras o la primera frase para mostrarlo.
Uso el tema Toivo Lite. El index.php es:
<?php
get_header(); ?>
<?php if ( have_posts() ) : ?>
<?php do_action( 'toivo_before_loop' ); // Gancho de acción antes del bucle. ?>
<?php /* Comienza el Bucle */ ?>
<?php while ( have_posts() ) : the_post(); ?>
<?php
/* Incluye la plantilla específica del Formato de Post para el contenido.
* Si quieres sobrescribir esto en un tema hijo, entonces incluye un archivo
* llamado content-___.php (donde ___ es el nombre del Formato de Post) y ese será usado en su lugar.
*/
get_template_part( 'content', ( post_type_supports( get_post_type(), 'post-formats' ) ? get_post_format() : get_post_type() ) );
?>
<?php endwhile; ?>
<?php
the_posts_pagination( array(
'prev_text' => __( 'Página anterior', 'toivo-lite' ),
'next_text' => __( 'Página siguiente', 'toivo-lite' ),
'before_page_number' => '<span class="meta-nav screen-reader-text">' . __( 'Página', 'toivo-lite' ) . ' </span>',
) );
?>
<?php else : ?>
<?php get_template_part( 'content', 'none' ); ?>
<?php endif; ?>
<?php do_action( 'toivo_after_loop' ); // Gancho de acción después del bucle. ?>
<?php get_footer(); ?>
He intentado reemplazar los dos content
por excerpt
, pero entonces la página aparece vacía (solo cabecera y pie).
Intenta reemplazar esto:
<?php
/* Incluye la plantilla específica del Formato de Entrada para el contenido.
* Si deseas sobrescribir esto en un tema hijo, entonces incluye un archivo
* llamado content-___.php (donde ___ es el nombre del Formato de Entrada) y ese será usado en su lugar.
*/
get_template_part( 'content', ( post_type_supports( get_post_type(), 'post-formats' ) ? get_post_format() : get_post_type() ) );
?>
Con esto:
<?php echo my_excerpt(get_the_ID(), 300, 'Leer más'); ?>
Y luego añade esto a tu archivo functions.php:
function my_excerpt($postid, $len = 500, $more = false) {
$excerpt = apply_filters('the_excerpt', get_post_field('post_excerpt', $postid));
if(empty($excerpt)) $excerpt = strip_shortcodes(strip_tags(apply_filters('the_excerpt', get_post_field('post_content', $postid))));
if(strlen($excerpt) > $len) $excerpt = substr($excerpt, 0, $len-3) . '…';
if($more) $excerpt .= '<a class="read-more" href="' . get_the_permalink($postid) . '">' . $more . '</a>';
return $excerpt;
}
Por defecto esto retornará los primeros 300 caracteres del contenido de la entrada. Cambia el "300" en la llamada a my_excerpt por el número de caracteres que deseas retornar (nota, esto no es cuántas palabras retornar, sino cuántos caracteres).

Esto no funciona. Se muestran los primeros 300 caracteres, pero no hay ningún formato ni títulos... Todo está en un solo bloque.

Sí, este código elimina todo eso. Si no quieres que lo elimine, entonces cambia esta línea: if(empty($excerpt)) $excerpt = strip_shortcodes(strip_tags(apply_filters('the_excerpt', get_post_field('post_content', $postid)))); por esto en su lugar: if(empty($excerpt)) $excerpt = apply_filters('the_excerpt', get_post_field('post_content', $postid));

Esto es mejor, pero todavía no hay títulos o formato (ocupa todo el ancho en lugar de solo la columna).

En ese caso, prueba esto en su lugar para esa línea: if(empty($excerpt)) $excerpt = get_post_field('post_content', $postid); eso mostrará el contenido literalmente pero podría ser peligroso porque si hay algún HTML devuelto al principio de la publicación, se contará en el recuento de caracteres, lo que potencialmente podría dar lugar a contenido de diferente longitud devuelto de una publicación a otra.

Puedes probar lo siguiente:
<?php
get_header(); ?>
<?php if ( have_posts() ) : ?>
<?php do_action( 'toivo_before_loop' ); // Gancho de acción antes del bucle. ?>
<?php /* Comienza el Bucle */ ?>
<?php while ( have_posts() ) : the_post(); ?>
<?php
/* Incluye la plantilla específica del Formato de Entrada para el contenido.
* Si deseas sobrescribir esto en un tema hijo, entonces incluye un archivo
* llamado content-___.php (donde ___ es el nombre del Formato de Entrada) y ese será usado en su lugar.
*/
echo wp_trim_words( get_the_content(), $num_words = 50, $more = '...' );
echo '<a href="'.get_the_permalink().'">Leer más</a>';
?>
<?php endwhile; ?>
<?php
the_posts_pagination( array(
'prev_text' => __( 'Página anterior', 'toivo-lite' ),
'next_text' => __( 'Página siguiente', 'toivo-lite' ),
'before_page_number' => '<span class="meta-nav screen-reader-text">' . __( 'Página', 'toivo-lite' ) . ' </span>',
) );
?>
<?php else : ?>
<?php get_template_part( 'content', 'none' ); ?>
<?php endif; ?>
<?php do_action( 'toivo_after_loop' ); // Gancho de acción después del bucle. ?>
<?php get_footer(); ?>
He reemplazado:
get_template_part( 'content', ( post_type_supports( get_post_type(), 'post-formats' ) ? get_post_format() : get_post_type() ) );
Con:
wp_trim_words( the_content(), $num_words = 50, $more = '...' );
Alguien podría decirme que este es el enfoque incorrecto, pero podría ayudarte. Mostrará las primeras 50 palabras del contenido con un "..." al final.

Por favor, haz clic en el edit
enlace debajo de tu respuesta para agregar más información sobre dónde puedes poner esto, junto con cualquier formateo de código necesario.
