在WordPress中启用摘录格式时出现问题

时间:2012-04-07 作者:its_me

这是我在主题函数中添加的内容。在Wordpress中启用摘录格式的php文件(source of the tip):

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

function bwp_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);
        $text = strip_tags($text, \'<em><strong><i><b><a><code>\');
        $excerpt_length = apply_filters(\'excerpt_length\', 55);
        $excerpt_more = apply_filters(\'excerpt_more\', \' \' . \'[...]\');
        $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);
}
在文章摘要中启用格式的问题似乎是,如果由标记格式化的文本<b>, <strong>, <i>, <em>, 或任何其他相关内容),则整个页面的格式将被该标记覆盖。例如,请查看此屏幕截图:

Screenshot

我认为这就是为什么默认情况下不启用摘录格式的原因。有没有办法解决这个问题?代码有问题吗?

希望我能在这里得到一些帮助。谢谢

2 个回复
最合适的回答,由SO网友:Adam 整理而成

这就是为什么要从摘录中删除HTML标记的原因之一,以防止此类问题的发生。然而,有志者事竟成。。。

通过使用正则表达式,您可以关闭仅适用于摘录的打开标记,您可能需要查看以下链接以了解一些想法,

Close HTML Tags

或者你也可以使用这个为WordPress准备的插件,

Advanced Excerpt

或者,如果您觉得有这样的倾向,您可以修改它或对其结构进行采样,并将其应用到您的函数中。

更新

我决定运行一个测试,但是请注意,我使用了一个不同的函数,在创建可定制长度的摘录时,我经常使用这个函数;

将此应用到您的功能中。php文件,

function content($limit) {
global $content;
  $content = explode(\' \', get_the_content(), $limit);
  if (count($content)>=$limit) {
    array_pop($content);
    $content = implode(" ",$content).\'...\';
  } else {
    $content = implode(" ",$content);
  } 
  $content = preg_replace(\'/\\[.+\\]/\',\'\', $content);
  $content = apply_filters(\'the_content\', $content); 
  $content = str_replace(\']]>\', \']]&gt;\', $content);
  return $content;
}
然后是,

function closetags($html) {

  #put all opened tags into an array
  $content = $result;
  preg_match_all(\'#<([a-z]+)(?: .*)?(?<![/|/ ])>#iU\', $html, $result);
 $openedtags = $result[1];   #put all closed tags into an array
  preg_match_all(\'#</([a-z]+)>#iU\', $html, $result);
  $closedtags = $result[1];
  $len_opened = count($openedtags);
  # all tags are closed
  if (count($closedtags) == $len_opened) {
    return $html;
  }

  $openedtags = array_reverse($openedtags);
  # close tags
  for ($i=0; $i < $len_opened; $i++) {
    if (!in_array($openedtags[$i], $closedtags)){
      $html .= \'</\'.$openedtags[$i].\'>\';
    } else {
      unset($closedtags[array_search($openedtags[$i], $closedtags)]);    }
  }  
    return $html;
} 
然后在你的主题中,你会做以下事情,

<?php echo closetags( content(55) );?>  
其中55=您希望摘录的字数长度。

如果要使用后期编辑屏幕中的实际摘录框,还可以将此片段添加到函数文件中,

function excerpt($limit) {
global $excerpt;
  $excerpt = explode(\' \', get_the_excerpt(), $limit);
  if (count($excerpt)>=$limit) {
    array_pop($excerpt);
    $excerpt = implode(" ",$excerpt).\'...\';
  } else {
    $excerpt = implode(" ",$excerpt);
  } 
  $excerpt = preg_replace(\'/\\[.+\\]/\',\'\', $excerpt);
  $excerpt = apply_filters(\'the_excerpt\', $excerpt);
  $excerpt = str_replace(\']]>\', \']]&gt;\', $excerpt);
  return $excerpt;
}
它的用途是,

<?php echo closetags( excerpt(55) );?>  
但是,如果使用后期编辑屏幕中的实际摘录框,则必须手动编写<strong>,<em>,<i>,<a>,etc.. 当然是标签!除非修改摘录框的默认TinyMCE。

所以你有了它,你在这两种情况下都被涵盖了,要么。。。

1) 获取来自\\u内容的摘录()2)获取来自\\u摘录()的摘录

NOTE 通过编写关闭HTML标记的功能,可能有一种更有效的方法Milan 如果你想进一步调查的话。

SO网友:its_me

只需将此函数添加到主题函数中即可。php文件。代码已被清楚地注释,因此不言自明:

function better_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(\']]>\', \']]&gt;\', $text);

        // Removes any JavaScript in posts (between <script> and </script> tags)
        $text = preg_replace(\'@<script[^>]*?>.*?</script>@si\', \'\', $text);

        // Enable formatting in excerpts - Add HTML tags that you want to be parsed in excerpts, default is 55
        $text = strip_tags($text, \'<strong><b><em><i><a><code><kbd>\');

        // Set custom excerpt length - number of words to be shown in excerpts
        $excerpt_length = apply_filters(\'excerpt_length\', 55);

        // Modify excerpt more string at the end from [...] to ...
        $excerpt_more = apply_filters(\'excerpt_more\', \' \' . \'...\');

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

            // IMPORTANT! Prevents tags cutoff by excerpt (i.e. unclosed tags) from breaking formatting
            $text = force_balance_tags( $text );

            $text = $text . $excerpt_more;
        } else {
            $text = implode(\' \', $words);
        }
    }
    return apply_filters(\'wp_trim_excerpt\', $text, $raw_excerpt);
}

// Remove the native excerpt function, and replace it with our improved function
remove_filter(\'get_the_excerpt\', \'wp_trim_excerpt\');
add_filter(\'get_the_excerpt\', \'better_trim_excerpt\');
EDIT: 并确保在W3 Total Cache中关闭HTML缩小功能(如果您正在使用它)。

[Source Article]

结束

相关推荐

如何更改excerpt()方法的长度?

我正在使用\\u extract()方法显示博客帖子中的一些文字。我已经从这个链接读了这篇文章。http://codex.wordpress.org/Plugin_API/Filter_Reference/excerpt_length但我的情况不同。我在两个地方展示了帖子中的一些文字。在第一个位置,我想显示20个单词,在第二个位置,我想显示50个单词。那么我该怎么办呢?