Código abreviado dentro de [título] no se procesa

2

Los títulos en wordpress no admiten códigos cortos anidados en este momento ( v3.6 ). Por lo tanto, si escribo

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

Se supone que la ciudad debe procesarse pero no lo hace. ¿Cómo soluciono esto?

Boleto: # 24990

    
pregunta Sisir 08.09.2013 - 19:37

3 respuestas

3

Hay un gancho dentro del código corto del título que Te permitirá secuestrar todo el asunto. La mayoría de lo siguiente se copia de la función 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);
    
respondido por el s_ha_dum 08.09.2013 - 20:24
3

Las últimas versiones de WP realmente han mejorado la capacidad de filtrado de los argumentos de subtítulos, por lo que creo que esta nueva respuesta tendrá el menor impacto y la operación más segura.

Lo que debemos hacer es filtrar directamente $atts['caption'] durante shortcode_atts() para el código corto [caption] . Podemos hacer esto con el filtro shortcode_atts_caption que solo afecta el shortcode del título.

Como bono, agregué una línea comentada que probará el título para un shortcode específico antes de ejecutar do_shortcode() . Esto es útil si solo desea habilitar un shortcode en particular en los subtítulos (lo uso para habilitar solo el Shortcode Shortcode ) . Sin embargo, tenga cuidado: do_shortcode() procesará todos los códigos cortos, no solo el que probó.

/**
 * 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);
    
respondido por el jerclarke 21.04.2015 - 19:06
2

Usando la última función has_shortcode() introducida en 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;
    }

Esta solución se puede usar en cualquier código de disparo de terceros que no haya implementado el soporte de shortcode anidado.

¡Cualquier solución mejor bienvenida!

    
respondido por el Sisir 08.09.2013 - 19:37

Lea otras preguntas en las etiquetas