Menggunakan wp_trim_excerpt untuk mendapatkan the_excerpt () di luar loop

20

Saya sedang membangun tema yang akan menunjukkan kutipan di beranda untuk berpotensi puluhan posting. Saya tidak memiliki kutipan manual di semua posting saya, jadi $post->post_excerptkosong untuk banyak posting. Jika tidak ada kutipan manual, saya ingin menggunakan fungsi get_the_excerpt () bawaan, tetapi tidak tersedia di luar loop.

Melacak fungsi, sepertinya menggunakan wp_trim_excerpt dari wp-include / formatting.php untuk membuat kutipan dengan cepat. Saya menyebutnya dalam kode saya seperti wp_trim_excerpt( $item->post_content ), tetapi itu hanya mengembalikan konten lengkap. Apakah saya melakukan sesuatu yang salah?

Saya tahu bahwa saya dapat membuat fungsi saya sendiri untuk membuat kutipan, tetapi saya suka menggunakan fungsi bawaan jika memungkinkan, menjaga kode saya kompatibel dengan plugin / filter potensial lainnya.

http://adambrown.info/p/wp_hooks/hook/wp_trim_excerpt?version=3.0&file=wp-includes/formatting.php

Derek Perkins
sumber
Anda dapat mencoba menelepon filter kutipan ...$myvar = apply_filters( 'the_excerpt', $myvar );
t31os

Jawaban:

8

wp_trim_excerpt() memiliki sedikit mekanisme penasaran - jika ada sesuatu yang diteruskan maka ia tidak melakukan apa-apa.

Berikut ini logika dasar di baliknya:

  • get_the_excerpt() memeriksa kutipan manual;
  • wp_trim_excerpt() berdentang jika tidak ada kutipan manual dan membuatnya dari konten atau penggoda.

Keduanya terkait erat dengan variabel global dan juga Loop.

Di luar Loop Anda lebih baik mengambil kode dari wp_trim_excerpt()dan menulis fungsi trim Anda sendiri.

Jarang
sumber
6

Memperbarui:

Ini adalah turunan dari wp_trim_excerpt () yang saya gunakan. Bekerja dengan sempurna. Berasal dari Wordpress versi 3.0.4

function my_excerpt($text, $excerpt)
{
    if ($excerpt) return $excerpt;

    $text = strip_shortcodes( $text );

    $text = apply_filters('the_content', $text);
    $text = str_replace(']]>', ']]>', $text);
    $text = strip_tags($text);
    $excerpt_length = apply_filters('excerpt_length', 55);
    $excerpt_more = apply_filters('excerpt_more', ' ' . '[...]');
    $words = preg_split("/[\n\r\t ]+/", $text, $excerpt_length + 1, PREG_SPLIT_NO_EMPTY);
    if ( count($words) > $excerpt_length ) {
            array_pop($words);
            $text = implode(' ', $words);
            $text = $text . $excerpt_more;
    } else {
            $text = implode(' ', $words);
    }

    return apply_filters('wp_trim_excerpt', $text, $raw_excerpt);
}
Ardee Aram
sumber
Anda tidak perlu memposting jawaban baru, Anda selalu dapat mengedit yang lama untuk memasukkan informasi baru. Anda dapat, misalnya, menyalin tautan ke kode WP dari jawaban pertama Anda ke jawaban ini dan kemudian menghapus jawaban pertama Anda.
Jan Fabry
Untuk copy / pasters di luar sana: tambahkan $ raw_excerpt = $ text;
Svetoslav Marinov
1

Inilah pendapat saya tentang "trim_excerpt" yang mengambil objek posting atau ID posting sebagai parameter.

Jelas didasarkan pada apa yang ada di inti. Tidak tahu mengapa ini (dan get_the_author ()) tidak memiliki padanan non-loop.

/**
     * Generates an excerpt from the content, if needed.
     *
     * @param int|object $post_or_id can be the post ID, or the actual $post object itself
     * @param string $excerpt_more the text that is applied to the end of the excerpt if we algorithically snip it
     * @return string the snipped excerpt or the manual excerpt if it exists         
     */
    function zg_trim_excerpt($post_or_id, $excerpt_more = ' [...]') {
        if ( is_object( $post_or_id ) ) $postObj = $post_or_id;
        else $postObj = get_post($post_or_id);

        $raw_excerpt = $text = $postObj->post_excerpt;
        if ( '' == $text ) {
            $text = $postObj->post_content;

            $text = strip_shortcodes( $text );

            $text = apply_filters('the_content', $text);
            $text = str_replace(']]>', ']]>', $text);
            $text = strip_tags($text);
            $excerpt_length = apply_filters('excerpt_length', 55);

            // don't automatically assume we will be using the global "read more" link provided by the theme
            // $excerpt_more = apply_filters('excerpt_more', ' ' . '[...]');
            $words = preg_split("/[\n\r\t ]+/", $text, $excerpt_length + 1, PREG_SPLIT_NO_EMPTY);
            if ( count($words) > $excerpt_length ) {
                array_pop($words);
                $text = implode(' ', $words);
                $text = $text . $excerpt_more;
            } else {
                $text = implode(' ', $words);
            }
        }
        return apply_filters('wp_trim_excerpt', $text, $raw_excerpt);
    }
Tom Auger
sumber
0

+1 ke Rast. Sangat aneh bahwa tidak ada yang namanya get_the_excerpt ($ post-> ID), padahal seharusnya sudah jelas. Bagaimanapun, ini adalah wp_trim_excerpt () di wordpress versi 3.0.4:

http://core.trac.wordpress.org/browser/tags/3.0.4/wp-includes/formatting.php

function wp_trim_excerpt($text) {
1824            $raw_excerpt = $text;
1825            if ( '' == $text ) {
1826                    $text = get_the_content('');
1827    
1828                    $text = strip_shortcodes( $text );
1829    
1830                    $text = apply_filters('the_content', $text);
1831                    $text = str_replace(']]>', ']]>', $text);
1832                    $text = strip_tags($text);
1833                    $excerpt_length = apply_filters('excerpt_length', 55);
1834                    $excerpt_more = apply_filters('excerpt_more', ' ' . '[...]');
1835                    $words = preg_split("/[\n\r\t ]+/", $text, $excerpt_length + 1, PREG_SPLIT_NO_EMPTY);
1836                    if ( count($words) > $excerpt_length ) {
1837                            array_pop($words);
1838                            $text = implode(' ', $words);
1839                            $text = $text . $excerpt_more;
1840                    } else {
1841                            $text = implode(' ', $words);
1842                    }
1843            }
1844            return apply_filters('wp_trim_excerpt', $text, $raw_excerpt);
1845    }

Anda dapat melihat pada baris 1826 bahwa ia terhubung ke variabel global $ post melalui get_the_contents. Dan ya, saya tidak tahu apa yang mereka pikirkan. Tapi dari sini, ganti get_the_content dengan $ teks di my_excerpt Anda sendiri, dan itu harus berperilaku dengan cara yang sama.

Ardee Aram
sumber
azure_ardee : pertimbangkan menggunakan wp_trim_words ()
0

Fungsi get_the_content () akan mengembalikan konten penuh jika $ lebih! = 0. Anda harus menetapkan variabel global $ lebih ke 0 untuk memastikan get_the_content () fungsi mengembalikan kutipan.

Fungsi wp_trim_excerpt () yang dimodifikasi:

function wp_trim_excerpt($text) {
    $raw_excerpt = $text;
    if ( '' == $text ) {
        global $more;
        $tmp = $more;
        $more = 0;
        $text = get_the_content('');
        $more = $tmp;

        $text = strip_shortcodes( $text );

        $text = apply_filters('the_content', $text);
        $text = str_replace(']]>', ']]>', $text);
        $text = strip_tags($text);
        $excerpt_length = apply_filters('excerpt_length', 55);
        $excerpt_more = apply_filters('excerpt_more', ' ' . '[...]');
        $words = preg_split("/[\n\r\t ]+/", $text, $excerpt_length + 1, PREG_SPLIT_NO_EMPTY);
        if ( count($words) > $excerpt_length ) {
            array_pop($words);
            $text = implode(' ', $words);
            $text = $text . $excerpt_more;
        } else {
            $text = implode(' ', $words);
        }
    }
    return apply_filters('wp_trim_excerpt', $text, $raw_excerpt);
}

sumber
0

Menggunakan jawaban orang lain di atas, inilah jawaban yang lebih sederhana yang tampaknya bekerja dengan baik:

global $post;

$excerpt = apply_filters('get_the_excerpt', get_post_field('post_excerpt', $post->ID));

if ( $excerpt == '' ) {
    $excerpt = wp_trim_words( $post->post_content, 55 );
}

Saya menggunakannya dalam <meta>tag dalam suatu fungsi untuk mendefinisikan deskripsi OpenGraph. Jadi saya tambahkan saja:

<meta property="og:description" content="<?php echo esc_html( $excerpt ); ?>" />
dpruth
sumber
Bagaimana dengan konten HTML? Bagaimana ini akan menangani tag? kutipan tersebut juga mengupas tag html dan shortcode. bagaimana jika kata-kata pertama dari kutipan berisi gambar? Itu mungkin akan merusak tata letak Anda.
brett