apply_filters('the_content', $content) vs do_shortcode($content)

3 ian. 2015, 12:48:35
Vizualizări: 99.8K
Voturi: 25

Să zicem că am o opțiune de temă sau o zonă de text personalizată pentru postmeta. Acum vreau să execut mai multe shortcode-uri, texte generale, imagini etc.

Care va fi cea mai bună practică și de ce?

Opțiunea 1:

$content = //datele mele din zona de text;
echo apply_filters('the_content', $content);

Opțiunea 2:

$content = //datele mele din zona de text;
echo do_shortcode($content);

Vă rog să-mi explicați care dintre acestea este cea mai bună practică și de ce.

EDITARE

Permiteți-mi să descriu scenariul în detaliu. Dezvolt teme pentru clienți conform cerințelor lor. Uneori, trebuie să adaug post meta pe articole/pagini/tipuri de postări personalizate, astfel încât ei să poată adăuga shortcode-uri (slider, formular de contact etc.) sau doar un text simplu. Este un câmp text.

Pentru a face shortcode-urile să funcționeze, folosesc opțiunea 1. Acum, am auzit de la cineva că aceasta este o modalitate greșită și că ar trebui să folosesc do_shortcode. Dar nu mi-au oferit o explicație de ce este greșită. De aceea întreb.

Întregul proces poate fi realizat în editorul text implicit al WordPress. Dar trebuie să creez acele opțiuni pentru utilizare specifică șablonului, asta își doresc clienții mei.

0
Toate răspunsurile la întrebare 2
7
17

ÎNTREBARE ȘI RĂSPUNS REVIZITATE

Există uneori întrebări care te macină și te vânează mai târziu în viață, iar aceasta este una dintre ele.

Această întrebare m-a făcut să mă gândesc la o soluție alternativă la problemă. După cum am menționat deja, câmpurile personalizate și meta box-urile sunt menite să stocheze mici fragmente de meta date și nu să acționeze ca o extensie a conținutului postării, unde poți executa shortcode-uri și funcții. De asemenea, după cum am menționat, metoda ta este incorectă și nu ar trebui utilizată.

Am găsit interesant în postarea ta că ai folosit câmpuri personalizate și meta box-uri pentru a afișa inadvertent conținut personalizat din inputul utilizatorului. Așa că m-am gândit la o posibilă metodă de a face acest lucru să funcționeze și de a utiliza corect datele din câmpurile personalizate și meta box-uri.

Aceasta este ideea mea:

SCENARIUL:

NOTĂ: Aceasta poate fi modificată pentru a se potrivi oricărei nevoi

Pe o postare individuală, un utilizator dorește/are nevoie să afișeze conținut personalizat dinamic după postare pentru a se potrivi nevoilor sale. Acesta ar trebui să fie dinamic. Conținutul ar trebui să fie o interogare personalizată, iar utilizatorul trebuie să poată alege ce să afișeze oricând dorește și ce dorește.

SOLUȚIA POSIBILĂ:

Shortcode-urile nu vor funcționa aici, deoarece shortcode-urile nu pot fi executate în câmpuri personalizate. Nici do_shortcode nu va funcționa, deoarece nu este dinamic și este hardcodat, ceea ce nu dorim. Ca în întrebarea ta, vom folosi un câmp personalizat. Din nou subliniez, nu utilizați câmpul personalizat pentru a executa o interogare personalizată sau shortcode-uri.

PLANUL:

Vom folosi câmpul personalizat doar pentru a salva argumentele interogării; atât. Deci, creăm un câmp personalizat numit custom_query_arguments. În ecranul editorului de postări, vei vedea acum câmpul tău personalizat, gata de utilizare.

Următorul pas va fi să adăugăm argumentele interogării personalizate în câmpul nostru. Să spunem că avem nevoie să afișăm trei postări din categoria 1 sortate după titlu. Deci, argumentele interogării noastre ar trebui să arate astfel (în format string):

'posts_per_page=3&cat=1&orderby=title'

Acesta este ceea ce ar trebui să introduci acum în câmpul tău personalizat. După ce ai introdus, salvează valoarea câmpului tău personalizat.

Următorul pas va fi să construim interogarea personalizată în fișierul single.php. Trebuie să obținem valoarea din câmpul nostru personalizat, care este de fapt argumentele interogării noastre, și să le transmitem unei noi instanțe de WP_Query pentru a prelua postările. De asemenea, trebuie să verificăm dacă avem sau nu o valoare salvată în acel câmp personalizat; dacă câmpul personalizat este gol, nu afișăm nimic.

CODUL:

Poți încerca ceva de genul acesta în fișierul single.php chiar după postarea individuală.

$args = get_post_meta( get_queried_object_id(), 'custom_query_arguments', true );
// Verifică dacă câmpul personalizat are o valoare
if( ! empty( $args ) ) {

    $q = new WP_Query( $args );

    if( $q->have_posts() ) {
        while( $q->have_posts() ) {
            $q->the_post();

            the_title();
        }
        wp_reset_postdata();
    }
}

Dacă utilizatorul dorește să elimine interogarea personalizată, poate pur și simplu să șteargă valoarea câmpului personalizat și să lase câmpul gol. Dacă are nevoie să afișeze aceeași interogare, dar din categoria 10 și un total de 5 postări, poate înlocui valoarea originală cu următoarea:

'posts_per_page=5&cat=10&orderby=title'

CÂTEVA NOTE:

Este important să folosești sintaxa și formatul corect atunci când introduci informații în aceste câmpuri personalizate și meta box-uri. Erorile de sintaxă sau informațiile incorecte vor duce la rezultate nedorite sau chiar la erori fatale. Este important să le comunici clienților tăi astfel de informații.

RĂSPUNSUL ORIGINAL

Nu înțeleg ce încerci să realizezi, dar din câte îmi dau seama, acestea sunt două lucruri separate.

OPȚIUNEA 1

apply_filters('the_content', $content); este folosit pentru a aplica filtrele de conținut la conținutul brut nefiltrat al postării, care de obicei provine din utilizarea $post->post_content. Aceste filtre includ filtrul celebru wp_autop care adaugă tag-uri p la the_content().

apply_filters('the_content', $content); este de obicei folosit în conjuncție cu get_posts unde se lucrează direct cu obiectele WP_Post fără a utiliza setup_postdata( $post ) care face disponibile pentru utilizare tag-urile de șablon precum the_content().

OPȚIUNEA 2

do_shortcode este folosit pentru a adăuga un shortcode oriunde în fișierele de șablon în afara editorului de text din ecranul de editare a paginii din back-end, filtrând în esență shortcode-urile prin cârligele lor.

Utilizarea corectă este următoarea.

Exemplu: Adăugarea shortcode-ului gallery într-un fișier de șablon

echo do_shortcode( '[gallery]' )

EDIT 1

Din comentariile tale, nu aș folosi deloc un shortcode atunci.

Dacă nu intenționezi să adaugi un shortcode prin intermediul editorului de text și să-l adaugi direct (hardcodat) prin do_shortcode într-un fișier de șablon. Aș prefera atunci să adaug pur și simplu funcția în șablon.

Exemplu:

Dacă ai următoarea funcție de shortcode,

function footag_func( $atts ) {
    return "foo = {$atts['foo']}";
}
add_shortcode( 'footag', 'footag_func' );

Poți apela pur și simplu funcția direct într-un șablon astfel:

echo footag_func();

Este mult mai rapid în acest fel, deoarece shortcode-ul nu trebuie analizat.

EDIT 2

Să fim sinceri aici, faci complet greșit din editarea ta. De aceea nu am putut înțelege întrebarea ta inițială.

Uneori, am nevoie să adaug meta date pe postări/pagini/tipuri de postări personalizate, astfel încât acestea să poată adăuga shortcode-uri (slider, formular de contact, etc.) sau doar un simplu text. Este un câmp text.

Pentru a face shortcode-ul să funcționeze, folosesc opțiunea 1.....

Câmpurile personalizate nu sunt câmpuri de text și cu siguranță nu sunt menite să fie folosite pentru a executa shortcode-uri și, în acest sens, slideri sau formulare de contact. Câmpurile personalizate nu ar trebui niciodată folosite pentru a înlocui editorul de text din postări și pagini.

După cum am menționat anterior, apply_filters('the_content', $content); este menit să fie folosit pentru a aplica formatarea la conținutul brut al postării.

Ai două opțiuni aici

  • Folosește do_shortcode direct în fișierele de șablon, ceea ce nu aș recomanda, deoarece utilizarea funcției este mai rapidă, deoarece shortcode-ul nu trebuie analizat.

  • Folosește shortcode-ul direct în editorul de text pentru pagina/postarea respectivă

Ți-aș recomanda cu tărie să analizezi din nou structurile tale și ceea ce vrei să realizezi. Câmpurile personalizate nu sunt editori de text și nu pot executa shortcode-uri sau slideri.

Recomandarea mea ar fi să te uiți poate la widget-uri personalizate sau la un sistem pe care îl poți folosi cu câmpuri personalizate.

3 ian. 2015 13:43:33
Comentarii

Pieter, mulțumesc pentru explicație. Știu deja asta. Dar întrebam care opțiune ar fi mai precisă dacă scopul este doar să afișez shortcode-uri dintr-un câmp text meta al postării/opțiuni ale temei. Folosesc opțiunea 1 pentru a obține conținutul filtrat și a devenit o obicei. Și folosesc opțiunea 1 chiar și pentru a afișa un shortcode dintr-un câmp text. Așa că întrebam.

тнє Sufi тнє Sufi
3 ian. 2015 14:06:00

Am văzut editatul. Înțeles punctul tău. Dar scenariul meu este diferit. Este așa: există un câmp text/zonă text și mai multe shortcode-uri. Acum utilizatorul poate introduce oricare dintre shortcode-uri în acea zonă. Așadar, nu pot folosi direct o funcție. Trebuie să păstrez acea parte dinamică.

тнє Sufi тнє Sufi
3 ian. 2015 15:29:54

Unde se află acel câmp text, este același ca în ecranul de editare a paginii din backend?

Pieter Goosen Pieter Goosen
3 ian. 2015 15:34:43

Poate fi o metadată a postării. Sau poate fi o opțiune a temei. Folosesc filtrul the_content pentru ambele.

тнє Sufi тнє Sufi
3 ian. 2015 15:36:08

Scuze, dar atunci nimic din toate acestea nu are sens. De ce ai vrea să folosești shortcode-uri în câmpuri personalizate. De ce ai folosi chiar shortcode-uri în general.

Pieter Goosen Pieter Goosen
3 ian. 2015 15:41:03

Te rog să verifici partea editată a întrebării.

тнє Sufi тнє Sufi
3 ian. 2015 15:43:31

Vă rugăm să consultați modificarea mea sub secțiunea "ÎNTREBARE ȘI RĂSPUNS REVIZUIT"

Pieter Goosen Pieter Goosen
5 ian. 2015 14:40:59
Arată celelalte 2 comentarii
1

apply_filter('the_content') execută toate filtrele atașate la ieșirea conținutului în WordPress, cum ar fi do_shortcode, wp_autop și altele.

apply_filters este o metodă perfect validă pentru a realiza ceea ce doriți, însă dacă doriți doar înlocuirea unui shortcode și niciunul dintre celelalte filtre, atunci folosiți Opțiunea 2 din întrebarea dvs.

3 feb. 2021 21:00:08
Comentarii

Aceasta este întreaga informație de care ai nevoie pentru a înțelege acest subiect în doar 2 propoziții.

squarecandy squarecandy
4 ian. 2024 18:12:04