Intereting Posts
Создание клиентской страницы Добавьте расширение .html (точка HTML) в пользовательские типы сообщений Отображение типа проекта в HREF Проблема безопасности с параметрами «paged» и «posts_per_page», взятыми непосредственно из запроса POST? Как я могу создать меню, как в примере? Импорт базы данных mysql wordpress в неизвестный сервер / домен Как установить или переопределить шрифт Fallback для символов второго языка? WordPress wp_link_pages показывает только следующую / предыдущую ссылку Динамически добавляя фильтры 3 После того, как Apostrophe появится в пользовательских полях после обновления сайта продукта, Как обновить термин таксономии для персонализированного типа сообщения с автоматически увеличивающимся номером изменение цвета фона фона для пользовательского типа сообщения в блоке администратора как получить список форматов сообщений, поддерживаемых темой? Почему только первая операция выполняется в моем цикле – за исключением последнего повтора? Изменить комментарий Автор Показать имя

Вставка пользовательского HTML после короткого кода

Сценарий заключается в том, что мне нужно добавить баннер 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' );