Cum să afișezi the_excerpt în loc de the_content în WordPress?

12 iul. 2011, 18:55:38
Vizualizări: 3.23K
Voturi: 0

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.

0
Toate răspunsurile la întrebare 2
0

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/

7 feb. 2013 19:45:36
7

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(']]>', ']]&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 iul. 2011 19:14:37
Comentarii

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.

Sampson Sampson
12 iul. 2011 19:26:38

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.

Sampson Sampson
12 iul. 2011 19:45:35

Hmm... bine, vezi răspunsul actualizat pentru o altă idee.

Chip Bennett Chip Bennett
12 iul. 2011 20:11:46

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.

Sampson Sampson
12 iul. 2011 20:17:21

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.

Michael Michael
12 iul. 2011 20:24:26

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

Chip Bennett Chip Bennett
12 iul. 2011 20:33:10

@Chip Aș putea cu siguranță să scriu propria mea logică, dar atunci aș începe să fragmentez logica fragmentelor pe tot site-ul. Adică, dacă nu ofer o rescriere globală pentru toate fragmentele, și nu doar pentru cele furnizate în locul the_content.

Sampson Sampson
12 iul. 2011 20:42:57
Arată celelalte 2 comentarii