Care este cea mai bună metodă de a activa shortcode-uri imbricate?

8 nov. 2011, 18:22:46
Vizualizări: 14.6K
Voturi: 6

Este aceasta cea mai bună metodă de a activa shortcode-uri imbricate?:

add_filter( 'the_content', 'do_shortcode' );

Găsesc continuu rezultate contradictorii și vreau să fiu sigur că nu voi strica altceva!

0
Toate răspunsurile la întrebare 3
6

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

Tot ce trebuie să știi despre shortcodurile imbricate în WordPress

8 nov. 2011 18:28:28
Comentarii

Care menționează "cu condiția ca funcțiile lor de gestionare să o suporte prin apelarea recursivă a do_shortcode()" - Deci, a face așa cum mai sus nu ar fi calea de urmat?

hhins hhins
8 nov. 2011 18:31:52

Poate o întrebare mai potrivită ar fi, dacă setarea acesteia mai sus la prioritatea implicită (10) ar cauza probleme de care nu sunt conștient?

hhins hhins
8 nov. 2011 18:44:35

Linia de cod pe care ai postat-o este inutilă. Adaugi funcția do_shortcode la filtrul the_content. WordPress face deja asta automat. Aplicarea din nou nu va face lucrurile recursive. După cum spune codex-ul: "cu condiția ca funcțiile lor de gestionare să o suporte prin apelarea recursivă a do_shortcode()"

Scott Scott
8 nov. 2011 19:22:42

Ce shortcode încuiești?

Scott Scott
8 nov. 2011 19:24:48

Sunt doar câteva shortcode-uri diferite pentru coloane, ele nu se bazează pe do_shortcode($content) în interiorul shortcode-urilor. Funcționează cu filtrul schimbat la prioritatea 10, dar cred că o să le rescriu să folosească do_shortcode($content) așa cum este specificat. Apreciez răspunsurile tale rapide.

hhins hhins
8 nov. 2011 19:37:53

Te rog să intri în chat pentru că cred că nu înțelegi ideea shortcode-urilor aici.

Scott Scott
8 nov. 2011 19:39:12
Arată celelalte 1 comentarii
0

Iată un răspuns specific, pentru a evita dependența de documentația oficială WP din celălalt răspuns (care, se pare, nu oferă instrucțiuni explicite oricum).

Folosește do_shortcode() pe input

Iată un exemplu de înregistrare a unui shortcode care suportă shortcode-uri imbricate în interiorul său:

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');

Acest shortcode s-ar folosi astfel:

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

Ingredientul cheie, desigur, este rularea conținutului $text (care vine între tag-urile de deschidere și închidere ale shortcode-ului) prin do_shortcode(). În mod implicit, WP ia primul shortcode pe care îl vede, apoi ignoră orice shortcode-uri din interiorul acestuia, așa că trebuie să-i spunem să "caute din nou", iar acest cod face exact asta.

Desigur, exemplul de mai sus nu face nimic util, va trebui să acționezi asupra $output folosind $atts etc. pentru a-l face să facă ceva.

Avertismente despre imbricarea shortcode-urilor cu tag-uri de închidere

  • Această metodă suportă shortcode-uri în interior care au tag-uri de închidere, adică cele care au conținut $text.
  • Dar poate da greș dacă ai mai multe shortcode-uri de același tip imbricate ca frați.
  • Dacă ai același shortcode de mai multe ori, WP se poate încurca în privința a cui "tag de deschidere" se aplică cui "tag de închidere", și va aplica automat prima instanță la prima închidere.

Deci, iată regula mea de bază: Dacă un shortcode imbricat are un tag de închidere, acesta trebuie să fie fie primul, singurul de acest tip, fie toate shortcode-urile imbricate corespunzătoare trebuie să aibă tag-uri de închidere.

Deci un exemplu ca acesta nu va da ceea ce te aștepți:

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

Ce se întâmplă? Primești primul shortcode cu id=1 randat cu [/nested_shortcode] ca tag de închidere, iar shortcode-ul cu id=2 ca conținut nerandat! Iată!

Deci, cum am spus mai sus, fie evită să ai același shortcode de mai multe ori, fie asigură-te că TOATE au atât tag-uri de deschidere, cât și de închidere!

14 iun. 2022 01:05:42
0

Al meu nu este chiar un răspuns, dar deoarece am pierdut mult timp pe această întrebare, aș dori să subliniez un aspect evidențiat de răspunsul lui jerclarke: dacă shortcode-ul imbricat și cel pe care îl conține sunt același, codul nu va funcționa.

După cum se precizează în documentație:

Parserul de shortcode-uri gestionează corect macro-urile de shortcode imbricate, cu condiția ca funcțiile lor de manipulare să o suporte prin apelarea recursivă a do_shortcode():

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

Cu toate acestea, parserul va eșua dacă un macro de shortcode este folosit pentru a încadra un alt macro cu același nume:

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