Cho phép HTML trong đoạn trích


56

Đây là đoạn trích của tôi.

// Generate custom excerpt length
function wpbx_excerpt_length($length) {
    return 300;
}
add_filter('excerpt_length', 'wpbx_excerpt_length');

Làm cách nào để tôi cho phép html như <a> <b> <i> <br>

Câu trả lời:


124

HƯỚNG DẪN HOÀN THÀNH

Gần đây tôi đã trả lời một vài câu hỏi liên quan đến các trích đoạn, vì vậy tôi sẽ đưa ra một lời giải thích chi tiết nhất có thể.

TRƯỚC

Dường như có một vài câu hỏi phát sinh từ câu trả lời này về nơi mã nên đi và câu trả lời là, nó thực sự tùy thuộc vào bạn và cách bạn thấy phù hợp. Có một số tùy chọn trong đó bạn có thể đặt mã (nếu không được nêu rõ ràng):

  • Trong tệp.php của chủ đề của bạn hoặc bất kỳ tệp nào sử dụng làm tệp chức năng. Chỉ cần nhớ khi bạn làm điều này, nếu chủ đề không phải là của riêng bạn, tất cả các thay đổi sẽ bị mất khi bạn nâng cấp chủ đề của mình

  • Một cách tốt hơn sẽ là sử dụng mã trong một chủ đề con. Như trên, trong tệp tin.php hoặc chức năng liên quan

  • Sử dụng mã trong một plugin. Đây là cách ưa thích vì điều này làm cho mã có sẵn trên tất cả các chủ đề. Nếu bạn chuyển chủ đề, bạn không phải lo lắng về việc viết lại cùng một mã.

Tôi hy vọng điều này sẽ làm sáng tỏ mọi thứ một chút :-)

THẺ HTML / ĐỊNH DẠNG

the_excerpt()trước hết không chấp nhận bất kỳ tham số nào, vì vậy không có gì có thể được chuyển cho nó. Có một thực tế là the_excerpt()cắt nội dung thành 55 từ và tất cả các thẻ HTML đều bị xóa trước khi trả lại văn bản. the_excerpt()được đặt trong wp-gồm / post-template.php . Để cho phép một số hoặc tất cả các thẻ HTML trong đoạn trích, một đoạn trích mới phải được tạo.

Trước hết, chức năng ban đầu cần được loại bỏ trước, và sau đó chức năng mới cần được nối vào get_the_excerpt. Xin lưu ý, đoạn trích mới này sẽ vẫn có thể gọi được như the_excerpt()trong các tệp mẫu, không cần phải thay đổi điều đó. get_the_excerpt()được đặt trong wp-gồm / post-template.php .

Đoạn trích sử dụng wp_trim_excerptđể trả về văn bản đã cắt, vì vậy chúng ta cần xóa wp_trim_excerptđầu tiên khỏi bộ lọc trích đoạn. wp_trim_excerpt()được đặt trong wp-gồm / format.php , dòng 2355. Đây là cách:

remove_filter('get_the_excerpt', 'wp_trim_excerpt');

Bây giờ bạn có thể thêm đoạn trích mới của bạn vào get_the_excerpt

add_filter('get_the_excerpt', 'wpse_custom_wp_trim_excerpt');

Để cho phép các thẻ / định dạng html, chúng tôi sẽ cần chỉ định những thẻ nào bạn sẽ cần cho phép. Bạn có thể sử dụng strip_tagstuyên bố sau để đạt được điều đó

$wpse_excerpt = strip_tags($wpse_excerpt, wpse_allowedtags());

Đối số thứ hai wpse_allowedtags()là một hàm nhỏ được sử dụng để thêm các thẻ the_excerpt()sẽ cho phép. Để có danh sách đầy đủ các thẻ HTML 5 hợp lệ, hãy đi và kiểm tra nó ở đây . Đây là chức năng, thêm bất kỳ thẻ html nào vào đây mà bạn cần cho phép / giữ

function wpse_allowedtags() {
// Add custom tags to this string
    return '<script>,<style>,<br>,<em>,<i>,<ul>,<ol>,<li>,<a>,<p>,<img>,<video>,<audio>'; 
}

Nếu bạn cần cho phép tất cả các thẻ HTML, nghĩa là, không tước bỏ bất kỳ thẻ nào, strips_tags()chức năng có thể được bỏ qua / loại bỏ hoàn toàn.

Tuy nhiên, một điểm cần lưu ý, khi các thẻ html được cho phép, các thẻ này được tính là các từ, vì vậy số từ của bạn cho các đoạn trích có thẻ và không có thẻ sẽ không giống nhau. Để sửa lỗi đó, trước tiên bạn cần xóa các thẻ này khỏi số từ thực tế để chỉ các từ được tính.

Tôi đã viết một đoạn trích cho phép tất cả các thẻ, chỉ đếm các từ dưới dạng từ và hoàn thành một câu sau lượng từ đã đặt (vì vậy văn bản sẽ không bị cắt giữa câu) và thêm một văn bản đọc thêm sau từ cuối cùng .

Đây là mã hoàn chỉnh

function wpse_allowedtags() {
    // Add custom tags to this string
        return '<script>,<style>,<br>,<em>,<i>,<ul>,<ol>,<li>,<a>,<p>,<img>,<video>,<audio>'; 
    }

if ( ! function_exists( 'wpse_custom_wp_trim_excerpt' ) ) : 

    function wpse_custom_wp_trim_excerpt($wpse_excerpt) {
    $raw_excerpt = $wpse_excerpt;
        if ( '' == $wpse_excerpt ) {

            $wpse_excerpt = get_the_content('');
            $wpse_excerpt = strip_shortcodes( $wpse_excerpt );
            $wpse_excerpt = apply_filters('the_content', $wpse_excerpt);
            $wpse_excerpt = str_replace(']]>', ']]&gt;', $wpse_excerpt);
            $wpse_excerpt = strip_tags($wpse_excerpt, wpse_allowedtags()); /*IF you need to allow just certain tags. Delete if all tags are allowed */

            //Set the excerpt word count and only break after sentence is complete.
                $excerpt_word_count = 75;
                $excerpt_length = apply_filters('excerpt_length', $excerpt_word_count); 
                $tokens = array();
                $excerptOutput = '';
                $count = 0;

                // Divide the string into tokens; HTML tags, or words, followed by any whitespace
                preg_match_all('/(<[^>]+>|[^<>\s]+)\s*/u', $wpse_excerpt, $tokens);

                foreach ($tokens[0] as $token) { 

                    if ($count >= $excerpt_length && preg_match('/[\,\;\?\.\!]\s*$/uS', $token)) { 
                    // Limit reached, continue until , ; ? . or ! occur at the end
                        $excerptOutput .= trim($token);
                        break;
                    }

                    // Add words to complete sentence
                    $count++;

                    // Append what's left of the token
                    $excerptOutput .= $token;
                }

            $wpse_excerpt = trim(force_balance_tags($excerptOutput));

                $excerpt_end = ' <a href="'. esc_url( get_permalink() ) . '">' . '&nbsp;&raquo;&nbsp;' . sprintf(__( 'Read more about: %s &nbsp;&raquo;', 'wpse' ), get_the_title()) . '</a>'; 
                $excerpt_more = apply_filters('excerpt_more', ' ' . $excerpt_end); 

                //$pos = strrpos($wpse_excerpt, '</');
                //if ($pos !== false)
                // Inside last HTML tag
                //$wpse_excerpt = substr_replace($wpse_excerpt, $excerpt_end, $pos, 0); /* Add read more next to last word */
                //else
                // After the content
                $wpse_excerpt .= $excerpt_more; /*Add read more in new paragraph */

            return $wpse_excerpt;   

        }
        return apply_filters('wpse_custom_wp_trim_excerpt', $wpse_excerpt, $raw_excerpt);
    }

endif; 

remove_filter('get_the_excerpt', 'wp_trim_excerpt');
add_filter('get_the_excerpt', 'wpse_custom_wp_trim_excerpt'); 

Bạn chỉ có thể xóa '//' khỏi các chức năng mà bạn cần thêm.

TUYỆT VỜI TUYỆT VỜI

Đôi khi bạn cần hiển thị các đoạn trích đơn giản có độ dài khác nhau và không thể viết một đoạn trích cho mỗi bài đăng / chức năng / trang. Đây là một chức năng nhỏ nhỏ đẹp sử dụngwp_trim_words

function wpse_custom_excerpts($limit) {
    return wp_trim_words(get_the_excerpt(), $limit, '<a href="'. esc_url( get_permalink() ) . '">' . '&nbsp;&hellip;' . __( 'Read more &nbsp;&raquo;', 'wpse' ) . '</a>');
}

Chức năng nhỏ này làm là gì get_the_excerpt, cắt xén nó để $limitngười dùng thiết lập và trả lại văn bản với một liên kết đọc thêm ở cuối.

Bạn có thể gọi đoạn trích này như sau trong mẫu của bạn

echo wpse_custom_excerpts($limit);

nơi $limitsẽ là số từ của bạn, vì vậy một đoạn trích 30 từ sẽ là

echo wpse_custom_excerpts(30);

Chỉ có một điều cần nhớ ở đây, nếu bạn đặt giới hạn của mình thành hơn 55 từ đó, chỉ 55 từ sẽ được trả về vì đoạn trích chỉ dài 55 từ. Nếu đoạn trích dài hơn là cần thiết, sử dụng get_the_contentthay thế.

TUYỆT VỜI TUYỆT VỜI

Nếu bạn chỉ cần thay đổi độ dài the_excerpt(), bạn có thể sử dụng chức năng sau

function wpse_excerpt_length( $length ) {
    return 20;
}
add_filter( 'excerpt_length', 'wpse_excerpt_length', 999 );

Hãy nhớ rằng, bạn sẽ cần đặt mức ưu tiên lớn hơn 10 để chức năng tùy chỉnh của bạn thực thi sau mặc định.

THÊM XEM THÊM LIÊN KẾT

Tất cả văn bản được trả về bởi đoạn trích có phần bị ghét [...]ở cuối không thể nhấp được. Để thêm một văn bản đọc thêm ở vị trí địa ngục, sử dụng chức năng này

 function wpse_excerpt_more( $more ) {
    return ' <a class="read-more" href="'. get_permalink( get_the_ID() ) . '">' . __('Read More', 'your-text-domain') . '</a>';
}
add_filter( 'excerpt_more', 'wpse_excerpt_more' );

BIÊN TẬP

Đoạn đầu tiên

Tôi muốn giữ cho nó hoàn chỉnh, vì vậy đây là đoạn trích cắt sau đoạn đầu tiên.

Đây là một chức năng giữ các thẻ HTML trong chiến thuật, thêm liên kết "Đọc thêm" ở cuối đoạn trích và cắt đoạn trích sau đoạn đầu tiên.

if ( ! function_exists( 'wpse0001_custom_wp_trim_excerpt' ) ) : 

    function wpse0001_custom_wp_trim_excerpt($wpse0001_excerpt) {
        global $post;
        $raw_excerpt = $wpse0001_excerpt;
        if ( '' == $wpse0001_excerpt ) {

            $wpse0001_excerpt = get_the_content('');
            $wpse0001_excerpt = strip_shortcodes( $wpse0001_excerpt );
            $wpse0001_excerpt = apply_filters('the_content', $wpse0001_excerpt);
            $wpse0001_excerpt = substr( $wpse0001_excerpt, 0, strpos( $wpse0001_excerpt, '</p>' ) + 4 );
            $wpse0001_excerpt = str_replace(']]>', ']]&gt;', $wpse0001_excerpt);

            $excerpt_end = ' <a href="'. esc_url( get_permalink() ) . '">' . '&nbsp;&raquo;&nbsp;' . sprintf(__( 'Read more about: %s &nbsp;&raquo;', 'pietergoosen' ), get_the_title()) . '</a>'; 
            $excerpt_more = apply_filters('excerpt_more', ' ' . $excerpt_end); 

            //$pos = strrpos($wpse0001_excerpt, '</');
            //if ($pos !== false)
            // Inside last HTML tag
            //$wpse0001_excerpt = substr_replace($wpse0001_excerpt, $excerpt_end, $pos, 0);
            //else
            // After the content
            $wpse0001_excerpt .= $excerpt_more;

            return $wpse0001_excerpt;

        }
        return apply_filters('wpse0001_custom_wp_trim_excerpt', $wpse0001_excerpt, $raw_excerpt);
    }

endif; 

remove_filter('get_the_excerpt', 'wp_trim_excerpt');
add_filter('get_the_excerpt', 'wpse0001_custom_wp_trim_excerpt');

EDIT 29-10-2015

Đối với bất kỳ ai cần một cách giải quyết để không hiển thị liên kết đọc thêm sau đoạn trích khi đoạn trích ngắn hơn số lượng từ được đặt, vui lòng xem câu hỏi và câu trả lời sau đây


nơi chính xác tôi đặt phần này tôi đang function wpse_allowedtags() { // Add custom tags to this string return '<script>,<style>,<br>,<em>,<i>,<ul>,<ol>,<li>,<a>,<p>,<img>,<video>,<audio>'; }bối rối
dùng32447

1
Tất cả các mã này đi vào functions.php. Bạn có thể thêm nó ngay phía trên if ( ! function_exists( 'wpse_custom_wp_trim_excerpt' ) ) :trong của bạnfunctions.php
Pieter Goosen

1
nvm tôi đã bỏ lỡ đầu mã
user32447

1
nếu điều này đi vào tập tin tests.php sẽ không bị ghi đè khi có bản cập nhật?
mcgrailm

3
@mcgrailm vâng. Đó là lý do tại sao điều quan trọng là thêm phần này vào hàm.php của chủ đề con bạn . Bạn thậm chí có thể thêm nó vào một plugin phải sử dụng
Pieter Goosen

1

Thêm nhiều thẻ hơn nếu bạn cần vào $allowed_tags = ...

function _20170529_excerpt($text) {
$raw_excerpt = $text;
if ( '' == $text ) {
    //Retrieve the post content. 
    $text = get_the_content('');

    //Delete all shortcode tags from the content. 
    $text = strip_shortcodes( $text );

    $text = apply_filters('the_content', $text);
    $text = str_replace(']]>', ']]&gt;', $text);

    $allowed_tags = '<a>,<b>,<br><i>'; 
    $text = strip_tags($text, $allowed_tags);

    $excerpt_word_count = 55; /*** MODIFY THIS. change the excerpt word count to any integer you like.***/
    $excerpt_length = apply_filters('excerpt_length', $excerpt_word_count); 

    $excerpt_end = '[...]'; /*** MODIFY THIS. change the excerpt endind to something else.***/
    $excerpt_more = apply_filters('excerpt_more', ' ' . $excerpt_end);

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

Từ: http://bacsoftwareconsulting.com/blog/index.php/wordpress-cat/how-to-preserve-html-tags-in-wordpress-excerpt-without-a-plugin/


0

Bạn cũng có thể thêm trình soạn thảo văn bản phong phú cho các trích đoạn, thêm mã bên dưới vào tệp plugin hoặc tệp function.php của chủ đề và bạn sẽ có thể xem trình soạn thảo HTML cho các trích đoạn. Hơn nữa, nó cũng sẽ hiển thị các trích đoạn ở định dạng HTML. #cheers

Tôi đã sao chép nó từ đâu đó nhưng không nhớ nguồn. Tôi đang sử dụng điều này trong tất cả các dự án của tôi và nó đang hoạt động.

nhập mô tả hình ảnh ở đây

/**
  * Replaces the default excerpt editor with TinyMCE.
*/
add_action( 'add_meta_boxes', array ( 'T5_Richtext_Excerpt', 'switch_boxes' ) );
class T5_Richtext_Excerpt
{
    /**
     * Replaces the meta boxes.
     *
     * @return void
     */
    public static function switch_boxes()
    {
        if ( ! post_type_supports( $GLOBALS['post']->post_type, 'excerpt' ) )
        {
            return;
        }

        remove_meta_box(
            'postexcerpt', // ID
            '',            // Screen, empty to support all post types
            'normal'      // Context
        );

        add_meta_box(
            'postexcerpt2',     // Reusing just 'postexcerpt' doesn't work.
            __( 'Excerpt' ),    // Title
            array ( __CLASS__, 'show' ), // Display function
            null,              // Screen, we use all screens with meta boxes.
            'normal',          // Context
            'core',            // Priority
        );
    }

    /**
     * Output for the meta box.
     *
     * @param  object $post
     * @return void
     */
    public static function show( $post )
    {
        ?>
        <label class="screen-reader-text" for="excerpt"><?php
        _e( 'Excerpt' )
        ?></label>
        <?php
            // We use the default name, 'excerpt', so we don’t have to care about
            // saving, other filters etc.
            wp_editor(
                self::unescape( $post->post_excerpt ),
                'excerpt',
                array (
                    'textarea_rows' => 15,
                    'media_buttons' => FALSE,
                    'teeny'         => TRUE,
                    'tinymce'       => TRUE
                )
            );
    }

    /**
     * The excerpt is escaped usually. This breaks the HTML editor.
     *
     * @param  string $str
     * @return string
     */
    public static function unescape( $str )
    {
        return str_replace(
            array ( '&lt;', '&gt;', '&quot;', '&amp;', '&nbsp;', '&amp;nbsp;' ),
                array ( '<',    '>',    '"',      '&',     ' ', ' ' ),
                $str
        );
    }
}
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.