Сценарий заключается в том, что мне нужно добавить баннер HTML под слайд-шоу, которое является коротким кодом на домашней странице. Я лично ненавижу добавлять кучу тегов div
в редактор TinyMCE, поэтому я пытаюсь отфильтровать the_content
и добавить свой HTML после определенного the_content
кода. Ниже приведено решение, но я не был уверен, есть ли лучший способ сделать это.
Каков наилучший способ добавления контента после определенных коротких кодов?
Интересно, можете ли вы переопределить [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()
– 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
действие after_setup_theme
и используем call_user_func()
для запуска обратного вызова предыдущего call_user_func()
, аналогично тому, как это делается в do_shortcode_tag()
.
Это решение, которое я придумал, немного уточнив его. Нижеследующее действие должно выполняться только в том случае, если в контенте имеется короткий код. Он перебирает все короткие коды, чтобы найти конкретный, который нам нужен, заменяет его кодом короткого замыкания и новым 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' );