¿Cuál es la mejor forma de habilitar shortcodes anidados?

8 nov 2011, 18:22:46
Vistas: 14.6K
Votos: 6

¿Es esta la mejor manera de habilitar shortcodes anidados?:

add_filter( 'the_content', 'do_shortcode' );

Sigo encontrando resultados contradictorios y quiero asegurarme de no romper nada más.

0
Todas las respuestas a la pregunta 3
6

http://codex.wordpress.org/Shortcode_API#Nested_Shortcodes

Todo lo que necesitas saber sobre shortcodes anidados en WordPress

8 nov 2011 18:28:28
Comentarios

Eso menciona "siempre que sus funciones de manejo lo soporten llamando recursivamente a do_shortcode()" - Entonces, ¿hacerlo como arriba no sería la forma correcta?

hhins hhins
8 nov 2011 18:31:52

Quizás una pregunta más apropiada sería, ¿establecer lo anterior a la prioridad predeterminada (10) causaría problemas que desconozco?

hhins hhins
8 nov 2011 18:44:35

La línea de código que has publicado es inútil. Estás agregando la función do_shortcode al filtro the_content. WordPress ya hace eso automáticamente. Aplicarlo de nuevo no hará las cosas recursivas. Como dice el codex: "siempre que sus funciones de manejo lo soporten llamando recursivamente a do_shortcode()"

Scott Scott
8 nov 2011 19:22:42

¿Qué shortcode estás anidando?

Scott Scott
8 nov 2011 19:24:48

Son solo un puñado de diferentes shortcodes de columnas, no dependen de do_shortcode($content) en los shortcodes. Funciona con el filtro cambiado a prioridad 10, pero creo que simplemente los reescribiré para usar do_shortcode($content) como se indica. Agradezco tus rápidas respuestas.

hhins hhins
8 nov 2011 19:37:53

Por favor únete al chat porque creo que no estás entendiendo el punto de los shortcodes aquí.

Scott Scott
8 nov 2011 19:39:12
Mostrar los 1 comentarios restantes
0

Aquí hay una respuesta específica, para evitar depender de la documentación oficial de WP en la otra respuesta (que, al parecer, no ofrece instrucciones explícitas de todos modos).

Ejecutar do_shortcode() en la entrada

Aquí hay un ejemplo de registro de un shortcode que admite shortcodes anidados dentro de él:

function register_example_shortcode_with_nesting($atts, $text) {

    $output = do_shortcode($text);
    
    return $output;
}
add_shortcode('example_shortcode_with_nesting', 'register_example_shortcode_with_nesting');

Se usaría así:

[example_shortcode_with_nesting]
[nested_shortcode]
[other_nested_shortcode]
[/example_shortcode_with_nesting]

El ingrediente clave, por supuesto, es pasar el contenido de $text (que viene entre las etiquetas de apertura y cierre del shortcode) a través de do_shortcode(). Por defecto, WP toma el primer shortcode que puede ver, luego ignora cualquier shortcode dentro de ese, por lo que necesitamos decirle que "mire de nuevo", y este código hace el truco.

Por supuesto, el ejemplo anterior no hace nada útil, necesitarás actuar sobre $output usando $atts etcétera para que haga algo.

Advertencias sobre anidar shortcodes con etiquetas de cierre

  • Esto admite tener shortcodes dentro que tienen etiquetas de cierre, es decir, aquellos donde hay contenido en $text.
  • Pero puede salir mal si tienes varios del mismo shortcode anidados como hermanos.
  • Si tienes el mismo shortcode varias veces, WP puede confundirse sobre qué etiqueta de "apertura" aplica a qué etiqueta de "cierre", y automáticamente aplicará la primera instancia al primer cierre.

Así que aquí está mi regla general: Si un shortcode anidado tiene una etiqueta de cierre, debe ser el primero, el único de su tipo, o todos los shortcodes anidados coincidentes deben tener etiquetas de cierre.

Así que un ejemplo como este no te dará lo que esperas:

[example_shortcode_with_nesting]
[nested_shortcode id=1]
[nested_shortcode id=2][/nested_shortcode]
[/example_shortcode_with_nesting]

¿Qué pasa? ¡Obtienes el primer shortcode con id=1 renderizado con [/nested_shortcode] como su etiqueta de cierre, y el shortcode con id=2 como su contenido sin renderizar! ¡Vaya!

Así que, como dije antes, ¡o evitas tener el mismo shortcode varias veces, o te aseguras de que TODOS tengan tanto las etiquetas de apertura como las de cierre!

14 jun 2022 01:05:42
0

La mía no es realmente una respuesta, pero como he perdido mucho tiempo con esta pregunta, me gustaría resaltar un aspecto señalado por la respuesta de jerclarke: si el shortcode anidado y el que contiene son el mismo, el código no funcionará.

Como se indica en la documentación:

El analizador de shortcodes maneja correctamente los shortcodes anidados, siempre que sus funciones de soporte lo permitan llamando recursivamente a do_shortcode():

[tag-a]
   [tag-b]
      [tag-c]
   [/tag-b]
[/tag-a]

Sin embargo, el analizador fallará si un shortcode se usa para encerrar otro shortcode del mismo nombre:

[tag-a]
   [tag-a]
   [/tag-a]
[/tag-a]
10 mar 2024 11:02:58