Folosirea wp_trim_excerpt pentru a obține the_excerpt() în afara buclei
Construiesc o temă care va afișa extrase pe pagina principală pentru potențial zeci de postări. Nu am extrase manuale pentru toate postările mele, așa că $post->post_excerpt
este gol pentru multe postări. În cazul în care nu există un extras manual, aș dori să folosesc funcția încorporată get_the_excerpt(), dar aceasta nu este disponibilă în afara buclei.
Urmărind funcția, se pare că folosește wp_trim_excerpt din wp-includes/formatting.php pentru a crea extrase în timp real. O apelez în codul meu astfel wp_trim_excerpt( $item->post_content )
, dar aceasta returnează doar conținutul complet. Fac ceva greșit?
Știu că pot crea propria mea funcție pentru a genera un extras, dar prefer să folosesc funcții încorporate acolo unde este posibil, păstrând codul meu compatibil cu alte potențiale plugin-uri / filtre.
http://adambrown.info/p/wp_hooks/hook/wp_trim_excerpt?version=3.0&file=wp-includes/formatting.php

Începând cu WP 3.3.0, funcția wp_trim_words()
este utilă dacă doriți să obțineți conținutul pentru care trebuie să generați un rezumat. Sper că acest lucru este util cuiva și că vă salvează de la crearea unei funcții proprii pentru numărarea cuvintelor.

wp_trim_excerpt()
are o mică particularitate - dacă i se transmite orice, nu face nimic.
Iată logica de bază din spatele acesteia:
get_the_excerpt()
verifică dacă există un fragment manual;wp_trim_excerpt()
intervine dacă nu există un fragment manual și creează unul din conținutul articolului sau din textul de prezentare.
Ambele funcții sunt strâns legate de variabilele globale și, prin urmare, de Loop.
În afara Loop-ului, este mai bine să extragi codul din wp_trim_excerpt()
și să îți scrii propria funcție de tăiere.

Actualizare:
Iată o variantă derivată din wp_trim_excerpt() pe care am folosit-o. Funcționează perfect. Derivă din versiunea Wordpress 3.0.4
function my_excerpt($text, $excerpt)
{
if ($excerpt) return $excerpt;
$text = strip_shortcodes( $text );
$text = apply_filters('the_content', $text);
$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 apply_filters('wp_trim_excerpt', $text, $raw_excerpt);
}

Nu este nevoie să postezi un nou răspuns, poți oricând să editezi cel vechi pentru a include informații noi. De exemplu, ai putea copia linkul către codul WP din primul tău răspuns în acesta și apoi să ștergi primul răspuns.

Iată versiunea mea a unei funcții "trim_excerpt" care acceptă ca parametru fie obiectul post, fie un ID de post.
Evident, inspirată din ceea ce există în nucleul WordPress. Nu știu de ce această funcție (și get_the_author()) nu au echivalente care să funcționeze în afara buclei.
/**
* Generează un fragment din conținut, dacă este necesar.
*
* @param int|object $post_or_id poate fi ID-ul postului sau obiectul $post în sine
* @param string $excerpt_more textul care este adăugat la sfârșitul fragmentului dacă acesta este generat algoritmic
* @return string fragmentul generat sau fragmentul manual dacă acesta există
*/
function zg_trim_excerpt($post_or_id, $excerpt_more = ' [...]') {
if ( is_object( $post_or_id ) ) $postObj = $post_or_id;
else $postObj = get_post($post_or_id);
$raw_excerpt = $text = $postObj->post_excerpt;
if ( '' == $text ) {
$text = $postObj->post_content;
$text = strip_shortcodes( $text );
$text = apply_filters('the_content', $text);
$text = str_replace(']]>', ']]>', $text);
$text = strip_tags($text);
$excerpt_length = apply_filters('excerpt_length', 55);
// nu presupune automat că vom folosi link-ul global "read more" oferit de temă
// $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 apply_filters('wp_trim_excerpt', $text, $raw_excerpt);
}

+1 pentru Rast. Este foarte ciudat că nu există o funcție precum get_the_excerpt($post->ID), când ar fi destul de evident că ar trebui să existe. Oricum, iată funcția wp_trim_excerpt() din WordPress versiunea 3.0.4:
http://core.trac.wordpress.org/browser/tags/3.0.4/wp-includes/formatting.php
function wp_trim_excerpt($text) {
1824 $raw_excerpt = $text;
1825 if ( '' == $text ) {
1826 $text = get_the_content('');
1827
1828 $text = strip_shortcodes( $text );
1829
1830 $text = apply_filters('the_content', $text);
1831 $text = str_replace(']]>', ']]>', $text);
1832 $text = strip_tags($text);
1833 $excerpt_length = apply_filters('excerpt_length', 55);
1834 $excerpt_more = apply_filters('excerpt_more', ' ' . '[...]');
1835 $words = preg_split("/[\n\r\t ]+/", $text, $excerpt_length + 1, PREG_SPLIT_NO_EMPTY);
1836 if ( count($words) > $excerpt_length ) {
1837 array_pop($words);
1838 $text = implode(' ', $words);
1839 $text = $text . $excerpt_more;
1840 } else {
1841 $text = implode(' ', $words);
1842 }
1843 }
1844 return apply_filters('wp_trim_excerpt', $text, $raw_excerpt);
1845 }
Puteți vedea pe linia 1826 că este legată de variabila globală $post prin intermediul funcției get_the_contents. Și da, nu am nicio idee la ce se gândeau. Dar de aici, înlocuiți get_the_content cu $text în propria funcție my_excerpt, și ar trebui să se comporte într-un mod similar.

Funcția get_the_content() va returna întregul conținut dacă $more != 0. Trebuie să setezi variabila globală $more la 0 pentru a te asigura că funcția get_the_content() returnează rezumatul.
Funcția modificată wp_trim_excerpt():
function wp_trim_excerpt($text) {
$raw_excerpt = $text;
if ( '' == $text ) {
global $more;
$tmp = $more;
$more = 0;
$text = get_the_content('');
$more = $tmp;
$text = strip_shortcodes( $text );
$text = apply_filters('the_content', $text);
$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 apply_filters('wp_trim_excerpt', $text, $raw_excerpt);
}

Folosind răspunsurile anterioare, iată o soluție mai simplă care funcționează eficient:
global $post;
$excerpt = apply_filters('get_the_excerpt', get_post_field('post_excerpt', $post->ID));
if ( $excerpt == '' ) {
$excerpt = wp_trim_words( $post->post_content, 55 );
}
O folosesc în tag-urile <meta>
dintr-o funcție pentru a defini descrierile OpenGraph. Apoi, pur și simplu adaug:
<meta property="og:description" content="<?php echo esc_html( $excerpt ); ?>" />
