Los shortcodes se muestran antes del contenido
Posible duplicado:
problema con el short code
Los shortcodes no funcionan correctamente.
Para quienes quieran replicar el problema, aquí hay unos pasos sencillos:
1) Instala WordPress fresco (versión 3.4.2).
2) Ve a twentyeleven/functions.php y agrega lo siguiente:
function test() {
echo '-TEST-';
}
add_shortcode('testshortcode', 'test');
3) Edita la publicación 'hello world' para que diga:
Bienvenido a WordPress. Esta es tu primera entrada. ¡Edítala o bórrala, luego comienza a escribir!
[testshortcode]
foobar
4) Guarda y visualiza, mis resultados se ven así:
-TEST-
Bienvenido a WordPress. Esta es tu primera entrada. ¡Edítala o bórrala, luego comienza a escribir!
foobar
cuando debería verse así:
Bienvenido a WordPress. Esta es tu primera entrada. ¡Edítala o bórrala, luego comienza a escribir!
-TEST-
foobar
¿Qué diablos está pasando aquí?

Las devoluciones de llamada de shortcode deben retornar, no imprimir. Por lo tanto, utiliza lo siguiente:
function test() {
return '-TEST-';
}
add_shortcode( 'testshortcode', 'test' );
Más información: http://codex.wordpress.org/Shortcode_API
Si necesitas usar echo, también puedes hacerlo de esta manera (útil si hay mucho marcado y es difícil trabajar con cadenas):
function test() {
ob_start();
echo '-TEST-';
return ob_get_contents();
}
add_shortcode( 'testshortcode', 'test' );

Eso es interesante, funciona en la instalación limpia pero no funciona en un plugin que hace lo mismo, usaba echo y fallaba como en mi ejemplo, pero cuando lo cambio a return todavía falla. Aquí está el plugin http://wordpress.org/extend/plugins/wordpress-media-tags/

Descargué el plugin y lo revisé, si reemplazas echo con return ahí, devolverá el contenido a la función que lo llama, no a WordPress.

Acabo de darme cuenta de eso y estaba por comentar, si pones otro return en la función que llama el callback y reemplazas el echo, funciona. Gracias.

Este contenido se me mostró dos veces (una antes del contenido, la segunda en el lugar que quería). Lo solucioné con:
function test()
{
ob_start();
echo '-TEST-';
$ReturnString = ob_get_contents();
ob_end_clean();
return $ReturnString;
}
