Allow HTML in excerpt

时间:2014-04-12 作者:user32447

这是我的摘录代码。

// Generate custom excerpt length
function wpbx_excerpt_length($length) {
    return 300;
}
add_filter(\'excerpt_length\', \'wpbx_excerpt_length\');
如何允许类似html的<a> <b> <i> <br>

3 个回复
最合适的回答,由SO网友:Pieter Goosen 整理而成

COMPLETE GUIDE TO EXCERPTS

我最近回答了一些关于摘录的问题,所以我将尽可能详细地解释。

PREFACE

这个答案似乎提出了几个关于代码应该放在哪里的问题,答案是,这真的取决于您以及您认为合适的方式。有几个选项可以放置代码(如果没有明确说明):

主题的功能。php或任何用作函数文件的文件。请记住,当您这样做时,如果主题不是您自己的,那么在升级主题时,所有更改都将丢失

更好的方法是在子主题中使用代码。如上所述,在函数中。php或函数相关文件

使用插件中的代码。这是首选的方式,因为这使得代码可以跨所有主题使用。如果切换主题,就不必担心重写相同的代码。

我希望这能把事情弄清楚一点:-)

HTML TAGS/FORMATTING

the_excerpt() 首先,不接受任何参数,因此无法向其传递任何内容。事实是the_excerpt() 将内容裁剪为55个单词,所有HTML标记在返回文本之前都会被剥离。the_excerpt() 位于wp-includes/post-template.php. 要允许摘录中包含某些或所有HTML标记,必须创建一个新的摘录。

首先,需要先删除原始函数,然后将新函数挂接到get_the_excerpt. 请注意,此新摘录仍可以调用为the_excerpt() 在模板文件中,无需更改。get_the_excerpt() 位于wp-includes/post-template.php.

摘录使用wp_trim_excerpt 要返回修剪过的文本,我们需要删除wp_trim_excerpt 首先来自摘录过滤器。wp_trim_excerpt() 位于wp-includes/formatting.php, 第2355行。这就是为什么:

remove_filter(\'get_the_excerpt\', \'wp_trim_excerpt\');
您现在可以将新摘录添加到get_the_excerpt

add_filter(\'get_the_excerpt\', \'wpse_custom_wp_trim_excerpt\');
要允许html标记/格式,我们需要指定您需要允许哪些标记。您可以使用以下strip_tags 实现这一目标的声明

$wpse_excerpt = strip_tags($wpse_excerpt, wpse_allowedtags());
第二个参数wpse_allowedtags() 是一个用于添加标记的小函数the_excerpt() 将允许。有关有效HTML 5标记的完整列表,请访问并查看here. 这里是函数,向其中添加您需要允许/保留的任何html标记

function wpse_allowedtags() {
// Add custom tags to this string
    return \'<script>,<style>,<br>,<em>,<i>,<ul>,<ol>,<li>,<a>,<p>,<img>,<video>,<audio>\'; 
}
如果需要允许所有HTML标记,即不剥离任何标记strips_tags() 功能可以完全省略/删除。

然而,需要注意的是,当允许使用html标记时,这些标记将计为单词,因此有标记和无标记摘录的字数将不相同。要纠正这一点,您需要首先从实际字数中删除这些标记,以便只计算字数。

我写了一篇摘录,它将允许所有标记,只将单词计算为单词,并在设定的单词数量后完成一个句子(这样文本不会在句子中间被删掉),并在最后一个单词后添加一个阅读更多的文本。

这是完整的代码

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\'); 
只需从需要额外的函数中删除“//”。

CUSTOM EXCERPT LENGTHS

有时,您需要显示不同长度的简单摘录,并且不可能为每个帖子/功能/页面都编写摘录。下面是一个很好的小函数wp_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>\');
}
这个小函数的作用是get_the_excerpt, 将其修剪为$limit 由用户设置,并返回文本,最后带有“阅读更多”链接。

您可以在模板中调用此摘录,如下所示

echo wpse_custom_excerpts($limit);
在哪里$limit 将是你的字数,因此30个单词的摘录将

echo wpse_custom_excerpts(30);
这里只需要记住一件事,如果您将限制设置为超过55个单词,那么只会返回55个单词,因为摘录的长度只有55个单词。如果需要更长的摘录,请使用get_the_content 相反

CUSTOM EXCERPT LENGTH

如果您只需要更改the_excerpt(), 您可以使用以下功能

function wpse_excerpt_length( $length ) {
    return 20;
}
add_filter( \'excerpt_length\', \'wpse_excerpt_length\', 999 );
请记住,您需要设置大于10的优先级,以便自定义函数在默认值之后执行。

ADD READ MORE LINK

摘录返回的所有文本都具有[...] 最后是不可点击的。要在hellips位置添加阅读更多文本,请使用此函数

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

EDIT

Excerpt first paragraph

我想保持完整,所以这里是第一段之后的摘录。

这里有一个函数,它可以保持HTML标记的灵活性,在摘录的末尾添加一个“阅读更多”链接,并在第一段后修剪摘录。

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

编辑2015年10月29日

如果任何人需要一种解决方法,以便在摘录后不显示“阅读更多”链接,当摘录短于所设置的字数时,请参阅以下问题和答案

SO网友:prosti

如果需要,请添加更多标记$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);
}
发件人:http://bacsoftwareconsulting.com/blog/index.php/wordpress-cat/how-to-preserve-html-tags-in-wordpress-excerpt-without-a-plugin/

SO网友:Mayur Chauhan

您还可以为摘录添加富文本编辑器,在插件文件或主题函数中添加以下代码。php文件,您将能够看到摘录的HTML编辑器。此外,它还将以HTML格式呈现摘录#干杯

我从某处复制了这个,但不记得来源。我在我的所有项目中都使用了它,而且它正在发挥作用。

编辑:此复制自Adding a rich text editor to Excerpt 2012福霞回答

enter image description here

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

结束