WordPress 短码后插入自定义 HTML
问题描述
这种情况是我需要在主页内容中的一个短码的幻灯片中添加一个 HTML 横幅。我个人不喜欢在 TinyMCE 编辑器中添加一堆 div
标签,所以我试图过滤 the_content
,并在特定的短代码之后添加我的 HTML 。以下是一个解决方案,但我不知道是否有更好的方法来解决这个问题。
在特定短信之后添加内容的最佳方式是什么?
最佳解决方案
我想知道你是否可以使用这种封装来覆盖 [rev_slider]
:
add_shortcode( 'rev_slider', function( $atts = array(), $content = '' )
{
$html = '';
// Your custom banner HTML
$banner = '<div id="bannerHTML"><!-- banner HTML goes here --></div>';
// Append your banner HTML to the revslider's output
if( function_exists( 'rev_slider_shortcode' ) )
$html = rev_slider_shortcode( $atts, $content ) . $banner;
return $html;
} );
我们假设原始短码的回调是 rev_slider_shortcode()
。我们必须运行原来的。
Update
根据 @Sumit 的建议,我们可以尝试从 $shortcode_tags
数组获取短代码的回调。
以下是一个例子:
add_action( 'after_setup_theme', function() use ( &$shortcode_tags )
{
// Shortcode to override. Edit to your needs
$shortcode = 'rev_slider';
// Nothing to do if it's not registered as shortcode
if( ! shortcode_exists( $shortcode ) )
return;
// Get the shortcode's callback
$callback = $shortcode_tags[$shortcode];
// Override the shortcode
add_shortcode( $shortcode, function( $atts = array(), $content = '' ) use ( $callback )
{
// Your custom banner HTML
$banner = '<div id="bannerHTML">123<!-- banner HTML goes here --></div>';
// Append your banner HTML to the revslider's output
return
is_callable( $callback )
? call_user_func( $callback, $atts, $content, $callback ) . $banner
: '';
} );
}, PHP_INT_MAX );
这里我们将 after_setup_theme
动作拖到 after_setup_theme
动作中,并使用 call_user_func()
来运行以前的短代码回调,与 do_shortcode_tag()
相似。
次佳解决方案
这是一个解决方案,我已经提出了一点点。只有当内容中存在短码时,才应运行以下内容。它循环遍历所有的快捷码,找到我们需要的特定的代码,用短码替代新的 HTML:
function insert_after_shortcode( $content ) {
if( ! has_shortcode( $content, 'shortcode_name' ) ) {
return $content;
}
ob_start();
?>
<div id="bannerHTML"><!-- banner HTML goes here --></div>
<?php
$additional_html = ob_get_clean();
preg_match_all( '/'. get_shortcode_regex() .'/s', $content, $matches, PREG_SET_ORDER );
if( ! empty( $matches ) ) {
foreach ( $matches as $shortcode ) {
if ( 'shortcode_name' === $shortcode[2] ) {
$new_content = $shortcode[0] . $additional_html;
$content = str_replace( $shortcode[0], $new_content, $content );
}
}
}
return $content;
}
add_filter( 'the_content', 'insert_after_shortcode' );
参考文献
注:本文内容整合自 Google/Baidu/Bing 辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:薇晓朵技术论坛。