Uzyskaj fragment, używając get_the_excerpt poza pętlą

31

Mam kod, który wywołuje get_the_title()i działa, ale get_the_excerpt()zwraca pusty. Jak mogę to zrobić?

Ten kod znajduje się we wtyczce o nazwie „WP Facebook Open Graph protokół”. Oto część, którą chcę zmienić:

if (is_singular('post')) {
  if (has_excerpt($post->ID)) {
    echo "\t<meta property='og:description' content='".esc_attr(strip_tags(get_the_excerpt($post->ID)))."' />\n";
  }else{
    echo "\t<meta property='og:description' content='". [?] ."' />\n";
  }
}else{
  echo "\t<meta property='og:description' content='".get_bloginfo('description')."' />\n";
}

Tutaj has_excerptzawsze zawodzą i get_the_excerpt($post->ID)nie działają już (przestarzałe).

Jak mogę wyświetlić tam fragment?

ps: Używam również wtyczki „Advanced Excerpt”

ariel
źródło
ok, rozumiem, używając my_excerpt($post->post_content, get_the_excerpt())i korzystając z my_excerpt()funkcji z wordpress.stackexchange.com/questions/6961/...
ariel
3
Dodaj rozwiązanie, które wymyśliłeś jako odpowiedź, aby nie prześladowało witryny jako pytanie bez odpowiedzi. :)
Rarst
Wystarczy użyć the_post()(działa również na szablonie pojedynczego postu) funkcji, zanim zadzwonisz get_the_excerpt(), aby skonfigurować niezbędne dane dla Ciebie.
Sisir

Odpowiedzi:

29

Znalazłem to pytanie, patrząc, jak to zrobić bez obiektu postu.

Moje dodatkowe badania ujawniły tę zręczną technikę:

$text = apply_filters('the_excerpt', get_post_field('post_excerpt', $post_id));

cale_b
źródło
1
Należy to zaakceptować jako odpowiedź, ponieważ jest to zalecany sposób wyciągania danych poza pętlę. Nie wymaga też żadnej niestandardowej funkcji ani zastępowania $postzmiennej globalnej.
MacK
4
zwraca pusty ciąg.
Kyaw Tun
1
@KyawTun - działa, dopóki $post_idjest ustawiony (jaka jest wartość $post_id? ORAZ $post_idjest prawidłowym, prawidłowym identyfikatorem posta.
cale_b 20.01.2016
2
@cale_b Dzięki. Używam zapytania get_posts i uzyskuję identyfikator z wynikowej tablicy. Obiekt post ma post_title, post_content, ID itp. Ale nie działa.
Kyaw Tun
Jeśli potrzebujesz TYLKO TEKSTU, a nie znacznika <p>, który jest zawarty w filtrze_excerpt, użyj filtra „get_the_excerpt”, aby powyższy filtr stał się: $ text = Apply_filters ('get_the_excerpt', get_post_field ('post_excerpt', $ post_id) ); da ci to tylko tekst RAW, który możesz wstawić w dowolnym miejscu własnego znacznika.
Mohsin,
22

Ponieważ wydaje się, że masz już obiekt postu, do którego potrzebujesz fragmentu, możesz po prostu zmusić rzeczy do działania:

setup_postdata( $post );
$excerpt = get_the_excerpt();

setup_postdata()Funkcja globalizacji ten $postobiekt i udostępnić go dla zwykłej funkcji starej pętli. Gdy jesteś w pętli, dzwonisz, the_post()a ona konfiguruje wszystko dla ciebie ... poza pętlą musisz wymusić to ręcznie.

EAMann
źródło
1
Działa to, ale: „Musisz przekazać odwołanie do $postzmiennej globalnej , w przeciwnym razie funkcje takie jak the_title()nie działają poprawnie”. global $post;$post = $post_object;setup_postdata( $post );$excerpt = get_the_excerpt();
dotrzeć
setup_postdata($post);FTW !!!!
squarecandy
18

Spróbuj tego:

Utwórz nową funkcję w functions.php, a następnie wywołaj ją z dowolnego miejsca.

function get_excerpt_by_id($post_id){
    $the_post = get_post($post_id); //Gets post ID
    $the_excerpt = $the_post->post_content; //Gets post_content to be used as a basis for the excerpt
    $excerpt_length = 35; //Sets excerpt length by word count
    $the_excerpt = strip_tags(strip_shortcodes($the_excerpt)); //Strips tags and images
    $words = explode(' ', $the_excerpt, $excerpt_length + 1);

    if(count($words) > $excerpt_length) :
        array_pop($words);
        array_push($words, '…');
        $the_excerpt = implode(' ', $words);
    endif;

    $the_excerpt = '<p>' . $the_excerpt . '</p>';

    return $the_excerpt;
}

Oto post opisujący kod.

Withers Davis
źródło
1
Świetnie znajdź mojego przyjaciela. Nigdy nie zrozumiałem, dlaczego WordPress przestałby tak krytyczną funkcję. To skutecznie odbudowuje go od zera, ale działa. Biorąc pod uwagę, jak często używamy fragmentu poza pętlą z funkcjami takimi jak wtyczki do udostępniania społecznościowego, prawdopodobnie powinien on pozostać częścią rdzenia.
Imperative Ideas
1
Odpowiedź EAManna jest znacznie lepszym podejściem do tego problemu i należy ją uznać za najlepszą praktykę. Podejście to polega zasadniczo na powielaniu elementów wewnętrznych Core zamiast używania interfejsu API.
Ian Dunn
9

Teraz możesz po prostu użyć get_the_excerpt( $postID )funkcji. Ponieważ: WordPress 4.5.0 wprowadził $postparametr.

doker
źródło
1
To powinna być nowa zaakceptowana odpowiedź, ponieważ jesteśmy w erze WP 4.5 +.
Matija Mrkaic,
18
To nie zadziała, jeśli fragment jest pusty, ponieważ wp_trim_excerptfiltr zwróci fragment bieżącego wpisu.
Dylan
9
Zobacz core.trac.wordpress.org/ticket/36934, aby uzyskać szczegółowe informacje na temat tego, co powiedział
@Dylan
5

mam go używając my_excerpt($post->post_content, get_the_excerpt())i korzystając z my_excerpt()funkcji Używając wp_trim_excerpt, aby uzyskać wyjście_excerpt () poza pętlę

ariel
źródło
2
Odpowiedzi tylko z linkiem nie są dobre. Skopiuj odpowiedni kod tutaj. Gdy ten link zostanie zerwany, strona zostanie wyłączona / zniknie, wówczas ta odpowiedź nie będzie miała żadnej wartości.
cale_b
Działa idealnie dla mnie!
Saikat
1

Jeśli nie masz obiektu post, oto krótka funkcja, taka jak ta z Withers.

function get_excerpt_by_id($post_id){
    $the_post = get_post($post_id);
    $the_excerpt = $the_post->post_excerpt; 
    return $the_excerpt;
}
OK Paprothead
źródło
Ale pytający ma przedmiot postu, jak podano w pytaniu.
fuxia
3
Popraw mnie, jeśli się mylę, ta metoda zwróci ręczny fragment, ale nie wygeneruje go w razie potrzeby
Bill
1

Dzieje się tak, gdy chcesz używać get_the_excerpt()poza pętlą:

function custom_get_excerpt($post_id) {
    $temp = $post;
    $post = get_post($post_id);
    setup_postdata($post);

    $excerpt = get_the_excerpt();

    wp_reset_postdata();
    $post = $temp;

    return $excerpt;
}
Gixty
źródło
Jest to najbardziej bezpośredni sposób, aby to zrobić. Nie jestem jednak pewien, czy jest to świetne pod względem wydajności. Nadal dostajesz moje +1
Bill
1

Jeśli chcesz automatycznie wygenerować fragment z treści w jednym wierszu - możesz użyć wp_trim_wordsfunkcji takiej jak ta:

// 30 is the number of words ehere
$excerpt = wp_trim_words(get_post_field('post_content', $post_id), 30);
Picard
źródło
-1
$trimexcerpt = get_the_content();
$shortexcerpt = wp_trim_words( $trimexcerpt, $num_words = 18, $more = '… ' ); 
echo $shortexcerpt;
Rinzler
źródło
Proszę edytować swoje odpowiedzi i dodać wyjaśnienie: dlaczego to może rozwiązać problem?
fuxia