Cum să afișezi the_excerpt în loc de the_content în WordPress?
Scurt și la obiect — am vrut să afișez rezumatul unui articol în loc de the_content
pe anumite pagini. Desigur, dacă nu există un rezumat definit, acesta ar trebui generat din conținut. Înțeleg că pot să modific direct fișierele temei, dar aș prefera o metodă mai puțin invazivă.
Văzând că ceva de genul următor funcționează:
add_action( 'the_content', 'myFunc' );
function myFunc ( $content ) {
the_title();
}
Am încercat următorul cod:
add_action( 'the_content', 'myFunc' );
function myFunc ( $content ) {
the_excerpt();
}
Acest cod eșuează spectaculos. Rezultă într-o eroare fatală:
EROARE FATALĂ: NIVELUL MAXIM DE RECURSIVITATE '100' A FOST ATINS, OPRIRE! ÎN C:\WAMP\WWW\WORDPRESS\WP-INCLUDES\POST.PHP PE LINIA 555
Urmează un masiv stack trace, care pare a fi intrat într-o buclă infinită de apeluri recursive.
Inversând situația
Astfel am devenit curios și am încercat opusul. Să afișez the_content
în loc de the_excerpt
:
add_action( 'the_excerpt', 'myFunc' );
function myFunc ( $content ) {
the_content();
}
Spre surpriza mea, acesta a funcționat perfect. Deduc că the_excerpt
apelează the_content
, dar the_content
nu apelează the_excerpt
- acest lucru ar explica de ce funcționează într-un sens dar nu și în celălalt, unde se declanșează recursivitatea.
Neavând cunoștințe profunde despre funcționarea internă a acestor funcții, eram curios ce părere are comunitatea. Care este problema cu hook-ul în the_content
care apelează the_excerpt
?
Cum pot realiza acest efect fără să apelez direct the_content
? Înțeleg că aș putea folosi o logică custom pentru rezumat, dar asta ar denormaliza logica rezumatelor pe site-ul meu, adică unele rezumate ar fi create prin cod custom în functions.php, iar altele prin metodele interne WordPress - ideal, aș evita acest lucru și aș folosi doar metodele interne dacă este posibil.

Toate exemplele sunt bune. Dar nu au funcționat pentru mine cu tema (pinboard) și plugin-ul pe care le foloseam (secondary-html-content) și cu ceea ce voiam să fac.
Prima provocare a fost să mă asigur că primesc ambele părți de conținut în loc de doar una. A doua provocare a fost să înlocuiesc rezumatul de pe pagina principală cu conținutul real.
Așa că am creat un nou plugin care face asta:
function okmAddingContentExcerpt() {
global $post;
$content = '<div class="comment-first">'.$post->post_content.'</div>';
// Adia Review este numele etichetei din plugin-ul 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>';
// elimină filtrul pentru a evita bucla infinită
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ți cum am vrut să păstrez conținutul în loc de rezumat pe pagina principală.
A, da, dacă vreți să descărcați plugin-ul, l-am adăugat pe blogul meu: http://okmaya.com/wordpress-plugin-for-pinboard-theme-and-secondary-html-content-plugin/

De fapt, the_excerpt()
apelează get_the_excerpt()
, care afișează $post->post_excerpt
.
Încă ceva: nu ar trebui să folosești add_filter()
în loc de add_action()
?
De ce folosești the_excerpt()
/the_content()
/the_title()
, în loc să setezi $content
= get_the_excerpt()
etc., și apoi să returnezi $content
? De exemplu, acest cod:
add_filter( 'the_content', 'myFunc' );
function myFunc ( $content ) {
the_excerpt();
}
...ar fi scris normal astfel:
add_filter( 'the_content', 'myFunc' );
function myFunc ( $content ) {
$content = get_the_excerpt();
return $content;
}
Nu sunt sigur dacă oricare dintre acestea va rezolva problema ta cu bucla recursivă...
EDITARE
Ultimul tău comentariu mi-a dat o idee: de ce să nu treci pur și simplu $content prin wp_trim_excerpt()
și să termini cu asta?
add_filter( 'the_content', 'myFunc' );
function myFunc( $content ) {
$excerpt = wp_trim_excerpt( $content );
return $excerpt;
}
EDITARE 2
Bine, acum te înțeleg. Ce zici să creăm propria noastră funcție de 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;
}

Nu m-am referit la faptul că the_excerpt
apelează direct the_content
, îmi cer scuze pentru confuzie. the_excerpt
apelează wp_trim_excerpt
care la rândul său apelează get_the_content
. Sincer să fiu, nu știu unde se încurcă lucrurile. Celelalte sugestii din răspunsul tău nu au ajutat, din păcate. Indiferent dacă folosesc add_action
sau add_filter
, nu a făcut nicio diferență în acest caz. De asemenea, am trecut la returnarea valorilor în loc să le afișez implicit cu funcțiile the_
- tot fără îmbunătățire.

Tocmai mi-am dat seama că am uitat un detaliu important. Nu există rezumate - rezumatele ar trebui generate din conținut. Așadar, ceva de genul global $post; return $post->post_excerpt;
ar funcționa, dar ar fi gol.

Am încercat și asta, de fapt. Destul de ciudat, returnează doar conținut formatat - fără limită de caractere așa cum era de așteptat.

wp_trim_excerpt()
apelează $text = apply_filters('the_content', $text);
care este cauza apelurilor recursive. poate încercați să extrageți codul din wp_trim_excerpt()
din /wp-includes/formatting.php linia 1830, lăsând linia de mai sus - deși nu am idee cât de esențială este această linie pentru rezumate.

Bine, vezi Edit #2; hai să încercăm să creăm propria noastră funcție de tăiere a rezumatului.
