Mostra solo l'inizio del post
So che normalmente questa è una domanda ovvia con molte risposte (come qui), ma vorrei mostrare solo l'inizio dei post con un pulsante "leggi tutto". Non uso gli excerpt, quindi vorrei che WordPress prendesse automaticamente le prime 55 parole o la prima frase per visualizzarle.
Uso il tema Toivo Lite. L'index.php è:
<?php
get_header(); ?>
<?php if ( have_posts() ) : ?>
<?php do_action( 'toivo_before_loop' ); // Hook azione prima del loop. ?>
<?php /* Inizia il Loop */ ?>
<?php while ( have_posts() ) : the_post(); ?>
<?php
/* Includi il template specifico per il formato del post.
* Se vuoi sovrascriverlo in un child theme, includi un file
* chiamato content-___.php (dove ___ è il nome del Formato Post) e quello verrà usato invece.
*/
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' => __( 'Pagina precedente', 'toivo-lite' ),
'next_text' => __( 'Pagina successiva', 'toivo-lite' ),
'before_page_number' => '<span class="meta-nav screen-reader-text">' . __( 'Pagina', 'toivo-lite' ) . ' </span>',
) );
?>
<?php else : ?>
<?php get_template_part( 'content', 'none' ); ?>
<?php endif; ?>
<?php do_action( 'toivo_after_loop' ); // Hook azione dopo il loop. ?>
<?php get_footer(); ?>
Ho provato a sostituire i due content
con excerpt
, ma poi la pagina risulta vuota (solo header e footer).
Prova a sostituire questo:
<?php
/* Includi il template specifico del Post-Format per il contenuto.
* Se vuoi sovrascriverlo in un child theme, includi un file
* chiamato content-___.php (dove ___ è il nome del Post Format) e quello verrà usato al suo posto.
*/
get_template_part( 'content', ( post_type_supports( get_post_type(), 'post-formats' ) ? get_post_format() : get_post_type() ) );
?>
Con questo:
<?php echo my_excerpt(get_the_ID(), 300, 'Leggi tutto'); ?>
E poi aggiungi questo al tuo file 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;
}
Di default questa funzione restituirà i primi 300 caratteri del contenuto del post. Modifica il valore "300" nella chiamata a my_excerpt con il numero di caratteri che vuoi vengano restituiti (nota bene, questo non è il numero di parole da restituire, ma il numero di caratteri).

Non funziona. Vengono visualizzati i primi 300 caratteri, ma non c'è alcuna formattazione né titoli... Tutto è in un unico blocco.

Sì, questo codice rimuove tutto ciò. Se non vuoi che venga rimosso, cambia questa riga: if(empty($excerpt)) $excerpt = strip_shortcodes(strip_tags(apply_filters('the_excerpt', get_post_field('post_content', $postid)))); con questa invece: if(empty($excerpt)) $excerpt = apply_filters('the_excerpt', get_post_field('post_content', $postid));

Così è meglio, ma mancano ancora i titoli e la formattazione (occupano tutta la larghezza invece di rimanere solo nella colonna).

In quel caso, prova invece questa modifica per quella riga: if(empty($excerpt)) $excerpt = get_post_field('post_content', $postid); questo restituirà il contenuto così com'è ma potrebbe essere rischioso perché se all'inizio del post c'è del codice html verrà conteggiato nel conteggio dei caratteri, potenzialmente portando a contenuti di lunghezza diversa restituiti da un post all'altro.

Puoi provare quanto segue:
<?php
get_header(); ?>
<?php if ( have_posts() ) : ?>
<?php do_action( 'toivo_before_loop' ); // Hook azione prima del loop. ?>
<?php /* Inizia il Loop */ ?>
<?php while ( have_posts() ) : the_post(); ?>
<?php
/* Includi il template specifico per il Post-Format.
* Se vuoi sovrascriverlo in un child theme, includi un file
* chiamato content-___.php (dove ___ è il nome del Post Format) e verrà usato quello.
*/
echo wp_trim_words( get_the_content(), $num_words = 50, $more = '...' );
echo '<a href="'.get_the_permalink().'">Leggi tutto</a>';
?>
<?php endwhile; ?>
<?php
the_posts_pagination( array(
'prev_text' => __( 'Pagina precedente', 'toivo-lite' ),
'next_text' => __( 'Pagina successiva', 'toivo-lite' ),
'before_page_number' => '<span class="meta-nav screen-reader-text">' . __( 'Pagina', 'toivo-lite' ) . ' </span>',
) );
?>
<?php else : ?>
<?php get_template_part( 'content', 'none' ); ?>
<?php endif; ?>
<?php do_action( 'toivo_after_loop' ); // Hook azione dopo il loop. ?>
<?php get_footer(); ?>
Ho sostituito:
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 = '...' );
Qualcuno potrebbe dirmi che questo è l'approccio sbagliato, ma potrebbe esserti utile. Mostrerà le prime 50 parole del contenuto con un "..." alla fine.

Per favore clicca il link modifica
sotto la tua risposta per aggiungere più informazioni su dove puoi metterlo, insieme a qualsiasi formattazione del codice necessaria.
