application_filters () và the_excerpt đang cho kết quả không mong muốn


10

Tôi cảm thấy như tôi phải thiếu một cái gì đó khá rõ ràng ở đây, nhưng dường như tôi không thể khiến WordPress hợp tác.

Tôi đang tạo các thẻ Facebook OG với một chức năng. Tất cả mọi thứ hoạt động tốt, ngoại trừ đoạn trích.

Vì sự phản đối của get_the_excerpt($post->ID), có cách nào khác để tạo một đoạn trích mà không phải tạo một vòng lặp hoàn toàn mới không? Nó có vẻ quá mức đối với tôi.

Bản năng đầu tiên của tôi là sử dụng apply_filters():

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

Điều đó mang lại cho tôi bài viết đầy đủ, hoàn chỉnh với nội dung được định dạng HTML. Được rồi, phải sai. Vì vậy, tôi đã thử ý tưởng hợp lý tiếp theo:

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

Không có con xúc xắc. Bây giờ không có HTML, nhưng nó vẫn là bài viết đầy đủ (điều này thực sự khó hiểu).

Ổn không có vấn đề. Hãy bỏ qua tất cả những thứ ưa thích và chỉ đi cho mục cắt tỉa:

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

Không thay đổi.

Vì vậy, câu hỏi của tôi là: cái quái gì đang diễn ra vậy? Có cái gì tôi đang thiếu, ở đây?

Tôi đã vào lõi WP để tìm cách the_excerpt()hoạt động và nó dường như giống hệt với cuộc gọi của tôi:

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

Tôi có một vài câu hỏi dựa trên những phát hiện của tôi:

  1. Tại sao bộ lọc không áp dụng như mong đợi?
  2. Có cách nào để lấy đoạn trích bên ngoài vòng lặp mà không tạo vòng lặp mới không?
  3. Tôi có điên không?

Cảm ơn trước vì đã có một cái nhìn. Tôi khá bối rối, ở đây.


get_the_excerpt()không bị phản đối, chỉ là thông số phụ đã từng được truyền cho nó không còn được sử dụng nữa.
Milo

Xin lỗi, đó là những gì tôi muốn nói. Cảm ơn đã làm rõ.
jlengstorf

Bạn thật điên rồ! . . . như tôi lol
pythonia29033 7/10/2016

Câu trả lời:


16

Hóa ra câu trả lời là trong wp_trim_excerpt().

Nó được định nghĩa trong 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);
}

Vì vậy, bất kỳ văn bản được thông qua không được xử lý; nó chỉ hoạt động nếu nó được gọi với một tham số trống.

Để giải quyết vấn đề này, tôi đã thêm một bộ lọc nhanh vào chủ đề của mình để giải quyết vấn đề:

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

Nó hơi dư thừa, nhưng tôi thích nó hơn là mở các vòng lặp mới mỗi lần tôi muốn tạo một đoạn trích.


1
À, tôi không rõ là bạn chỉ tìm kiếm thao tác văn bản (không tìm nạp từ DB).
hakre

Đừng lo lắng. Tôi luôn lo sợ mình không có ý nghĩa khi đặt câu hỏi. Tôi đã lấy từ cơ sở dữ liệu, nhưng tôi không muốn mở một vòng lặp hoàn chỉnh vì tôi có get_the_title($post->ID)sẵn những thứ như thế . Dòng mã cuối cùng là$description = wp_trim_excerpt(get_post($post->ID)->post_content);
jlengstorf

Tôi cảm thấy thực sự ngu ngốc khi hỏi điều này, nhưng làm thế nào để bạn gọi bộ lọc mới này? Tôi đã thử nó $content = apply_filters( 'rw_trim_excerpt', $content );$content = rw_trim_excerpt($content);, nhưng cả hai đều không hoạt động (trước đây không cắt đầu ra và sau đó đã tạo ra lỗi).
Eric K

2
@QuantumDOUNDix Điều này được thiết kế để sửa đổi việc get_the_excerptxử lý thành bắt chước the_excerpt, vì vậy bạn có thể gọi : apply_filters('get_the_excerpt', $content);.
jlengstorf

phew! một điều tuyệt vời từ quan điểm của một nữ hoàng, cảm ơn
pythonia29033 7/10/2016

1

Thử:

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

Xem: get_postCodex cho tất cả các thành viên trở lại có sẵn.


4
Điều đó trả về trống nếu không có đoạn trích được nhập cho bài viết. Tôi cần bắt chước các hành động của get_the_excerpt () (tạo một đoạn trích nếu không tồn tại).
jlengstorf

Áp dụng bộ lọc sẽ không làm điều đó, vì vậy bạn đang đặt câu hỏi sai. Không biết tại sao bạn lại tìm kiếm một đoạn trích nếu không có. get_the_excerpt()không bắt chước rằng, hãy kiểm tra nguồn, nó chỉ truy cập vào biến thành viên của $postpost_excerpt. Xem thêm liên kết codex trong câu trả lời.
hakre

3
Từ mục Codex trên the_excerpt: "nó sẽ hiển thị một đoạn trích tự động đề cập đến 55 từ đầu tiên của nội dung của bài đăng." Tôi đang tìm cách bắt chước hành vi đó bên ngoài vòng lặp.
jlengstorf

Vâng tạm thời tạo một vòng lặp thứ hai và truy vấn tệp đó bằng id sau đó có thể là một giải pháp nhanh chóng. Xem Vòng lặp thứ cấp - codex.wordpress.org/Function_Reference/ từ
hakre

1
Cảm ơn các liên kết. Tôi biết tôi có thể thiết lập một vòng lặp bổ sung, nhưng có vẻ như quá mức cần thiết. Giải pháp của tôi là thêm một bộ lọc. Tôi thấy nó như một chút mỡ khuỷu tay bây giờ cho mã ít hơn rất nhiều sau này.
jlengstorf

0

Bạn có thể sử dụng chức năng tùy chỉnh của tôi để ghi nội dung (nó từ NARGA Framework )

  • Nếu bài đăng có đoạn trích tùy chỉnh, hãy hiển thị nó thay vì nội dung
  • Tự động tạo trích đoạn từ conten nếu bài đăng không tùy chỉnh cerpt
  • Tự động cắt ngắn mã, mã HTML, xóa [...], thêm văn bản "Đọc thêm" (có thể dịch)

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