Qual è il modo migliore per abilitare gli shortcode annidati?

8 nov 2011, 18:22:46
Visualizzazioni: 14.6K
Voti: 6

È 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!

0
Tutte le risposte alla domanda 3
6

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

Tutto ciò che devi sapere sugli shortcode annidati in WordPress

8 nov 2011 18:28:28
Commenti

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?

hhins hhins
8 nov 2011 18:31:52

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

hhins hhins
8 nov 2011 18:44:35

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

Scott Scott
8 nov 2011 19:22:42

Quale shortcode stai annidando?

Scott Scott
8 nov 2011 19:24:48

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.

hhins hhins
8 nov 2011 19:37:53

Per favore unisciti alla chat perché penso tu stia perdendo di vista il punto degli shortcode qui.

Scott Scott
8 nov 2011 19:39:12
Mostra i restanti 1 commenti
0

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!

14 giu 2022 01:05:42
0

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]
10 mar 2024 11:02:58