Sử dụng wp_trim_excerpt để lấy the_excerpt () bên ngoài vòng lặp


20

Tôi đang xây dựng một chủ đề sẽ hiển thị các trích đoạn trên trang chủ cho hàng tá bài đăng. Tôi không có trích đoạn thủ công trên tất cả các bài đăng của mình, vì vậy $post->post_excerpttrống đối với nhiều bài đăng. Trong trường hợp không có đoạn trích thủ công, tôi muốn sử dụng hàm get_the_excerpt () tích hợp, nhưng nó không khả dụng ngoài vòng lặp.

Theo dõi chức năng, có vẻ như nó sử dụng wp_trim_excerpt từ wp-gộp / format.php để tạo các trích đoạn một cách nhanh chóng. Tôi đang gọi nó trong mã của tôi như thế wp_trim_excerpt( $item->post_content ), nhưng nó chỉ đơn giản là trả lại toàn bộ nội dung. Tôi có làm điều gì sai?

Tôi biết rằng tôi có thể tạo chức năng của riêng mình để tạo một đoạn trích, nhưng tôi thích sử dụng các hàm dựng sẵn nếu có thể, giữ cho mã của tôi tương thích với các plugin / bộ lọc tiềm năng khác.

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


Bạn có thể thử gọi các bộ lọc trích đoạn ...$myvar = apply_filters( 'the_excerpt', $myvar );
t31os

Câu trả lời:



8

wp_trim_excerpt() có một chút cơ chế tò mò - nếu bất cứ điều gì được truyền cho nó thì nó không làm gì cả.

Đây là logic cơ bản đằng sau nó:

  • get_the_excerpt() kiểm tra trích đoạn thủ công;
  • wp_trim_excerpt() chuông trong nếu không có trích đoạn thủ công và làm cho một từ nội dung hoặc trêu ghẹo.

Cả hai đều được gắn chặt với các biến toàn cầu và vì vậy Loop.

Bên ngoài Vòng lặp, bạn tốt hơn là lấy mã ra wp_trim_excerpt()và viết chức năng cắt của riêng bạn.


6

Cập nhật:

Đây là một dẫn xuất của wp_trim_excerpt () mà tôi đã sử dụng. Hoạt động hoàn hảo. Bắt nguồn từ phiên bản 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);
}

Bạn không phải đăng câu trả lời mới, bạn luôn có thể chỉnh sửa câu trả lời cũ của mình để đưa thông tin mới. Ví dụ, bạn có thể sao chép liên kết đến mã WP từ câu trả lời đầu tiên của bạn vào câu trả lời này và sau đó xóa câu trả lời đầu tiên của bạn.
Jan Fabry

Đối với bản sao / dán ngoài đó: thêm $ raw_excerpt = $ text;
Svetoslav Marinov

1

Đây là của tôi về "trim_excerpt" lấy đối tượng bài đăng hoặc ID bài đăng làm tham số.

Rõ ràng dựa trên những gì trong cốt lõi. Không biết tại sao điều này (và get_the_ Author ()) không có tương đương không vòng lặp.

/**
     * 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. Điều rất kỳ lạ là không có thứ gọi là get_the_excerpt ($ post-> ID), khi nó khá rõ ràng là nó nên. Dù sao, đây là wp_trim_excerpt () trong phiên bản wordpress 3.0.4:

http://core.trac.wordpress.org/browser/tags/3.0.4/wp-includes/formatted.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    }

Bạn có thể thấy trên dòng 1826 rằng nó được liên kết với biến toàn cầu $ post thông qua get_the_contents. Và vâng, tôi không biết họ đang nghĩ gì. Nhưng từ đây, thay thế get_the_content bằng $ text trong my_excerpt của riêng bạn và nó sẽ hoạt động theo cách tương tự.


azure_ardee : xem xét sử dụng wp_trim_words ()

0

Hàm get_the_content () sẽ trả về nội dung đầy đủ nếu $ more! = 0. Bạn phải đặt biến toàn cục $ more thành 0 để đảm bảo trích xuất hàm get_the_content ().

Hàm wp_trim_excerpt () đã sửa đổi:

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

Sử dụng câu trả lời của người khác ở trên, đây là một câu trả lời đơn giản hơn có vẻ hoạt động tốt:

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

Tôi đang sử dụng nó trong các <meta>thẻ trong một hàm để xác định các mô tả OpenGraph. Vì vậy, sau đó tôi chỉ cần thêm:

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

Còn nội dung HTML thì sao? Làm thế nào điều này sẽ đối phó với các thẻ? đoạn trích cũng loại bỏ các thẻ html và shortcodes. Nếu những từ đầu tiên của đoạn trích có chứa một hình ảnh thì sao? Điều đó có thể sẽ phá vỡ bố cục của bạn.
brett
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.