无法剥离JW播放器短码?

时间:2011-05-19 作者:Jonathan Wold

在WordPress归档模板上,我使用了一个自定义摘录函数,其中包括对strip_shortcodes(). 出于某种原因,短代码正在呈现并显示在存档中。

示例:http://arisehub.org/blog/page/2/

向下滚动至“与约书亚·坎宁安一起唱新歌”

请注意显示的脚本代码。这是对JW Player, 显示渲染的。

下面是我用于自定义摘录函数的代码。

function custom_excerpt($length, $more_text) { 
    global $post;     
    $text = get_the_content(); 
    $text = strip_shortcodes( $text );    
    $text = apply_filters(\'the_content\', $text);  
    $text = str_replace(\']]>\', \']]>\', $text);  
    $text = strip_tags($text, \'<a>, <p>, <strong>, <em>, <b>\');


    if(!empty($length)){
        $excerpt_length = apply_filters(\'excerpt_length\', $length); 
    } else {
        $excerpt_length = apply_filters(\'excerpt_length\', 180); 
    }

    if(!empty($more_text)){
        $excerpt_more = apply_filters(\'excerpt_more\', \' \' . \'&hellip; <br /><a href="\'.get_permalink($post->id).\'" class="more-link">\'.$more_text.\'</a>\');
    } else { 
        $excerpt_more = apply_filters(\'excerpt_more\', \' \' . \'&hellip;<a href="\'.get_permalink($post->id).\'" class="more-link">+ more</a>\');
    }

    $words = preg_split(\'/(<a.*?a>)|\\n|\\r|\\t|\\s/\', $text, $excerpt_length + 1, PREG_SPLIT_NO_EMPTY|PREG_SPLIT_DELIM_CAPTURE );  
    if ( count($words) > $excerpt_length ) {  
        array_pop($words);  
        $text = implode(\' \', $words);  
        $text = $text . $excerpt_more;  
    } else {  
        $text = implode(\' \', $words);  
    }  
    $output = \'<p>\'.$text.\'</p>\';
    echo $output;  
} 
有什么想法吗?

5 个回复
最合适的回答,由SO网友:Jan Fabry 整理而成

JW Player Plugin for WordPress 不会像所有其他短代码一样注册其短代码,因此strip_shortcodes() 不会知道,也不会剥掉它。在里面the code 需要注意的是,这是因为它使用了参数名和. 而WordPress不支持这一点。

可能有多种方法可以解决这个问题,但我会从strip_shortcodes() 并从插件中集成regex:

function custom_excerpt( $length, $more_text ) {
    global $post;
    $text = get_the_content();
    $text = strip_shortcodes( $text );
    // Strip JW Player shortcode too
    $text = preg_replace( \'/(.?)\\[(jwplayer)\\b(.*?)(?:(\\/))?\\](?:(.+?)\\[\\/\\2\\])?(.?)/s\', \'$1$6\', $text );
    $text = apply_filters(\'the_content\', $text);
    // Continue with the rest of your function ...

SO网友:Matthew Muro

上有一个函数Codex page for strip_shortcodes 这就是您需要的:

function remove_shortcode_from_index($content) {
  if ( is_home() ) {
    $content = strip_shortcodes( $content );
  }
  return $content;
}
add_filter(\'the_content\', \'remove_shortcode_from_index\');
在您的情况下,您可以将其应用于归档页面或任何您想要的地方。

SO网友:Mike

我做了一些挖掘,试图重新创建这个场景。

我能想到的唯一可能对您有所帮助的答案是,您的JWPlayer短代码被添加到\\u内容的过滤器中的短代码列表中。

strip\\u shortcode仅在以前将一个短代码添加到短代码列表中时有效。。因此,我的怀疑是,调用JWPlayer时没有添加JWPlayer短代码,而是添加到过滤器中。

解决这个问题有两种方法。

在将strip\\u短代码添加到列表之前,先添加您自己的同名短代码,添加strip\\u短代码删除它的功能,但是这将从所有例外中删除您的JWPlayer(可能是您想要的,也可能不是您想要的)

  • 修改添加短代码的JWPlayer位置,以便在调用\\u内容筛选器之前可用
  • 编辑#1的注释:在您完成strip\\u短代码后,我将删除您添加的短代码,只是为了防止需要在同一页面上的其他地方(摘录之外)调用JWPlayer,添加两个短代码可能会发生冲突,具体取决于加载顺序。

    #1的解决方案:

    function nullfunc(){
      return \'\';
    }
    // put that function outside, it\'s the placeholder function just so the shortcode registers properly, if the callback isn\'t a valid function - it won\'t register.
    
    // do your get_the_content() here
    add_shortcode(\'<replace_with_shortcode_for_JWPlayer\',\'nullfunc\');
    // do your strip shortcodes here
    remove_shortcode(\'<rplace_with_shortcode_for_JWPlayer\');
    
    // continue on with the rest of your code.
    
    这些都是基于我自己可以重新创建的内容,我不能百分之百肯定它们会对您有所帮助,尽管我想不出strip\\u短代码会失败的任何其他原因,这是唯一对我有意义的场景。

    SO网友:Hameedullah Khan

    请尝试下面的代码。当您的custom_excerpt 函数被调用。网站的其余部分将不受影响。我不确定你的计划如何get_the_content 函数获取内容。所以这个过滤器也会处理它。

    function my_strip_jwplayer( $content ) {
        $content = strip_shortcodes( $content );
        return $content;
    }
    
    function custom_excerpt($length, $more_text) { 
    global $post;     
    
    // add a custom filter
    add_filter(\'the_content\', \'my_strip_jwplayer\', 10);
    
    
    $text = get_the_content(); 
    $text = apply_filters(\'the_content\', $text);  
    $text = str_replace(\']]>\', \']]>\', $text);  
    $text = strip_tags($text, \'<a>, <p>, <strong>, <em>, <b>\');
    
    
    if(!empty($length)){
        $excerpt_length = apply_filters(\'excerpt_length\', $length); 
    } else {
        $excerpt_length = apply_filters(\'excerpt_length\', 180); 
    }
    
    if(!empty($more_text)){
        $excerpt_more = apply_filters(\'excerpt_more\', \' \' . \'&hellip; <br /><a href="\'.get_permalink($post->id).\'" class="more-link">\'.$more_text.\'</a>\');
    } else { 
        $excerpt_more = apply_filters(\'excerpt_more\', \' \' . \'&hellip;<a href="\'.get_permalink($post->id).\'" class="more-link">+ more</a>\');
    }
    
    $words = preg_split(\'/(<a.*?a>)|\\n|\\r|\\t|\\s/\', $text, $excerpt_length + 1, PREG_SPLIT_NO_EMPTY|PREG_SPLIT_DELIM_CAPTURE );  
    if ( count($words) > $excerpt_length ) {  
        array_pop($words);  
        $text = implode(\' \', $words);  
        $text = $text . $excerpt_more;  
    } else {  
        $text = implode(\' \', $words);  
    }  
    $output = \'<p>\'.$text.\'</p>\';
    echo $output;  
    
    } 
    

    SO网友:mfields

    这里只想在黑暗中进行一次尝试,但在查看代码后,您可能希望尝试交换以下两行的顺序:

    $text = strip_shortcodes( $text );    
    $text = apply_filters(\'the_content\', $text);
    
    据我所知,do\\u shortcode()应用于11处的“the\\u content”过滤器。您正在删除它,然后再将其添加回来。改为执行此操作:

    $text = apply_filters(\'the_content\', $text);    
    $text = strip_shortcodes( $text );    
    
    可能会有帮助。

    结束

    相关推荐

    GET the excerpt by ID

    为什么一个人不能像ID一样获得标题和大多数其他元素的摘录。例如,获取\\u摘录(ID)。我知道如何将其与$post->post\\u extract函数一起使用,但如果没有输入摘录,则不会返回部分内容,simple不会返回任何内容。所以我要做的是,如果有摘录,就通过ID获取摘录,如果没有ID的摘录,但有一些内容,就获取一些内容。人们会怎么做呢。任何想法,非凡的编辑--按要求循环源代码。<?php $stories = get_posts(\'category_name=feedback&