Come utilizzare the_excerpt al posto di the_content in WordPress

12 lug 2011, 18:55:38
Visualizzazioni: 3.23K
Voti: 0

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.

0
Tutte le risposte alla domanda 2
0

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/

7 feb 2013 19:45:36
7

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(']]>', ']]&gt;', $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;
}
12 lug 2011 19:14:37
Commenti

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.

Sampson Sampson
12 lug 2011 19:26:38

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.

Sampson Sampson
12 lug 2011 19:45:35

Mmm... okay, vedi la risposta aggiornata per un'idea diversa.

Chip Bennett Chip Bennett
12 lug 2011 20:11:46

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

Sampson Sampson
12 lug 2011 20:17:21

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.

Michael Michael
12 lug 2011 20:24:26

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

Chip Bennett Chip Bennett
12 lug 2011 20:33:10

@Chip Potrei sicuramente scrivere la mia logica, tuttavia inizierei a frammentare la logica degli estratti in tutto il sito. Cioè, a meno che non fornisca una riscrittura globale per tutti gli estratti, e non solo per quelli forniti al posto di the_content.

Sampson Sampson
12 lug 2011 20:42:57
Mostra i restanti 2 commenti