¿Cuál es la mejor forma de habilitar shortcodes anidados?
¿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.

http://codex.wordpress.org/Shortcode_API#Nested_Shortcodes
Todo lo que necesitas saber sobre shortcodes anidados en WordPress

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?

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

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()"

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.

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 sí 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!

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]
