问题描述

这种情况是我需要在主页内容中的一个短码的幻灯片中添加一个 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 辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:薇晓朵技术论坛。