Izinkan HTML dalam kutipan

56

Ini kode kutipan saya.

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

Bagaimana cara saya mengizinkan html <a> <b> <i> <br>

pengguna32447
sumber

Jawaban:

125

PETUNJUK SELESAI UNTUK NIAT

Saya baru-baru ini menjawab beberapa pertanyaan tentang kutipan, jadi saya akan memberikan penjelasan terperinci yang mencakup sebanyak mungkin.

KATA PENGANTAR

Tampaknya ada beberapa pertanyaan yang muncul dari jawaban ini di mana kode harus pergi, dan jawabannya adalah, itu benar-benar terserah Anda dan bagaimana Anda mau. Ada beberapa opsi untuk menempatkan kode (jika tidak secara eksplisit dinyatakan):

  • Dalam functions.php tema Anda atau file yang digunakan sebagai file fungsi. Ingat saja ketika Anda melakukan ini, jika tema itu bukan milik Anda, semua perubahan akan hilang ketika Anda meningkatkan tema Anda

  • Cara yang lebih baik adalah dengan menggunakan kode dalam tema anak. Seperti di atas, dalam file functions.php atau fungsi terkait

  • Gunakan kode dalam plugin. Ini adalah cara yang disukai karena ini membuat kode tersedia di semua tema. Jika Anda berganti tema, Anda tidak perlu khawatir menulis ulang kode yang sama.

Saya harap ini membersihkan sedikit :-)

HTML TAGS / FORMATTING

the_excerpt()pertama-tama tidak menerima parameter apa pun, jadi tidak ada yang dapat diteruskan ke sana. Ini adalah fakta yang the_excerpt()memotong konten menjadi 55 kata, dan semua tag HTML dilucuti sebelum mengembalikan teks. the_excerpt()terletak di wp-include / post-template.php . Untuk mengizinkan tag HTML tertentu atau semua di kutipan, kutipan baru harus dibuat.

Pertama-tama, fungsi asli harus dihapus terlebih dahulu, dan kemudian fungsi baru perlu dihubungkan get_the_excerpt. Harap perhatikan, kutipan baru ini masih dapat dipanggil seperti the_excerpt()pada file templat, tidak perlu mengubahnya. get_the_excerpt()terletak di wp-include / post-template.php .

Kutipan digunakan wp_trim_excerptuntuk mengembalikan teks yang dipangkas, jadi kita harus menghapus wp_trim_excerptdulu dari filter kutipan. wp_trim_excerpt()terletak di wp-include / formatting.php , baris 2355. Beginilah caranya:

remove_filter('get_the_excerpt', 'wp_trim_excerpt');

Sekarang Anda dapat menambahkan kutipan baru Anda get_the_excerpt

add_filter('get_the_excerpt', 'wpse_custom_wp_trim_excerpt');

Untuk mengizinkan tag / format html, kita perlu menentukan tag mana yang perlu Anda izinkan. Anda dapat menggunakan strip_tagspernyataan berikut untuk mencapai itu

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

Argumen kedua wpse_allowedtags()adalah fungsi kecil yang digunakan untuk menambahkan tag the_excerpt()akan memungkinkan. Untuk daftar lengkap tag HTML 5 yang valid, buka dan periksa di sini . Ini fungsinya, tambahkan tag html apa saja yang perlu Anda izinkan / simpan

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

Jika Anda perlu mengizinkan semua tag HTML, yaitu, tidak ada pengupasan tag apa pun, strips_tags()fungsinya dapat dihilangkan / dihapus sepenuhnya.

Poin yang perlu diperhatikan, ketika tag html diizinkan, tag ini dihitung sebagai kata, sehingga kata Anda dihitung untuk kutipan dengan tag dan tanpa tag tidak akan sama. Untuk memperbaikinya, Anda harus menghapus tag ini dari jumlah kata yang sebenarnya terlebih dahulu sehingga hanya kata-kata yang dihitung.

Saya telah menulis kutipan yang akan memungkinkan semua tag, hanya menghitung kata sebagai kata, dan menyelesaikan kalimat setelah jumlah kata yang ditentukan (sehingga teks tidak akan dipangkas di tengah kalimat) dan menambahkan teks baca lebih banyak setelah kata terakhir .

Ini kode lengkapnya

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

Anda cukup menghapus '//' dari fungsi yang Anda perlukan tambahan.

PANJANG EXCERPT KUSTOM

Terkadang Anda perlu menampilkan kutipan sederhana dengan panjang yang berbeda dan tidak layak untuk menulis kutipan untuk setiap postingan / fungsi / halaman. Ini adalah fungsi kecil kecil yang baguswp_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>');
}

Apa fungsi kecil ini adalah mengambil get_the_excerpt, memangkasnya untuk $limitditetapkan oleh pengguna, dan mengembalikan teks dengan tautan baca lebih lanjut di akhir.

Anda dapat memanggil kutipan ini dengan mengikuti di templat Anda

echo wpse_custom_excerpts($limit);

di mana $limitakan menjadi jumlah kata Anda, jadi kutipan dari 30 kata akan menjadi

echo wpse_custom_excerpts(30);

Hanya satu hal yang perlu diingat di sini, jika Anda menetapkan batas Anda lebih dari 55 kata, hanya 55 kata yang akan dikembalikan karena kutipan tersebut hanya memiliki panjang 55 kata. Jika kutipan lebih lama dibutuhkan, gunakan get_the_contentsaja.

PANJANG EXCERPT KUSTOM

Jika Anda hanya perlu mengubah panjangnya the_excerpt(), Anda dapat menggunakan fungsi berikut

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

Ingat, Anda harus menetapkan prioritas lebih besar dari 10 sehingga fungsi kustom Anda dieksekusi setelah default.

TAMBAH BACA LEBIH BANYAK LINK

Semua teks yang dikembalikan oleh kutipan memiliki kebencian [...]di akhir yang tidak dapat diklik. Untuk menambahkan lebih banyak teks sebagai ganti hellips, gunakan fungsi ini

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

SUNTING

Kutipan paragraf pertama

Saya ingin menyimpan ini lengkap, jadi di sini adalah kutipan yang dipangkas setelah paragraf pertama.

Berikut adalah fungsi yang menjaga tag HTML tetap aktif, menambahkan tautan "Baca Selengkapnya" di akhir kutipan dan memotong kutipan setelah paragraf pertama.

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

Bagi siapa pun yang membutuhkan solusi untuk tidak menampilkan tautan baca lebih lanjut setelah kutipan ketika kutipan lebih pendek dari jumlah kata yang ditetapkan, silakan lihat pertanyaan dan jawaban berikut

Pieter Goosen
sumber
di mana tepatnya saya menempatkan bagian ini function wpse_allowedtags() { // Add custom tags to this string return '<script>,<style>,<br>,<em>,<i>,<ul>,<ol>,<li>,<a>,<p>,<img>,<video>,<audio>'; }bingung
user32447
1
Semua kode ini masuk functions.php. Anda dapat menambahkannya tepat if ( ! function_exists( 'wpse_custom_wp_trim_excerpt' ) ) :di atas difunctions.php
Pieter Goosen
1
nvm saya melewatkan bagian atas kode
user32447
1
jika ini masuk ke file functions.php bukankah itu akan ditimpa ketika pembaruan datang?
mcgrailm
3
@ mikra film ya itu akan. Itulah mengapa penting untuk menambahkan ini ke functions.php tema anak Anda . Anda bahkan dapat menambahkannya ke plugin yang harus digunakan
Pieter Goosen
1

Tambahkan lebih banyak tag jika perlu $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);
}

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

prosti
sumber
0

Anda juga dapat menambahkan editor teks kaya untuk kutipan, menambahkan kode di bawah ini dalam file plugin atau file function.php tema dan Anda akan dapat melihat editor HTML untuk kutipan. Selain itu, itu akan membuat kutipan dalam format HTML juga. #tepuk tangan

Saya telah menyalin ini dari suatu tempat tetapi tidak ingat sumbernya. Saya menggunakan ini di semua proyek saya dan berfungsi.

masukkan deskripsi gambar di sini

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