L'output degli shortcode appare prima del contenuto
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?

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

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

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

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.

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;
}
