Apply_filters () และ the_excerpt กำลังให้ผลลัพธ์ที่ไม่คาดคิด


10

ฉันรู้สึกเหมือนขาดสิ่งที่เห็นได้ชัดที่นี่ แต่ดูเหมือนว่าฉันจะไม่สามารถให้ WordPress ร่วมมือกันได้

ฉันกำลังสร้างแท็ก Facebook OG ด้วยฟังก์ชั่น ทุกอย่างทำงานได้ดียกเว้นข้อความที่ตัดตอนมา

เนื่องจากการคัดค้านget_the_excerpt($post->ID)มีวิธีอื่นในการสร้างข้อความที่ตัดตอนมาโดยไม่ต้องสร้างวงใหม่ทั้งหมดหรือไม่ ดูเหมือนว่ามากเกินไปสำหรับฉัน

สัญชาตญาณแรกของฉันคือการใช้apply_filters():

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

ที่ให้ฉันโพสต์เต็มพร้อมเนื้อหาในรูปแบบ HTML ตกลงจะต้องผิด ดังนั้นฉันจึงลองความคิดเชิงตรรกะต่อไป:

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

ไม่มีลูกเต๋า ตอนนี้ไม่มี HTML แต่ก็ยังโพสต์แบบเต็ม (ซึ่งสร้างความสับสนจริงๆ)

ได้ไม่มีปัญหา. ให้ข้ามสิ่งที่แฟนซีทั้งหมดและไปที่รายการที่ถูกตัด:

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

ไม่มีการเปลี่ยนแปลง.

ดังนั้นคำถามของฉันคือสิ่งนี้เกิดอะไรขึ้นห่า? มีบางอย่างที่ฉันหายไปไหม

ฉันเข้าสู่ WP core เพื่อค้นหาวิธีการthe_excerpt()ทำงานและดูเหมือนว่าจะเหมือนกับการโทรของฉัน:

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

ฉันมีคำถามสองสามข้อจากการค้นพบของฉัน:

  1. เหตุใดจึงไม่ใช้ตัวกรองตามที่คาดไว้
  2. มีวิธีรับข้อความที่ตัดตอนมานอกวงโดยไม่ต้องสร้างวนใหม่หรือไม่
  3. ฉันบ้าเหรอ?

ขอบคุณล่วงหน้าที่ดู ฉันค่อนข้างนิ่งงันที่นี่


get_the_excerpt()ไม่ได้เลิกใช้เพียงแค่พารามิเตอร์พิเศษที่เคยถูกส่งไปแล้วเท่านั้นไม่ได้ใช้งานอีกต่อไป
Milo

ขออภัยนั่นคือสิ่งที่ฉันหมายถึง ขอบคุณสำหรับการชี้แจง
jlengstorf

คุณมันบ้า! . . . เช่นเดียวกับฉัน lol
pythonian29033

คำตอบ:


16

กลับกลายเป็นคำตอบคือwp_trim_excerpt()มา

มันถูกกำหนดใน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);
}

ดังนั้นข้อความใดก็ตามที่ผ่านเข้ามาจะไม่ได้รับการประมวลผล มันจะทำงานเฉพาะเมื่อมันถูกเรียกด้วยพารามิเตอร์ที่ว่างเปล่า

ในการแก้ปัญหานี้ฉันได้เพิ่มตัวกรองอย่างรวดเร็วในธีมของฉันที่ช่วยแก้ปัญหา:

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

มันค่อนข้างซ้ำซ้อน แต่ฉันชอบดีกว่าเปิดลูปใหม่ทุกครั้งที่ฉันต้องการสร้างข้อความที่ตัดตอนมา


1
อามันไม่ชัดเจนสำหรับฉันที่คุณกำลังมองหาการทำงานของข้อความเท่านั้น (ไม่ดึงจากฐานข้อมูล)
hakre

ไม่ต้องห่วง. ฉันมักจะกลัวว่าฉันจะไม่รู้สึกเมื่อฉันถามคำถาม ผมถูกดึงจากฐานข้อมูล แต่ฉันไม่ต้องการที่จะเปิดทั้ง 'nother ห่วงเพราะผมมีสิ่งที่ต้องการget_the_title($post->ID)ใช้ได้ บรรทัดสุดท้ายของรหัสคือ$description = wp_trim_excerpt(get_post($post->ID)->post_content);
jlengstorf

ฉันรู้สึกโง่จริงๆที่ถามสิ่งนี้ แต่คุณจะเรียกตัวกรองใหม่นี้ได้อย่างไร ฉันลองเป็น$content = apply_filters( 'rw_trim_excerpt', $content );และ$content = rw_trim_excerpt($content);แต่ไม่ทำงานเหล่านี้ (อดีตไม่ได้ตัดออกและในภายหลังผลิตข้อผิดพลาด)
Eric K

2
@QuantumDynamix นี้ถูกออกแบบมาเพื่อปรับเปลี่ยนget_the_excerptการจัดการที่จะเลียนแบบเพื่อให้คุณสามารถโทรติดต่อ:the_excerpt apply_filters('get_the_excerpt', $content);
jlengstorf

วุ้ย! เป็นคนดีจากมุมมองของ wpress noob ขอบคุณ
pythonian29033

1

ลอง:

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

ดู: get_postCodexสำหรับสมาชิกส่งคืนที่มีอยู่ทั้งหมด


4
สิ่งนั้นจะส่งคืนค่าว่างหากไม่มีการตัดตอนสำหรับโพสต์ ฉันต้องเลียนแบบการกระทำของ get_the_excerpt () (สร้างข้อความที่ตัดตอนมาหากไม่มีอยู่)
jlengstorf

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

3
จากรายการ Codex เมื่อthe_excerpt: "มันจะแสดงข้อความที่ตัดตอนมาโดยอัตโนมัติซึ่งอ้างถึง 55 คำแรกของเนื้อหาโพสต์" ฉันต้องการเลียนแบบพฤติกรรมนั้นนอกวง
jlengstorf

สร้างวนรอบที่สองชั่วคราวและสอบถามไฟล์โดยใช้ id จากนั้นอาจเป็นวิธีแก้ปัญหาอย่างรวดเร็ว ดูลูปรอง - codex.wordpress.org/Function_Reference/ …
hakre

1
ขอบคุณสำหรับลิงค์ ฉันรู้ว่าฉันสามารถตั้งค่าการวนซ้ำเพิ่มเติม แต่ดูเหมือน overkill โซลูชันของฉันเพิ่มตัวกรอง ฉันเห็นว่ามันเป็นจาระบีข้อศอกเล็กน้อยตอนนี้สำหรับรหัสน้อยลงในภายหลัง
jlengstorf

0

คุณสามารถใช้ฟังก์ชั่นที่กำหนดเองของฉันเพื่อกรองเนื้อหา (มาจากNARGA Framework )

  • หากโพสต์มีข้อความที่ตัดตอนมาเองให้แสดงแทนเนื้อหา
  • สร้างข้อความที่ตัดตอนมาจากเนื้อหาโดยอัตโนมัติหากโพสต์ยังไม่ได้กำหนดเอง
  • ย่อรหัสตัดแต่งอัตโนมัติ, รหัส HTML, ลบ [... ], เพิ่มข้อความ "อ่านเพิ่มเติม" (แปลได้)

        /**
        * 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');
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.