Dapatkan kutipan menggunakan get_the_excerpt di luar loop

31

Saya memiliki kode yang memanggil get_the_title()dan berfungsi, tetapi get_the_excerpt()kembali kosong. Bagaimana saya bisa membuatnya bekerja?

Kode ini ada di dalam plugin yang disebut "WP Facebook Open Graph protocol". Inilah bagian yang ingin saya ubah:

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

Di sini, has_excerptselalu gagal, dan get_the_excerpt($post->ID)tidak berfungsi lagi (usang).

Jadi, bagaimana saya bisa menampilkan kutipan di sana?

ps: Saya juga menggunakan plugin "Kutipan Lanjutan"

ariel
sumber
ok, dapatkan itu menggunakan my_excerpt($post->post_content, get_the_excerpt())dan menggunakan my_excerpt()fungsi dari wordpress.stackexchange.com/questions/6961/…
ariel
3
Harap tambahkan solusi yang Anda buat sebagai jawaban, jadi ini tidak menghantui situs sebagai pertanyaan yang tidak terjawab. :)
Rarst
Cukup gunakan the_post()(berfungsi pada templat posting tunggal juga) sebelum Anda memanggilnya get_the_excerpt()akan mengatur data yang diperlukan untuk Anda.
Sisir

Jawaban:

29

Saya menemukan pertanyaan ini ketika mencari cara melakukan ini tanpa objek posting.

Penelitian tambahan saya menemukan teknik apik ini:

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

cale_b
sumber
1
Ini harus diterima sebagai jawaban karena ini adalah cara yang disarankan untuk menarik data di luar loop. Juga tidak memerlukan fungsi khusus atau pengesampingan $postvariabel global.
MacK
4
mengembalikan string kosong.
Kyaw Tun
1
@KyawTun - berfungsi, selama $post_iddiatur (berapakah nilainya $post_id? DAN $post_idadalah ID kiriman yang sah dan sah.
cale_b
2
@cale_b Terima kasih. Saya menggunakan permintaan get_posts dan mendapatkan ID dari array yang dihasilkan. Objek posting memang memiliki post_title, post_content, ID, dll. Tetapi tidak berfungsi.
Kyaw Tun
Jika Anda perlu HANYA TEKS dan bukan tag <p> yang disertakan dengan filter the_excerpt, kemudian gunakan filter "get_the_excerpt", sehingga filter di atas menjadi: $ text = apply_filters ('get_the_excerpt', get_post_field ('post_excerpt', $ post_id), ); ini akan memberi Anda hanya teks RAW yang dapat Anda masukkan di mana saja di markup Anda sendiri.
Mohsin
22

Karena tampaknya Anda sudah memiliki objek posting yang Anda butuhkan kutipannya, Anda bisa memaksanya bekerja:

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

The setup_postdata()fungsi akan globalisasi yang $postobjek dan membuatnya tersedia untuk fungsi loop tua biasa. Saat Anda berada di dalam loop, Anda menelepon the_post()dan mengatur semuanya untuk Anda ... di luar loop yang Anda butuhkan untuk memaksanya secara manual.

EAMann
sumber
1
Ini berfungsi tetapi: "Anda harus memberikan referensi ke $postvariabel global , jika tidak, fungsi-fungsi seperti the_title()tidak berfungsi dengan baik." global $post;$post = $post_object;setup_postdata( $post );$excerpt = get_the_excerpt();
Deach
setup_postdata($post);FTW !!!!
squarecandy
18

Coba ini:

Buat fungsi baru di functions.php dan kemudian panggil dari mana saja.

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

Berikut adalah pos yang menjelaskan kode.

Withers Davis
sumber
1
Sangat baik menemukan teman saya. Saya tidak pernah mengerti mengapa WordPress akan meninggalkan fungsi kritis seperti itu. Ini secara efektif membangunnya kembali dari awal, tetapi berhasil. Mengingat seberapa sering kita menggunakan kutipan di luar loop dengan fitur-fitur seperti plugin berbagi sosial, mungkin seharusnya tetap menjadi bagian dari inti.
Ide Imperatif
1
Jawaban EAMann adalah pendekatan yang jauh lebih baik untuk masalah ini, dan harus dianggap praktik terbaik. Pendekatan ini pada dasarnya menduplikasi internal Core daripada menggunakan API.
Ian Dunn
9

Sekarang Anda cukup menggunakan get_the_excerpt( $postID )fungsinya. Sejak: WordPress 4.5.0 memperkenalkan $postparameter.

buruh pelabuhan
sumber
1
Ini harus menjadi jawaban yang diterima baru karena kita berada di era WP 4.5+.
Matija Mrkaic
18
Ini tidak akan berfungsi jika kutipan kosong karena wp_trim_excerptfilter akan mengembalikan kutipan untuk posting saat ini.
Dylan
9
Lihat core.trac.wordpress.org/ticket/36934 untuk perincian tentang apa yang dikatakan
@Dylan
5

mendapatkannya menggunakan my_excerpt($post->post_content, get_the_excerpt())dan menggunakan my_excerpt()fungsi dari Menggunakan wp_trim_excerpt untuk mendapatkan the_excerpt () di luar loop

ariel
sumber
2
Jawaban khusus tautan tidak bagus. Salin kode yang relevan di sini. Ketika tautan itu rusak, situs itu rusak / hilang, maka jawaban ini tidak memiliki nilai.
cale_b
Ini bekerja dengan baik untuk saya!
Saikat
1

Jika Anda tidak memiliki objek posting, berikut ini adalah fungsi pendek seperti dari Withers.

function get_excerpt_by_id($post_id){
    $the_post = get_post($post_id);
    $the_excerpt = $the_post->post_excerpt; 
    return $the_excerpt;
}
OKParrothead
sumber
Tetapi penanya memiliki objek posting seperti yang dinyatakan dalam pertanyaan.
fuxia
3
Perbaiki saya jika saya salah, metode ini akan mengembalikan kutipan manual tetapi tidak akan menghasilkan satu jika diperlukan
Bill
1

Ini untuk saat Anda ingin menggunakan di get_the_excerpt()luar loop:

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
sumber
Ini adalah cara paling langsung untuk melakukannya .. Namun tidak yakin itu adalah kinerja yang hebat. Anda masih mendapatkan +1 saya
Tagihan
1

Jika Anda ingin membuat kutipan secara otomatis dari konten dalam satu baris - Anda dapat menggunakan wp_trim_wordsfungsi seperti ini:

// 30 is the number of words ehere
$excerpt = wp_trim_words(get_post_field('post_content', $post_id), 30);
Picard
sumber
-1
$trimexcerpt = get_the_content();
$shortexcerpt = wp_trim_words( $trimexcerpt, $num_words = 18, $more = '… ' ); 
echo $shortexcerpt;
Rinzler
sumber
Harap edit jawaban Anda , dan tambahkan penjelasan: mengapa itu bisa menyelesaikan masalah?
fuxia