Вложенный Шорткод Внутри [подпись] Не Обрабатывается
Подписи в wordpress на данный момент не поддерживают вложенные короткие коды (v3.6
). Итак, если я напишу
[caption]<img src=""> I love my [city][/caption]
Где предполагается, что город обрабатывается, но это не так. Как мне это исправить?
Билет: #24990
3 answers
Внутри шорткода заголовка есть крючок , который позволит вам захватить все это целиком. Большая часть следующего скопирована из основной функции img_caption_shortcode
.
function nested_img_caption_shortcode($nada, $attr, $content = null) {
extract(
shortcode_atts(
array(
'id' => '',
'align' => 'alignnone',
'width' => '',
'caption' => ''
),
$attr,
'caption'
)
);
$caption = do_shortcode($caption); // process nested shortcodes
if ( 1 > (int) $width || empty($caption) )
return $content;
if ( $id ) $id = 'id="' . esc_attr($id) . '" ';
return '<div ' . $id . 'class="wp-caption ' . esc_attr($align) . '" style="width: ' . (10 + (int) $width) . 'px">'
. do_shortcode( $content ) . '<p class="wp-caption-text">' . $caption . '</p></div>';
}
add_filter('img_caption_shortcode', 'nested_img_caption_shortcode', 1, 3);
Последние версии WP действительно улучшили фильтруемость аргументов подписи, поэтому я думаю, что этот новый ответ будет иметь наименьший объем и самую безопасную работу.
Что нам нужно сделать, так это напрямую отфильтровать $atts['caption']
во время shortcode_atts()
для шорткода [caption]
. Мы можем сделать это с помощью фильтра shortcode_atts_caption
, который влияет только на шорткод заголовка.
В качестве бонуса я добавил закомментированную строку, которая проверит заголовок на наличие определенного шорткода перед запуском do_shortcode()
. Это полезно, если вы хотите включить только определенный шорткод в подписях (я использую его для включения только шорткода Шорткода ). Однако будьте осторожны: do_shortcode()
обработает все короткие коды, а не только тот, который вы проверяли.
/**
* Filter Caption shortcode attributes to enable the [shortcode] shortcode inside caption text
*
* WP doesn't run do_shortcode on the 'caption' text value parsed out of [caption], which means
* the [shortcode] shortcode doesn't work.
*
* @param array $out atts array as determined by WP to be returned after filtering
* @param array $pairs
* @param array $atts
* @return filtered $out atts
*/
function wpse_113416_filter_shortcode_atts_caption($out, $pairs, $atts) {
// OPTIONAL: Look for a specific shortcode before running do_shortcode
// if (has_shortcode($out['caption'], 'shortcode_to_look_for'))
$out['caption'] = do_shortcode($out['caption']);
return $out;
}
add_filter('shortcode_atts_caption', 'wpse_113416_filter_shortcode_atts_caption', 10, 3);
Используя последнюю функцию has_shortcode()
, введенную на v3.6
add_filter( 'the_content', 'process_wp_caption_shortcodes' ); // hook it late
function process_wp_caption_shortcodes( $content ){
if( !function_exists ( 'has_shortcode' ) ) // no luck for user using older versions :)
return $content;
if( has_shortcode( get_the_content(), 'caption' ) ){ // check with raw content
// caption exists on the current post
$content = do_shortcode( $content );
}
return $content;
}
Это решение может быть использовано для любого стороннего шоткода, в котором не реализована поддержка вложенных шорткодов.
Любое лучшее решение приветствуется!