在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\', \' \' . \'… <br /><a href="\'.get_permalink($post->id).\'" class="more-link">\'.$more_text.\'</a>\');
} else {
$excerpt_more = apply_filters(\'excerpt_more\', \' \' . \'…<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网友: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网友: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\', \' \' . \'… <br /><a href="\'.get_permalink($post->id).\'" class="more-link">\'.$more_text.\'</a>\');
} else {
$excerpt_more = apply_filters(\'excerpt_more\', \' \' . \'…<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;
}