ใช้ wp_trim_excerpt เพื่อรับ the_excerpt () อยู่นอกลูป


20

ฉันกำลังสร้างชุดรูปแบบที่จะแสดงข้อความที่ตัดตอนมาจากโฮมเพจสำหรับโพสต์ที่อาจเกิดขึ้นหลายสิบรายการ ฉันไม่มีข้อความที่ตัดตอนมาเองในโพสต์ทั้งหมดของฉันจึง$post->post_excerptว่างเปล่าสำหรับโพสต์จำนวนมาก ในกรณีที่ไม่มีข้อความที่ตัดตอนมาด้วยตนเองฉันต้องการใช้ฟังก์ชัน get_the_excerpt () ในตัว แต่ไม่สามารถใช้งานได้นอกลูป

ติดตามฟังก์ชั่นดูเหมือนว่าจะใช้ wp_trim_excerpt จาก wp-include / formatting.php เพื่อสร้างข้อความที่ตัดตอนมาทันที ฉันกำลังเรียกมันในรหัสของฉันเหมือน wp_trim_excerpt( $item->post_content )แต่มันก็แค่คืนเนื้อหาเต็ม ฉันกำลังทำอะไรผิดหรือเปล่า?

ฉันรู้ว่าฉันสามารถสร้างฟังก์ชั่นของตัวเองเพื่อสร้างข้อความที่ตัดตอนมา แต่ฉันชอบที่จะใช้ฟังก์ชั่นในตัวที่เป็นไปได้ทำให้รหัสของฉันเข้ากันได้กับปลั๊กอิน / ตัวกรองที่มีศักยภาพอื่น ๆ

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


คุณสามารถลองเรียกใช้ตัวกรองข้อความที่ตัดตอนมา ...$myvar = apply_filters( 'the_excerpt', $myvar );
t31os

คำตอบ:


22

ตั้งแต่ WP 3.3.0 wp_trim_words()มีประโยชน์ถ้าคุณสามารถรับเนื้อหาที่คุณต้องการสร้างข้อความที่ตัดตอนมา หวังว่าจะเป็นประโยชน์กับใครบางคนและมันจะช่วยสร้างฟังก์ชั่นการนับคำของคุณเอง

http://codex.wordpress.org/Function_Reference/wp_trim_words


8

wp_trim_excerpt() มีกลไกที่อยากรู้อยากเห็นเล็กน้อย - หากมีสิ่งใดผ่านไปแล้วมันก็ไม่ทำอะไรเลย

นี่คือตรรกะพื้นฐานที่อยู่เบื้องหลัง:

  • get_the_excerpt() ตรวจสอบข้อความที่ตัดตอนมาด้วยตนเอง;
  • wp_trim_excerpt() ตีระฆังในหากไม่มีข้อความที่ตัดตอนมาด้วยตนเองและทำให้หนึ่งจากเนื้อหาหรือทีเซอร์

ทั้งสองเชื่อมโยงกับตัวแปรโกลบอลอย่างแน่น

นอกวงคุณจะดีกว่าที่จะเอาโค้ดออกwp_trim_excerpt()และเขียนฟังก์ชันตัดแต่งของคุณเอง


6

ปรับปรุง:

นี่คืออนุพันธ์ของ wp_trim_excerpt () ที่ฉันใช้ ทำงานได้อย่างสมบูรณ์แบบ มาจาก Wordpress เวอร์ชั่น 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);
}

คุณไม่ต้องโพสต์คำตอบใหม่คุณสามารถแก้ไขคำตอบเก่าเพื่อรวมข้อมูลใหม่ได้เสมอ ตัวอย่างเช่นคุณสามารถคัดลอกลิงก์ไปยังรหัส WP จากคำตอบแรกของคุณลงในอันนี้แล้วลบคำตอบแรกของคุณ
Jan Fabry

สำหรับการคัดลอก / paster ออกมี: เพิ่ม $ raw_excerpt = $ text;
Svetoslav Marinov

1

นี่คือสิ่งที่ฉันจะใช้ใน "trim_excerpt" ซึ่งใช้วัตถุโพสต์หรือรหัสประจำตัวเป็นพารามิเตอร์

เห็นได้ชัดว่ามีอะไรอยู่ในแกนกลาง ไม่ทราบว่าเพราะเหตุใด (และ get_the_author ()) จึงไม่เทียบเท่าแบบวนซ้ำ

/**
     * 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);
    }

0

+1 ถึง Rast มันแปลกมากที่ไม่มีสิ่งเช่น get_the_excerpt ($ post-> ID) เมื่อมันควรจะชัดเจนว่าควร อย่างไรก็ตามนี่คือ wp_trim_excerpt () ใน wordpress เวอร์ชัน 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    }

คุณสามารถดูได้ในบรรทัด 1826 ว่ามีการเชื่อมโยงกับตัวแปร $ post ทั่วโลกผ่านทาง get_the_contents และใช่ฉันไม่รู้ว่าพวกเขากำลังคิดอะไรอยู่ แต่จากที่นี่แทนที่ get_the_content ด้วย $ text ใน my_excerpt ของคุณเองและควรทำงานในลักษณะเดียวกัน


azure_ardee : ลองใช้ wp_trim_words ()

0

ฟังก์ชั่น get_the_content () จะส่งคืนเนื้อหาเต็มถ้า $ more! = 0 คุณต้องตั้งค่าตัวแปรทั่วโลก $ มากกว่าเป็น 0 เพื่อให้แน่ใจว่า get_the_content () ฟังก์ชั่นกลับมาตัดตอน

แก้ไขฟังก์ชัน wp_trim_excerpt ():

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

0

เมื่อใช้คำตอบของผู้อื่นด้านบนนี่เป็นคำตอบที่ง่ายกว่าซึ่งดูเหมือนจะทำงานได้ดี:

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

ฉันใช้มันใน<meta>แท็กในฟังก์ชั่นเพื่อกำหนดคำอธิบาย OpenGraph ดังนั้นฉันแค่เพิ่ม:

<meta property="og:description" content="<?php echo esc_html( $excerpt ); ?>" />

แล้วเนื้อหา HTML ล่ะ วิธีนี้จะจัดการกับแท็ก? ข้อความที่ตัดตอนมาก็จะตัดแท็ก HTML และรหัสย่อ เกิดอะไรขึ้นถ้าคำแรกของข้อความที่ตัดตอนมามีภาพ? นั่นอาจจะทำให้เลย์เอาต์ของคุณพัง
brett
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.