apply_filters () dan the_excerpt memberikan hasil yang tidak terduga

10

Saya merasa seperti kehilangan sesuatu yang sangat jelas di sini, tapi sepertinya saya tidak bisa membuat WordPress bekerja sama.

Saya membuat tag OG Facebook dengan sebuah fungsi. Semuanya berfungsi dengan baik, kecuali untuk kutipannya.

Sejak penghentian get_the_excerpt($post->ID), apakah ada cara lain untuk membuat kutipan tanpa harus membuat loop baru? Rasanya berlebihan bagi saya.

Insting pertama saya adalah menggunakan apply_filters():

$description = apply_filters('the_excerpt', get_post($post->ID)->post_content);

Itu memberi saya posting lengkap, lengkap dengan konten berformat HTML. Oke, pasti salah. Jadi saya mencoba ide logis berikutnya:

$description = apply_filters('get_the_excerpt', get_post($post->ID)->post_content);

Tidak ada dadu. Sekarang tidak ada HTML, tetapi masih tulisan lengkap (yang benar-benar membingungkan).

Oke tidak masalah. Mari kita lewati semua barang mewah dan pergi untuk entri yang dipangkas:

$description = wp_trim_excerpt(get_post($post->ID)->post_content);

Tidak ada perubahan.

Jadi, pertanyaan saya adalah ini: apa yang sedang terjadi? Apakah ada sesuatu yang saya lewatkan, di sini?

Saya masuk ke inti WP untuk menemukan cara the_excerpt()kerjanya, dan tampaknya identik dengan panggilan saya:

/**
 * Display the post excerpt.
 *
 * @since 0.71
 * @uses apply_filters() Calls 'the_excerpt' hook on post excerpt.
 */
function the_excerpt() {
    echo apply_filters('the_excerpt', get_the_excerpt());
}

Saya punya beberapa pertanyaan berdasarkan temuan saya:

  1. Mengapa filter tidak berlaku seperti yang diharapkan?
  2. Apakah ada cara untuk mendapatkan kutipan di luar loop tanpa membuat loop baru?
  3. Apakah saya gila?

Terima kasih sebelumnya untuk melihatnya. Saya cukup bingung, di sini.

jlengstorf
sumber
get_the_excerpt()tidak ditinggalkan, hanya param tambahan yang dulu diteruskan tidak lagi digunakan.
Milo
Maaf, itu yang saya maksud. Terima kasih telah mengklarifikasi.
jlengstorf
Anda gila! . . . seperti yang saya lol
pythonian29033

Jawaban:

16

Ternyata jawabannya ada di wp_trim_excerpt().

Itu didefinisikan dalam wp-includes/functions.php:1879:

/**
 * Generates an excerpt from the content, if needed.
 *
 * The excerpt word amount will be 55 words and if the amount is greater than
 * that, then the string ' [...]' will be appended to the excerpt. If the string
 * is less than 55 words, then the content will be returned as is.
 *
 * The 55 word limit can be modified by plugins/themes using the excerpt_length filter
 * The ' [...]' string can be modified by plugins/themes using the excerpt_more filter
 *
 * @since 1.5.0
 *
 * @param string $text Optional. The excerpt. If set to empty, an excerpt is generated.
 * @return string The excerpt.
 */
function wp_trim_excerpt($text = '') {
    $raw_excerpt = $text;
    if ( '' == $text ) {
        $text = get_the_content('');

        $text = strip_shortcodes( $text );

        $text = apply_filters('the_content', $text);
        $text = str_replace(']]>', ']]>', $text);
        $excerpt_length = apply_filters('excerpt_length', 55);
        $excerpt_more = apply_filters('excerpt_more', ' ' . '[...]');
        $text = wp_trim_words( $text, $excerpt_length, $excerpt_more );
    }
    return apply_filters('wp_trim_excerpt', $text, $raw_excerpt);
}

Jadi setiap teks yang dikirimkan tidak diproses; ini hanya berfungsi jika dipanggil dengan parameter kosong.

Untuk mengatasi ini, saya menambahkan filter cepat ke tema saya yang memecahkan masalah:

/**
 * Allows for excerpt generation outside the loop.
 * 
 * @param string $text  The text to be trimmed
 * @return string       The trimmed text
 */
function rw_trim_excerpt( $text='' )
{
    $text = strip_shortcodes( $text );
    $text = apply_filters('the_content', $text);
    $text = str_replace(']]>', ']]>', $text);
    $excerpt_length = apply_filters('excerpt_length', 55);
    $excerpt_more = apply_filters('excerpt_more', ' ' . '[...]');
    return wp_trim_words( $text, $excerpt_length, $excerpt_more );
}
add_filter('wp_trim_excerpt', 'rw_trim_excerpt');

Ini agak berlebihan, tapi saya lebih suka daripada membuka loop baru setiap kali saya ingin menghasilkan kutipan.

jlengstorf
sumber
1
Ah, tidak jelas bagi saya Anda hanya mencari operasi teks (tidak mengambil dari DB).
hakre
Jangan khawatir. Saya selalu takut saya tidak masuk akal ketika saya mengajukan pertanyaan. Aku sedang menarik dari database, tapi aku tidak ingin membuka seluruh 'nother lingkaran karena saya memiliki hal-hal seperti get_the_title($post->ID)yang tersedia. Baris terakhir kode adalah$description = wp_trim_excerpt(get_post($post->ID)->post_content);
jlengstorf
Saya merasa sangat bodoh menanyakan hal ini, tetapi bagaimana Anda menyebut filter baru ini? Saya mencobanya sebagai $content = apply_filters( 'rw_trim_excerpt', $content );dan $content = rw_trim_excerpt($content);, tetapi tak satu pun dari ini bekerja (mantan tidak memangkas output dan kemudian menghasilkan kesalahan).
Eric K
2
@QuantumDynamix ini dirancang untuk memodifikasi get_the_excerptpenanganan untuk meniru the_excerpt, sehingga Anda dapat menghubungi: apply_filters('get_the_excerpt', $content);.
jlengstorf
Fiuh! bagus dari sudut pandang noob wanita, terima kasih
pythonian29033
1

Mencoba:

   get_post($post->ID)->post_excerpt
                        ^^^^^^^^^^^^

Lihat: get_postCodex untuk semua anggota kembali yang tersedia.

hakre
sumber
4
Itu kembali kosong jika tidak ada kutipan yang dimasukkan untuk posting. Saya perlu meniru tindakan get_the_excerpt () (membuat kutipan jika tidak ada).
jlengstorf
Menerapkan filter tidak akan melakukan itu, jadi Anda mengajukan pertanyaan yang salah. Tidak tahu mengapa Anda mencari kutipan jika tidak ada. get_the_excerpt()tidak meniru itu, periksa sumbernya, itu hanya mengakses variabel anggota $postyang ada post_excerpt. Lihat juga tautan kodeks dalam jawabannya.
hakre
3
Dari entri Codex on the_excerpt: "itu akan menampilkan kutipan otomatis yang merujuk pada 55 kata pertama dari konten posting." Saya ingin meniru perilaku itu di luar loop.
jlengstorf
Nah buat loop kedua sementara dan permintaan file itu dengan id itu maka mungkin untuk solusi cepat. Lihat Secondary Loops - codex.wordpress.org/Function_Reference/…
hakre
1
Terima kasih untuk tautannya. Saya tahu saya bisa membuat loop tambahan, tetapi sepertinya terlalu banyak. Solusi saya adalah menambahkan filter. Saya melihatnya sebagai minyak siku kecil sekarang untuk kode jauh lebih sedikit nanti.
jlengstorf
0

Anda dapat menggunakan fungsi khusus saya untuk memfilter konten (itu dari NARGA Framework )

  • Jika posting memiliki kutipan khusus, tampilkan kontennya
  • Secara otomatis menghasilkan kutipan dari conten jika posting belum kustom cerpt
  • Potong pendek kode otomatis, kode HTML, hapus [...], tambahkan teks "Baca Selengkapnya" (diterjemahkan)

        /**
        * Auto generate excerpt from content if the post hasn't custom excerpt
        * @from NARGA Framework - http://www.narga.net/narga-core
        * @param $excerpt_lenght  The maximium words of excerpt generating from content
        * @coder: Nguyễn Đình Quân a.k.a Narga - http://www.narga.net
        **/  
        function narga_excerpts($content = false) {
        # If is the home page, an archive, or search results
        if(is_front_page() || is_archive() || is_search()) :
            global $post;
        $content = $post->post_excerpt;
        $content = strip_shortcodes($content);
        $content = str_replace(']]>', ']]>', $content);
        $content = strip_tags($content);
        # If an excerpt is set in the Optional Excerpt box
        if($content) :
            $content = apply_filters('the_excerpt', $content);
        # If no excerpt is set
        else :
            $content = $post->post_content;
            $excerpt_length = 50;
            $words = explode(' ', $content, $excerpt_length + 1);
        if(count($words) > $excerpt_length) :
            array_pop($words);
            array_push($words, '...<p><a class="more-link" href="' . get_permalink() . '" title="' . the_title_attribute('echo=0') . '">  ' . __( 'Read more &#187;', 'narga' ) . ' </a></p>');
            $content = implode(' ', $words);
        endif;
        $content = '<p>' . $content . '</p>';
        endif;
        endif;
        # Make sure to return the content
        return $content;
        }
        // Add filter to the_content
        add_filter('the_content', 'narga_excerpts');
    
Narga
sumber