使用do_shortcode()在每个短代码周围包装HTML

时间:2013-10-28 17:23:44

标签: php wordpress wordpress-theming shortcode

我有一个页面上有多个短代码。我希望每个短代码的内容都包含一个HTML标记。我有以下几乎可以工作的代码,但它将所有短代码包装在一个div中。

<?php $sidebarBlocks = get_post_meta($post->ID, "page_sidebarhubspot", true); ?>
<?php echo do_shortcode('<div>'.$sidebarBlocks.'</div>'); ?>

这输出..

<div>
   <p>Content from shortcode1</p>
   <p>Content from shortcode2</p>
   <p>Content from shortcode3</p>
</div>

我想要的是......

<div>
   <p>Content from shortcode1</p>
</div>

<div>
   <p>Content from shortcode2</p>
</div>

<div>
   <p>Content from shortcode3</p>
</div>

我怎样才能做到这一点?谢谢!

2 个答案:

答案 0 :(得分:2)

这是一个很好的问题 - 如果没有黑客攻击,我认为目前不可能。这是我的意思:

<?php 
function my_override_shortcodes() {
    global $shortcode_tags, $_shortcode_tags;

    // Let's make a back-up of the shortcodes
    $_shortcode_tags = $shortcode_tags;

    // Add any shortcode tags that we shouldn't touch here
    $disabled_tags = array( 'gallery' );

    foreach ( $shortcode_tags as $tag => $cb ) {
        if ( in_array( $tag, $disabled_tags ) ) {
            continue;
        }
        // Overwrite the callback function
        $shortcode_tags[ $tag ] = 'my_wrap_shortcode_in_div';
    }
}
add_action( 'init', 'my_override_shortcodes', 9999 );

// Wrap the output of a shortcode in a div with class "i-wrap-you"
// The original callback is called from the $_shortcode_tags array
function my_wrap_shortcode_in_div( $attr, $content = null, $tag ) {
    global $_shortcode_tags;
    return '<div class="i-wrap-you">' . call_user_func( $_shortcode_tags[ $tag ], $attr, $content, $tag ) . '</div>';
}

所以这里发生的是在init上我们复制所有已注册的短代码并用我们自己的函数覆盖它们的回调函数。

当被调用时,该函数返回一个开始div标签,然后输出原始回调函数,然后是一个结束div标签。

如果您想覆盖do_shortcode次呼叫的短代码,可以执行以下操作:

function my_restore_shortcodes() {
    global $shortcode_tags, $_shortcode_tags;

    // Restore the original callbacks
    if ( isset( $_shortcode_tags ) ) {
        $shortcode_tags = $_shortcode_tags;
    }
}

在你的代码中执行以下操作:

$sidebarBlocks = get_post_meta( $post->ID, "page_sidebarhubspot", true );

my_override_shortcodes();

echo do_shortcode('<div>'.$sidebarBlocks.'</div>');

my_restore_shortcodes();

当然,如果您使用第二种方法,请不要忘记删除该行

add_action( 'init', 'my_override_shortcodes', 10 );

作为my_override_shortcodes()函数的奖励,您可以指定不会被覆盖的短代码($disabled_tags数组)。

答案 1 :(得分:0)

您可以尝试这样[您可以删除 htmlentities() 我已将其用于插图目的,只需使用简单 echo ]

<?php $sidebarBlocks = get_post_meta($post->ID, "page_sidebarhubspot", true); ?>
<?php 
$sidebarBlocks=str_replace("<p>","<div><p>",$sidebarBlocks);
$sidebarBlocks=str_replace("</p>","</p></div>",$sidebarBlocks);
echo htmlentities($str);
?>

输出:

<div><p>Content from shortcode1</p></div>
<div><p>Content from shortcode2</p></div>
<div><p>Content from shortcode3</p></div>