apply_filters('the_content', $content) vs do_shortcode($content)
Supponiamo di avere un'opzione del tema o un'area di testo personalizzata postmeta. Ora voglio eseguire più shortcode, testi generali, immagini ecc.
Quale sarà la migliore pratica e perché?
Opzione 1:
$content = //i miei dati dell'area di testo;
echo apply_filters('the_content', $content);
Opzione 2:
$content = //i miei dati dell'area di testo;
echo do_shortcode($content);
Per favore, spiegatemi quale sia la migliore pratica e perché.
MODIFICA
Permettetemi di descrivere lo scenario in dettaglio. Sviluppo temi per clienti secondo le loro esigenze. A volte, ho bisogno di aggiungere meta post su post/pagine/tipi di post personalizzati, in modo che possano aggiungere shortcode (slider, moduli di contatto ecc.) o semplicemente un testo semplice. È un campo di testo.
Per far funzionare lo shortcode, uso l'opzione 1. Ora, ho sentito da qualcuno che questo è un modo sbagliato e che dovrei usare do_shortcode
. Ma non mi hanno dato una spiegazione del perché sia sbagliato. Ecco perché lo sto chiedendo.
Questo intero processo può essere fatto nell'editor di testo predefinito di WordPress. Ma ho bisogno di creare queste opzioni per un utilizzo specifico del template, questo è ciò che vogliono i miei clienti.

DOMANDA E RISPOSTA RIVISITATA
Ci sono domande che ti assillano e ti perseguitano più avanti nella vita, e questa è una di quelle.
Questa domanda mi ha fatto pensare a una soluzione alternativa al problema. Come ho già detto, i campi personalizzati e le meta box servono per memorizzare piccoli pezzi di metadati, e non per fungere da estensione al contenuto del post dove puoi eseguire shortcode e funzioni. Inoltre, come ho già detto, il tuo metodo è errato e non dovrebbe essere utilizzato.
Ho trovato interessante nel tuo post che hai utilizzato campi personalizzati e meta box per visualizzare involontariamente contenuti personalizzati inseriti dall'utente. Così mi sono seduto e ho pensato a un modo possibile per farlo funzionare e utilizzare correttamente i dati dei campi personalizzati e delle meta box.
Questa è la mia idea:
LO SCENARIO:
NOTA: Questo può essere modificato per adattarsi a qualsiasi esigenza
In un singolo post, un utente vuole/richiede di mostrare contenuti personalizzati in modo dinamico dopo il post per soddisfare le sue esigenze. Questo dovrebbe essere dinamico. Il contenuto dovrebbe essere una query personalizzata, e l'utente deve poter scegliere cosa mostrare ogni volta che vuole e ciò che desidera.
LA POSSIBILE SOLUZIONE:
Gli shortcode non funzioneranno qui, poiché gli shortcode non possono essere eseguiti nei campi personalizzati. Nemmeno do_shortcode
funzionerà, poiché non è dinamico ed è hardcoded, qualcosa che non vogliamo. Come nella tua domanda, utilizzeremo un campo personalizzato. Ribadisco, non utilizzare il campo personalizzato per eseguire una query personalizzata o shortcode.
IL PIANO:
Useremo il campo personalizzato solo per salvare i nostri argomenti della query; tutto qui. Quindi, creiamo un campo personalizzato chiamato custom_query_arguments
. Nella schermata dell'editor del post, ora vedrai il tuo campo personalizzato, pronto per l'uso.
Il prossimo passo sarà aggiungere i nostri argomenti della query personalizzata al nostro campo. Diciamo che dobbiamo mostrare tre post dalla categoria 1 ordinati per titolo. Quindi i nostri argomenti della query dovrebbero essere così (in formato stringa):
'posts_per_page=3&cat=1&orderby=title'
Questo è ciò che dovrai inserire nel tuo campo personalizzato. Una volta inserito, salva il valore del tuo campo personalizzato.
Il prossimo passo sarà costruire la query personalizzata nel tuo single.php. Dobbiamo ottenere il valore dal nostro campo personalizzato, che in realtà sono i nostri argomenti della query, e passarli a una nuova istanza di WP_Query
per recuperare i post. Dobbiamo anche verificare se abbiamo effettivamente un valore salvato in quel campo personalizzato, se il campo personalizzato è vuoto, non mostrare nulla.
IL CODICE:
Puoi provare qualcosa del genere nel file single.php subito dopo il singolo post.
$args = get_post_meta( get_queried_object_id(), 'custom_query_arguments', true );
// Controlla se il campo personalizzato ha un valore
if( ! empty( $args ) ) {
$q = new WP_Query( $args );
if( $q->have_posts() ) {
while( $q->have_posts() ) {
$q->the_post();
the_title();
}
wp_reset_postdata();
}
}
Se l'utente vuole rimuovere la query personalizzata, può semplicemente eliminare il valore del campo personalizzato e lasciare il campo vuoto. Se ha bisogno di mostrare la stessa query, ma dalla categoria 10 e un totale di 5 post, può semplicemente sostituire il valore originale con quanto segue:
'posts_per_page=5&cat=10&orderby=title'
ALCUNE NOTE:
È importante utilizzare la sintassi e il formato corretti quando si inseriscono informazioni in questi campi personalizzati e meta box. Errori di sintassi o informazioni errate porteranno a output indesiderati o persino a errori fatali. È importante informare i tuoi clienti di tali informazioni.
RISPOSTA ORIGINALE
Non capisco cosa stai cercando di ottenere, ma da quello che posso dirti, queste sono due cose separate.
OPZIONE 1
apply_filters('the_content', $content);
viene utilizzato per applicare i filtri del contenuto al contenuto del post grezzo e non filtrato, che di solito proviene dall'uso di $post->post_content
. Questi filtri includono il famoso filtro wp_autop
che aggiunge tag p
a the_content()
apply_filters('the_content', $content);
viene solitamente utilizzato in combinazione con get_posts
dove si lavora direttamente con gli oggetti WP_Post
senza utilizzare setup_postdata( $post )
che rende disponibili i tag del template come the_content()
.
OPZIONE 2
do_shortcode
viene utilizzato per aggiungere uno shortcode ovunque nei file del template al di fuori dell'editor di testo nella schermata dell'editor di pagina nel back end, sostanzialmente filtrando gli shortcode attraverso i loro hook.
L'uso corretto è il seguente.
Esempio: Aggiungere lo shortcode della galleria in un file template
echo do_shortcode( '[gallery]' )
MODIFICA 1
Dai tuoi commenti, non userei affatto uno shortcode.
Se non hai intenzione di aggiungere uno shortcode tramite l'editor di testo e lo aggiungerai direttamente (hardcoded) tramite do_shortcode
in un file template. Preferirei allora aggiungere direttamente la funzione al template.
Esempio:
Se hai la seguente funzione shortcode,
function footag_func( $atts ) {
return "foo = {$atts['foo']}";
}
add_shortcode( 'footag', 'footag_func' );
Puoi semplicemente chiamare la funzione direttamente in un template come:
echo footag_func();
È molto più veloce in questo modo poiché lo shortcode non deve essere analizzato.
MODIFICA 2
Per essere onesto qui, stai facendo completamente questo in modo sbagliato dalla tua modifica. Ecco perché non potevo capire la tua domanda iniziale
A volte, ho bisogno di aggiungere meta post su post/pagine/tipi di post personalizzati, in modo che possano aggiungere shortcode (slider, modulo di contatto, ecc.) o semplicemente un testo. È un campo di testo.
Per far funzionare lo shortcode, uso l'opzione 1.....
I campi personalizzati non sono campi di testo e sicuramente non sono destinati a essere utilizzati per eseguire shortcode e per questo matter sliders o moduli di contatto. I campi personalizzati non dovrebbero mai essere utilizzati per sostituire l'editor di testo nei post e nelle pagine.
Come ho detto prima, apply_filters('the_content', $content);
è destinato a essere utilizzato per applicare la formattazione al contenuto del post grezzo.
Hai due scelte qui
Usa
do_shortcode
direttamente nei file template, cosa che non consiglierei poiché utilizzare la funzione è più veloce in quanto lo shortcode non deve essere analizzato.Usa lo shortcode direttamente nell'editor di testo per la particolare pagina/post
Consiglierei vivamente di dare una nuova occhiata alle tue strutture e a ciò che vuoi ottenere. I campi personalizzati non sono editor di testo e non possono eseguire shortcode o slider.
La mia raccomandazione sarebbe di considerare magari widget personalizzati o un sistema che puoi utilizzare con i campi personalizzati.

Pieter grazie per la spiegazione. Lo sapevo già. Ma stavo chiedendo, quale opzione sarà più accurata se l'obiettivo è solo quello di restituire shortcode da un textarea di post meta/theme options. Sto usando l'opzione 1 per ottenere il contenuto filtrato, ed è diventata un'abitudine per me. E uso l'opzione 1 anche solo per stampare uno shortcode da un campo di testo. Quindi stavo chiedendo.

Ho visto la modifica. Ho capito il tuo punto. Ma il mio scenario è diverso. È tipo, c'è un campo di testo/textarea, e diversi shortcode. Ora l'utente può inserire qualsiasi shortcode/s in quell'area. Quindi non posso usare direttamente una funzione. Devo mantenere quella parte dinamica.

Dove si trova quel campo di testo, è lo stesso che nello schermo dell'editor di pagine nel backend

Può essere un post meta. Oppure può essere un'opzione del tema. Uso il filtro the_content per entrambi.

Scusa, ma allora tutto questo non ha senso. Perché vorresti usare shortcode nei campi personalizzati. Perché dovresti addirittura usare shortcode in questo caso.

apply_filter('the_content')
esegue tutti i filtri collegati all'output del contenuto di WordPress come do_shortcode
, wp_autop
e altri.
apply_filters
è un metodo perfettamente valido per ottenere ciò che desideri, tuttavia, se vuoi solo una sostituzione degli shortcode
e nessuno degli altri filtri, allora usa l'Opzione 2 della tua domanda.
