Qual è il modo migliore per abilitare gli shortcode annidati?
È questo il modo migliore per abilitare gli shortcode annidati?:
add_filter( 'the_content', 'do_shortcode' );
Continuo a trovare risultati contrastanti e voglio essere sicuro di non rompere nient'altro!

http://codex.wordpress.org/Shortcode_API#Nested_Shortcodes
Tutto ciò che devi sapere sugli shortcode annidati in WordPress

Che menziona "a condizione che le loro funzioni di gestione lo supportino richiamando ricorsivamente do_shortcode()" - Quindi, farlo come sopra non sarebbe la strada da percorrere?

Forse una domanda più appropriata sarebbe, impostare quanto sopra alla priorità predefinita (10) causerebbe problemi di cui non sono a conoscenza?

La riga di codice che hai postato è inutile. Stai aggiungendo la funzione do_shortcode al filtro the_content. WordPress lo fa già automaticamente. Applicarlo di nuovo non renderà le cose ricorsive. Come dice il codex: "a condizione che le loro funzioni di gestione lo supportino richiamando ricorsivamente do_shortcode()"

Sono solo una manciata di shortcode di colonne diversi, non si basano su do_shortcode($content) negli shortcode. Funziona con il filtro cambiato a priorità 10 ma penso che li riscriverò per usare do_shortcode($content) come indicato. Apprezzo le tue rapide risposte.

Ecco una risposta specifica, per evitare di affidarsi alla documentazione ufficiale di WP nell'altra risposta (che, a quanto pare, non offre davvero istruzioni esplicite comunque).
Esegui do_shortcode() sull'input
Ecco un esempio di registrazione di uno shortcode che supporta shortcode annidati al suo interno:
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');
Lo useresti in questo modo:
[example_shortcode_with_nesting]
[nested_shortcode]
[other_nested_shortcode]
[/example_shortcode_with_nesting]
L'ingrediente chiave, ovviamente, è far passare il contenuto $text
(che proviene tra il tag di apertura e chiusura dello shortcode) attraverso do_shortcode()
. Di default WP prende il primo shortcode che vede, poi ignora qualsiasi shortcode al suo interno, quindi dobbiamo dirgli di "guardare di nuovo", e questo codice fa al caso nostro.
Naturalmente, l'esempio sopra non fa nulla di utile, dovrai agire sull'$output
usando $atts
eccetera per fargli fare qualcosa.
Avvertenze sugli shortcode annidati con tag di chiusura
- Questo supporta avere shortcode al suo interno che hanno tag di chiusura, cioè quelli dove c'è contenuto
$text
. - Ma può andare storto se hai diversi shortcode uguali annidati come fratelli.
- Se hai lo stesso shortcode più volte, WP può confondersi su quale tag di "apertura" si applica a quale tag di "chiusura", e applicherà automaticamente la prima istanza alla prima chiusura.
Quindi ecco la mia regola generale: Se uno shortcode annidato ha un tag di chiusura, deve essere o il primo, l'unico del suo genere, o tutti gli shortcode annidati corrispondenti devono avere tag di chiusura.
Quindi un esempio come questo non ti darà ciò che ti aspetti:
[example_shortcode_with_nesting]
[nested_shortcode id=1]
[nested_shortcode id=2][/nested_shortcode]
[/example_shortcode_with_nesting]
Cosa succede? Ottieni il primo shortcode con id=1
renderizzato con [/nested_shortcode]
come suo tag di chiusura, e lo shortcode id=2
come suo contenuto non renderizzato! Pericolo!
Quindi, come ho detto sopra, o evita di avere lo stesso shortcode più volte, o assicurati che TUTTI abbiano sia i tag di apertura che di chiusura!

La mia non è proprio una risposta ma, dato che ho perso molto tempo su questa domanda, vorrei sottolineare un aspetto evidenziato dalla risposta di jerclarke: se lo shortcode annidato e quello che contiene sono gli stessi, il codice non funzionerà.
Come affermato nella documentazione:
Il parser degli shortcode gestisce correttamente le macro di shortcode annidate, a condizione che le loro funzioni di gestione lo supportino richiamando ricorsivamente do_shortcode():
[tag-a]
[tag-b]
[tag-c]
[/tag-b]
[/tag-a]
Tuttavia, il parser fallirà se una macro di shortcode viene utilizzata per racchiudere un'altra macro con lo stesso nome:
[tag-a]
[tag-a]
[/tag-a]
[/tag-a]
