web-dev-qa-db-ja.com

ショートコードの後に​​カスタムHTMLを挿入

シナリオは、スライドショーの下にHTMLバナーを追加する必要があるということです。これはホームページコンテンツのショートコードです。私は個人的にはTinyMCEエディタにたくさんのdivタグを追加するのが嫌いなので、the_contentをフィルタし、特定のショートコードの後に​​私のHTMLを追加しようとしています。以下が解決策ですが、これを解決するためのより良い方法があるかどうかはわかりませんでした。

特定のショートコードの後に​​コンテンツを追加する最善の方法は何ですか?

6
Howdy_McGee

この種のラッパーを使って[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()であると仮定します。我々は元のものの後に走らなければなりません。

更新

@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アクションに遅れてフックし、call_user_func()で行われているのと同様に、do_shortcode_tag()を使用して前のショートコードのコールバックを実行します。

4
birgire

これは私がそれを少し洗練した後に思いついた解決策です。以下のshouldは、ショートコードがコンテンツに存在する場合にのみ実行されます。それは私達が必要とする特定のものを見つけるためにすべてのショートコードをループし、ショートコードと新しい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' );
2
Howdy_McGee