_Excerpt筛选器未按预期工作

时间:2018-04-26 作者:Mihai

我有个问题the_excerpt 滤器出于某种原因,如果在帖子列表中显示的帖子只包含短代码,它将无论如何执行这些短代码。

我想要的是,如果它是一个封闭的短代码,则显示内容;如果它是一个自动关闭的短代码,则将其全部删除,如果是这种情况,则返回一个空字符串。

我用这个函数去掉所有的短代码(因为strip_shortcodes($content)) 也不起作用:

add_filter(\'the_excerpt\', \'my_custom_excerpt\' );
function my_custom_excerpt() {
  global $post;

  $post_excerpt       = $post->post_excerpt != "" ? $post->post_excerpt : strip_tags($post->post_content);
  $excerpt_more       = "...";
  $excerpt_length     = 30;
  $clean_excerpt      = strpos($post_excerpt, \'...\') ? current(explode($post_excerpt, $excerpt_more, \'1\')) : $post_excerpt;
  $clean_excerpt      = strip_shortcodes(preg_replace("/\\[[\\/]?[^\\]]*\\]/", "", $clean_excerpt));
  $excerpt_word_array = explode(\' \', $clean_excerpt);
  $word_count         = count($excerpt_word_array);
  $excerpt_word_array = array_slice($excerpt_word_array, 0, $excerpt_length);
  if ($word_count > $excerpt_length) {
    $excerpt = implode(\' \', $excerpt_word_array) . $excerpt_more;
  }
  else {
    $excerpt = implode(\' \', $excerpt_word_array);
  }
  return $excerpt;
}
我有一个自定义的短代码,它生成一个图像滑块,在html之后,它输出一个带有slider init函数的脚本标记(基本内容)。

在这篇文章的摘录中,我看到了javascript输出,这非常奇怪。

访问帖子时,我看到滑块按预期运行,html结构看起来很好。

无论如何如果您有任何关于发生这种情况的原因和可能的修复方法的指针,那就太好了。

PS:上面的代码可以工作,if语句在我的测试中是可以的,问题是只有当帖子只包含短代码时,事情变得奇怪。如果我在摘录变量中添加了一些内容,那么它将按预期工作,并且只打印出我添加的内容。

所以如果我这样做了

else {
        $excerpt = implode(\' \', $excerpt_word_array)."something";
      }
我看到了这篇文章的摘录,其中只包含我的短代码打印出来的“某物”。如前所述,如果没有它,它将打印javascript内容。这也很奇怪。

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

生成摘录是一个相当混乱的过滤器,因此很难准确地看到发生了什么,但我的猜测是:

WordPress附加default filter (参见第148行)至get_the_excerpt, 即wp_trim_excerpt. 正如您从后一个函数的源代码中看到的,如果传递给内容的是空字符串,它将从获取内容开始。现在,如果这个过滤器在您的之后执行,并且帖子中只有短代码,那么您的过滤器将传递一个空字符串,默认过滤器将忽略您所做的一切,并开始生成自己的摘录。因此,您可以通过更改过滤器的优先级来确保稍后执行过滤器:

add_filter (\'the_excerpt\', \'my_custom_excerpt\', 1, 20);
或者,您可以删除该过滤器:

remove_filter(\'get_the_excerpt\', \'wp_trim_excerpt\', 10);

结束

相关推荐

_Excerpt显示每个帖子的摘录

我有一个用于输出所有帖子的简单页面(index.php),不幸的是,摘录显示了所有条目的摘录。怎么了? <?php while (have_posts()) : the_post(); ?> <div class=\"col col-md-6\"> <div class=\"thumbnail equalize-content\">