1

我有一个页面上有多个简码。我希望每个短代码的内容都用 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>

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

4

2 回答 2

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数组)。

于 2013-10-28T17:38:05.950 回答
0

你可以这样试试[你可以去掉 htmlentities()我已经用它来说明了,就用plain 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>
于 2013-10-28T17:31:17.507 回答