Holen Sie sich einen Auszug mit get_the_excerpt außerhalb einer Schleife


31

Ich habe einen Code, der aufruft get_the_title()und es funktioniert, aber get_the_excerpt()leer zurück. Wie kann ich es zum Laufen bringen?

Dieser Code befindet sich in einem Plugin namens "WP Facebook Open Graph-Protokoll". Hier ist der Teil, den ich ändern möchte:

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

Hier has_excerptimmer scheitern und get_the_excerpt($post->ID)nicht mehr funktionieren (veraltet).

Wie kann ich den Auszug dort anzeigen?

ps: Ich benutze auch das "Advanced Excerpt" -Plugin


ok, habe es mit my_excerpt($post->post_content, get_the_excerpt())und mit der my_excerpt()Funktion von wordpress.stackexchange.com/questions/6961/…
Ariel

3
Bitte geben Sie die Lösung an, die Sie als Antwort gefunden haben, damit diese Website nicht als unbeantwortete Frage erscheint. :)
Rarst

Verwenden the_post()Sie einfach die Funktion (sie funktioniert auch für einzelne Post-Templates), bevor Sie sie aufrufen get_the_excerpt(), um die erforderlichen Daten für Sie einzurichten.
Sisir

Antworten:


29

Ich habe diese Frage gefunden, als ich nach einer Möglichkeit gesucht habe, ohne das Post-Objekt zu verwenden.

Meine zusätzliche Recherche ergab diese Technik:

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


1
Dies sollte als Antwort akzeptiert werden, da dies der empfohlene Weg ist, Daten aus der Schleife zu ziehen. Erfordert auch keine benutzerdefinierte Funktion oder das Überschreiben der $postglobalen Variablen.
MacK,

4
Es wird eine leere Zeichenfolge zurückgegeben.
Kyaw Tun

1
@KyawTun - es funktioniert, solange festgelegt $post_idist (was ist der Wert von $post_id? AND $post_idist eine gültige, legitime Beitrags-ID.
cale_b

2
@cale_b Danke. Ich benutze get_posts query und erhalte die ID aus dem resultierenden Array. Das Post-Objekt hat post_title, post_content, ID usw., funktioniert aber nicht.
Kyaw Tun

Wenn Sie NUR das TEXT-Tag und nicht das <p> -Tag benötigen, das im Filter_excerpt enthalten ist, verwenden Sie den Filter "get_the_excerpt", sodass der obige Filter wie folgt lautet: $ text = apply_filters ('get_the_excerpt', get_post_field ('post_excerpt', $ post_id) ); Dadurch erhalten Sie nur den RAW-Text, den Sie an einer beliebigen Stelle in Ihr eigenes Markup einfügen können.
Mohsin

22

Da Sie anscheinend bereits über das Post-Objekt verfügen, für das Sie den Auszug benötigen, können Sie die Arbeit erzwingen:

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

Die setup_postdata()Funktion globalisiert das $postObjekt und stellt es für die reguläre alte Schleifenfunktion zur Verfügung. Wenn Sie sich innerhalb der Schleife befinden, rufen Sie an the_post()und es richtet die Dinge für Sie ein. Außerhalb der Schleife müssen Sie sie manuell erzwingen.


1
Das funktioniert aber: "Sie müssen einen Verweis auf die globale $postVariable übergeben, sonst funktionieren Funktionen wie the_title()nicht richtig." global $post;$post = $post_object;setup_postdata( $post );$excerpt = get_the_excerpt();
Dienstag,

setup_postdata($post);FTW !!!!
Squarecandy

18

Versuche dies:

Erstelle eine neue Funktion in functions.php und rufe sie von überall auf.

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

Hier ist ein Beitrag, der den Code beschreibt.


1
Hervorragend finde meinen Freund. Ich habe nie verstanden, warum WordPress eine so wichtige Funktion verworfen hätte. Das baut es effektiv von Grund auf neu auf, aber es funktioniert. Angesichts der Häufigkeit, mit der wir den Auszug außerhalb des Regelkreises mit Funktionen wie Social-Sharing-Plugins verwenden, dürfte er ein Teil des Kerns geblieben sein.
Imperative Ideas

1
Die Antwort von EAMann ist ein viel besserer Ansatz für dieses Problem, und dies sollte als die beste Vorgehensweise angesehen werden. Dieser Ansatz dupliziert im Grunde genommen Core-Interna, anstatt die API zu verwenden.
Ian Dunn

9

Jetzt können Sie einfach die get_the_excerpt( $postID )Funktion nutzen. Seit: WordPress 4.5.0 hat den $postParameter eingeführt.


1
Dies sollte eine neue akzeptierte Antwort sein, da wir uns in der Ära von WP 4.5 + befinden.
Matija Mrkaic

18
Dies funktioniert nicht, wenn der Auszug leer ist, da der wp_trim_excerptFilter den Auszug für den aktuellen Beitrag zurückgibt.
Dylan

9
Siehe core.trac.wordpress.org/ticket/36934 für Details zu dem, was @Dylan sagte
Kraftner


1

Falls Sie das Post-Objekt nicht haben, finden Sie hier eine kurze Funktion wie die von Withers.

function get_excerpt_by_id($post_id){
    $the_post = get_post($post_id);
    $the_excerpt = $the_post->post_excerpt; 
    return $the_excerpt;
}

Aber der Fragesteller hat ein Beitragsobjekt wie in der Frage angegeben.
fuxia

3
Korrigieren Sie mich, wenn ich falsch liege. Diese Methode gibt den manuellen Auszug zurück, generiert aber bei Bedarf keinen
Bill

1

Dies ist für den Fall, dass Sie get_the_excerpt()außerhalb der Schleife verwenden möchten :

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

Dies ist der direkteste Weg, dies zu tun. Ich bin mir nicht sicher, ob es in Bezug auf die Leistung großartig ist. Sie erhalten immer noch meine +1
Rechnung

1

Wenn Sie den Auszug automatisch aus dem Inhalt in einer Zeile generieren möchten, können Sie die folgende wp_trim_wordsFunktion verwenden:

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

Bitte bearbeiten Sie Ihre Antwort und fügen Sie eine Erklärung hinzu: Warum könnte dies das Problem lösen?
fuxia
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.