1

複数のショートコードを含むページがあります。各ショートコードのコンテンツを HTML タグでラップしたいと考えています。ほとんど機能する次のコードがありますが、すべてのショートコードを 1 つの 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();

もちろん、2番目の方法を使用する場合は、行を削除することを忘れないでください

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

関数のボーナスとして、my_override_shortcodes()上書きされないショートコード ($disabled_tags配列) を指定できます。

于 2013-10-28T17:38:05.950 に答える