web-dev-qa-db-fra.com

Shortcode imbriqué à l'intérieur [légende] ne traite pas

Les légendes dans wordpress ne prennent pas en charge les codes abrégés imbriqués pour le moment (v3.6). Donc, si j'écris

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

Où la ville est supposée être traitée mais pas. Comment puis-je résoudre ce problème?

Ticket: # 24990

2
Sisir

Il y a un crochet à l'intérieur du shortcode de légende qui vous permettra de détourner tout. La plupart des éléments suivants sont copiés à partir de la fonction Core 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
s_ha_dum

Les dernières versions de WP ont vraiment amélioré la filtrabilité des arguments de légende. Je pense donc que cette nouvelle réponse aura la plus petite empreinte possible et un fonctionnement plus sûr.

Ce que nous devons faire, c'est filtrer directement $atts['caption'] pendant shortcode_atts() pour le shortcode [caption]. Nous pouvons faire cela avec le filtre shortcode_atts_caption qui n'affecte que le shortcode de la légende.

En prime, j'ai ajouté une ligne commentée qui testera la légende pour un shortcode spécifique avant d'exécuter do_shortcode(). C'est utile si vous voulez seulement activer un shortcode particulier dans les légendes (je l'utilise pour n'activer que le Shortcode Shortcode ). Attention cependant: do_shortcode() traitera tous les codes courts, pas seulement celui que vous avez testé.

/**
 * 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);
3
jerclarke

Utilisation de la dernière fonction has_shortcode() introduite dans 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;
    }

Cette solution peut être utilisée sur n'importe quel code de tir tiers qui n'a pas implémenté la prise en charge de shortcode imbriquée.

Toute meilleure solution est la bienvenue!

2
Sisir