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”


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));


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.


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.


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



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;
}

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;
}

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);

-1
$trimexcerpt = get_the_content();
$shortexcerpt = wp_trim_words( $trimexcerpt, $num_words = 18, $more = '… ' ); 
echo $shortexcerpt;

Proszę edytować swoje odpowiedzi i dodać wyjaśnienie: dlaczego to może rozwiązać problem?
fuxia
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.