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"


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


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.


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.


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



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

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

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

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

Harap edit jawaban Anda , dan tambahkan penjelasan: mengapa itu bisa menyelesaikan masalah?
fuxia
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.