Вложенный Шорткод Внутри [подпись] Не Обрабатывается


Подписи в wordpress на данный момент не поддерживают вложенные короткие коды (v3.6). Итак, если я напишу

[caption]<img src=""> I love my [city][/caption]

Где предполагается, что город обрабатывается, но это не так. Как мне это исправить?

Билет: #24990

Author: Sisir, 2013-09-08

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);
 3
Author: s_ha_dum, 2013-09-08 18:24:15

Последние версии 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);
 4
Author: jerclarke, 2015-04-21 17:29:24

Используя последнюю функцию 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;
    }

Это решение может быть использовано для любого стороннего шоткода, в котором не реализована поддержка вложенных шорткодов.

Любое лучшее решение приветствуется!

 2
Author: Sisir, 2013-09-08 17:42:45