Trimming breaks up markup

时间:2014-04-08 作者:Enrique Moreno Tent

假设我在一个字段中有此文本:

<p>The first expedition to the red planet has ended in disaster!</p>
<p>Your ship has crashed in the surface and all your equipment is lost. You managed to descent to safety with a single spacesuit and a limited amount of oxygen. Your only hope… to reach the rescue module before your air supply runs out!</p>
<p>With every step you are either closer to salvation or to your grave, be careful! Try finding the scattered remnants of your shipwreck across the&nbsp;dry landscape to help you in your journey; you will need the very precious o2 capsules and spare parts to upgrade your suit.</p>
<p>Hurry up, every second counts!</p>
如果我这样做,文本将毫无问题地显示:

$text = types_render_field(\'game-description\', array());
echo $text;
但如果我尝试自动构建一个摘录,如下所示:

$text = types_render_field(\'game-description\', array());
echo wp_trim_words($text, 65);
我意识到<p>\'s全部消失,文本如下所示:

第一次前往红色星球的探险队以灾难告终!你的船在水面上坠毁了,你所有的设备都丢失了。你只穿了一件宇航服,加上有限的氧气,就成功地降落到了安全的地方。你唯一的希望…在你的空气供应耗尽之前到达救援舱!每走一步,你要么离救赎更近,要么…

当我非常希望它是这样的:

第一次前往红色星球的探险队以灾难告终!

你的船在水面上坠毁了,你所有的设备都丢失了。你只穿了一件宇航服,加上有限的氧气,就成功地降落到了安全的地方。你唯一的希望…在你的空气供应耗尽之前到达救援舱!

每走一步,你要么离救赎更近,要么…

我知道你可以在每篇文章中撰写海关摘录,但想法是让它自动完成,并将此任务卸载到web维护人员上。

我能做些什么来解决这个问题吗?

UPDATE:我忘了说我在用分机Types, 这就是功能types_render_field 来自。基本上是为了获取自定义帖子的字段

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

正如托肖所说,types_render_field() 不是wordpress函数,所以您应该在某处声明它。

无论您是否使用wp_trim_excerptwp_trim_words. 如果需要在摘录中保留HTML格式,则需要创建自己的摘录函数。要执行此操作,首先需要删除wp_trim_excerpt 然后添加您自己的函数。

这是一段前写的自定义摘录。它在模板文件中正常调用,这意味着the_excerpt(). 此摘录保留所有HTML格式。它也只在, ; ? .! 这个Read more 文本出现在新段落中,但如果需要将其放在最后一个单词的旁边,可以将其删除// 从…起

//$pos = strrpos($pietergoosen_excerpt, \'</\');
//if ($pos !== false)
// Inside last HTML tag
//$pietergoosen_excerpt = substr_replace($pietergoosen_excerpt, $excerpt_end, $pos, 0);
//else
// After the content
这是我的摘录

if ( ! function_exists( \'pietergoosen_custom_wp_trim_excerpt\' ) ) : 

    function pietergoosen_custom_wp_trim_excerpt($pietergoosen_excerpt) {
    global $post;
    $raw_excerpt = $pietergoosen_excerpt;
        if ( \'\' == $pietergoosen_excerpt ) {

            $pietergoosen_excerpt = get_the_content(\'\');
            $pietergoosen_excerpt = strip_shortcodes( $pietergoosen_excerpt );
            $pietergoosen_excerpt = apply_filters(\'the_content\', $pietergoosen_excerpt);
            $pietergoosen_excerpt = str_replace(\']]>\', \']]&gt;\', $pietergoosen_excerpt);

            //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\', $pietergoosen_excerpt, $tokens);

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

                    if ($count >= $excerpt_word_count && 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;
                }

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

                $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($pietergoosen_excerpt, \'</\');
                //if ($pos !== false)
                // Inside last HTML tag
                //$pietergoosen_excerpt = substr_replace($pietergoosen_excerpt, $excerpt_end, $pos, 0);
                //else
                // After the content
                $pietergoosen_excerpt .= $excerpt_end;

            return $pietergoosen_excerpt;   

        }
        return apply_filters(\'pietergoosen_custom_wp_trim_excerpt\', $pietergoosen_excerpt, $raw_excerpt);
    }

endif; 

remove_filter(\'get_the_excerpt\', \'wp_trim_excerpt\');
add_filter(\'get_the_excerpt\', \'pietergoosen_custom_wp_trim_excerpt\'); 

结束

相关推荐

如何安全地清理接受完整HTML输入的文本区域

我正在开发一个插件,使用户可以在WordPress管理员中发送HTML电子邮件。我应该如何清理textarea输入?它必须能够包含HTML电子邮件中可能出现的全部HTML标记。如果我使用wp_kses() 然后我将不得不使用一个巨大的允许标记列表。textarea通过自定义选项将其内容保存到db。