Come utilizzare the_excerpt al posto di the_content in WordPress
Breve e conciso — volevo mostrare l'excerpt di un post al posto di the_content
in alcune pagine. Naturalmente, se non è presente un excerpt, questo dovrebbe essere generato dal contenuto. Capisco che potrei modificare direttamente i file del tema, ma preferirei un metodo meno invasivo.
Vedendo che qualcosa come il seguente funziona:
add_action( 'the_content', 'myFunc' );
function myFunc ( $content ) {
the_title();
}
Ho pensato di provare questo
add_action( 'the_content', 'myFunc' );
function myFunc ( $content ) {
the_excerpt();
}
Questo. Fallisce. Gloriosamente. Risulta in un errore fatale, infatti:
ERRORE FATALE: RAGGIUNTO IL LIVELLO MASSIMO DI NIDIFICAZIONE DI FUNZIONI '100', INTERRUZIONE! IN C:\WAMP\WWW\WORDPRESS\WP-INCLUDES\POST.PHP ALLA RIGA 555
Seguono una serie impressionante di chiamate ricorsive nello stack, che sembrano aver scatenato un frenetico ciclo di chiamate.
Invertendo le Carte
Questo mi ha incuriosito, e ho provato l'opposto. Mostrare the_content
al posto di the_excerpt
:
add_action( 'the_excerpt', 'myFunc' );
function myFunc ( $content ) {
the_content();
}
Con mia sorpresa, questo ha funzionato perfettamente. Quindi quello che ho capito è che the_excerpt
chiama the_content
, ma the_content
non chiama the_excerpt
- questo spiegherebbe perché funziona in un verso ma non nell'altro, causando una ricorsione infinita.
Non essendo molto familiare con il funzionamento interno di queste due funzioni, ero curioso di sapere cosa la comunità potesse offrire in termini di spiegazioni. Qual è il problema nell'agganciarsi a the_content
e chiamare the_excerpt
?
Come posso ottenere questo effetto senza chiamare direttamente the_content
? Capisco che potrei implementare una logica personalizzata per l'excerpt, ma questo denormalizzerebbe la logica degli excerpt nel mio sito, avendo alcuni excerpt creati tramite codice personalizzato in functions.php e altri creati con i metodi interni di WordPress - idealmente, vorrei evitare questo e usare solo i metodi interni se possibile.

Tutti buoni esempi. Ma non funzionavano per me con il tema (pinboard) e il plugin che stavo usando (secondary-html-content) e ciò che volevo fare.
La prima sfida era assicurarmi di ottenere entrambi i contenuti invece di uno solo. La seconda sfida era sostituire l'estratto nella homepage con il contenuto effettivo.
Quindi ho creato un nuovo plugin che fa questo:
function okmAddingContentExcerpt() {
global $post;
$content = '<div class="comment-first">'.$post->post_content.'</div>';
// Adia Review è il nome dell'etichetta 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>';
// rimuove il filtro per evitare che venga eseguito ripetutamente
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');
Nota come ho voluto mantenere il contenuto invece dell'estratto nella pagina principale.
Ah sì, se vuoi scaricare il plugin, l'ho aggiunto al mio blog: http://okmaya.com/wordpress-plugin-for-pinboard-theme-and-secondary-html-content-plugin/

In realtà, the_excerpt()
chiama get_the_excerpt()
, che restituisce $post->post_excerpt
.
Una cosa, inoltre: non dovresti usare add_filter()
invece di add_action()
?
Perché stai usando the_excerpt()
/the_content()
/the_title()
, invece di impostare $content
= get_the_excerpt()
ecc., e poi restituire $content
? Ad esempio questo:
add_filter( 'the_content', 'myFunc' );
function myFunc ( $content ) {
the_excerpt();
}
...sarebbe normalmente scritto così:
add_filter( 'the_content', 'myFunc' );
function myFunc ( $content ) {
$content = get_the_excerpt();
return $content;
}
Non sono sicuro che tutto questo risolva il tuo problema del loop ricorsivo...
MODIFICA
Il tuo ultimo commento mi ha dato un'idea: perché non passare semplicemente $content attraverso wp_trim_excerpt()
e finirla qui?
add_filter( 'the_content', 'myFunc' );
function myFunc( $content ) {
$excerpt = wp_trim_excerpt( $content );
return $excerpt;
}
MODIFICA 2
Ok, ora ti seguo. Che ne dici di creare la nostra funzione di excerpt?
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;
}

Non intendevo che the_excerpt
chiama direttamente the_content
, scusa per la confusione. the_excerpt
chiama wp_trim_excerpt
che a sua volta chiama get_the_content
. Onestamente non sono sicuro di dove stia succedendo il problema. Purtroppo gli altri suggerimenti nella tua risposta non hanno aiutato. Sia che usassi add_action
o add_filter
, non ha fatto differenza in questo caso. Ho anche iniziato a restituire i valori invece di visualizzarli implicitamente con le funzioni the_
- ancora nessun miglioramento.

Mi sono appena reso conto di aver dimenticato un'informazione importante. Non ci sono estratti - gli estratti dovrebbero essere generati dal contenuto. Quindi qualcosa come global $post; return $post->post_excerpt;
funzionerebbe, ma sarebbe vuoto.

In realtà l'ho già provato. Stranamente restituisce solo un contenuto formattato - nessun limite di caratteri come ci si aspetterebbe.

wp_trim_excerpt()
chiama $text = apply_filters('the_content', $text);
che è la causa delle chiamate ricorsive. Forse prova a estrarre il codice da wp_trim_excerpt()
da /wp-includes/formatting.php linea 1830, lasciando da parte la riga sopra - anche se non ho idea di quanto sia essenziale questa riga per gli estratti.

Okay, vedi Modifica #2; proviamo a creare la nostra funzione per troncare gli estratti.
