L'output degli shortcode appare prima del contenuto

16 ott 2012, 12:27:01
Visualizzazioni: 14.4K
Voti: 10

Possibile duplicato:
problema con lo shortcode

Gli shortcode non funzionano correttamente.

Per chi volesse replicare il problema, ecco una semplice guida passo passo.


1) Parti con una nuova installazione di WordPress (3.4.2).

2) Apri twentyeleven/functions.php e aggiungi il seguente codice:

function test() {
echo '-TEST-';
}
add_shortcode('testshortcode', 'test');

3) Modifica il post 'hello world' inserendo:

Benvenuto in WordPress. Questo è il tuo primo articolo. Modificalo o cancellalo, quindi inizia a scrivere!
[testshortcode] 
foobar

4) Salva e visualizza, il risultato sarà:

-TEST-
Benvenuto in WordPress. Questo è il tuo primo articolo. Modificalo o cancellalo, quindi inizia a scrivere!
foobar

mentre dovrebbe essere:

Benvenuto in WordPress. Questo è il tuo primo articolo. Modificalo o cancellalo, quindi inizia a scrivere!
-TEST-
foobar

Cosa sta succedendo?

1
Commenti

Invece di "echo '-TEST-';" usa "return '-TEST-';" .

Softmixt Softmixt
6 apr 2018 00:07:58
Tutte le risposte alla domanda 1
5
17

Le callback degli shortcode devono restituire, non emettere output. Quindi utilizza il seguente codice:

function test() {
    return '-TEST-';
}
add_shortcode( 'testshortcode', 'test' );

Maggiori informazioni: http://codex.wordpress.org/Shortcode_API

Se devi utilizzare echo puoi anche farlo in questo modo (utile se c'è molto markup ed è difficile lavorare con le stringhe):

function test() {
    ob_start();
    echo '-TEST-';
    return ob_get_contents();
}
add_shortcode( 'testshortcode', 'test' );
16 ott 2012 12:29:05
Commenti

È interessante, funziona sull'installazione pulita ma non funziona in un plugin che fa la stessa cosa, utilizzava echo e falliva come nel mio esempio, ma quando lo cambio in return fallisce comunque. Ecco il plugin http://wordpress.org/extend/plugins/wordpress-media-tags/

Neros Neros
16 ott 2012 12:37:04

Ho scaricato il plugin e l'ho controllato, se sostituisci echo con return lì, restituirà il contenuto alla funzione chiamante, non a WordPress.

Mridul Aggarwal Mridul Aggarwal
16 ott 2012 12:50:06

L'ho appena capito e stavo per commentare, se metti un altro return sulla funzione che il callback chiama e sostituisci l'echo, funziona. Grazie.

Neros Neros
16 ott 2012 12:51:32

Questo contenuto è stato visualizzato due volte per me (una prima del contenuto, la seconda nel punto desiderato). Ho risolto con:

function test() { ob_start(); echo '-TEST-'; $ReturnString = ob_get_contents(); ob_end_clean(); return $ReturnString; }

Harkály Gergő Harkály Gergő
19 dic 2016 02:33:34

Per chi ha il problema del contenuto visualizzato due volte, invece di ob_get_contents, usate ob_get_clean

DreamWave DreamWave
9 mar 2020 15:16:51