シナリオは、スライドショーの下にHTMLバナーを追加する必要があるということです。これはホームページコンテンツのショートコードです。私は個人的にはTinyMCEエディタにたくさんのdiv
タグを追加するのが嫌いなので、the_content
をフィルタし、特定のショートコードの後に私のHTMLを追加しようとしています。以下が解決策ですが、これを解決するためのより良い方法があるかどうかはわかりませんでした。
特定のショートコードの後にコンテンツを追加する最善の方法は何ですか?
この種のラッパーを使って[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()
を使用して前のショートコードのコールバックを実行します。
これは私がそれを少し洗練した後に思いついた解決策です。以下の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' );