这是一个很好的问题——我认为目前没有黑客攻击是不可能的。这是我的尝试:
<?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
数组)。