scurtcoduri afișate înaintea conținutului
Posibilă duplicare:
problemă cu scurtcodul
Scurtcodurile nu funcționează corect.
Pentru cei care încercați să reproduceți problema acasă, iată un ghid pas cu pas simplu.
1) Porniți o instalare nouă de WordPress (3.4.2).
2) Accesați twentyeleven/functions.php și adăugați următoarele:
function test() {
echo '-TEST-';
}
add_shortcode('testshortcode', 'test');
3) Editați postarea 'hello world' să conțină:
Bun venit în WordPress. Aceasta este prima ta postare. Editează-o sau șterge-o, apoi începe să bloghezi!
[testshortcode]
foobar
4) Salvați și vizualizați, rezultatele mele arată astfel:
-TEST-
Bun venit în WordPress. Aceasta este prima ta postare. Editează-o sau șterge-o, apoi începe să bloghezi!
foobar
când ar trebui să arate așa:
Bun venit în WordPress. Aceasta este prima ta postare. Editează-o sau șterge-o, apoi începe să bloghezi!
-TEST-
foobar
Ce naiba se întâmplă aici?

Funcțiile de callback pentru shortcode trebuie să returneze, nu să afișeze. Deci folosește următoarea metodă:
function test() {
return '-TEST-';
}
add_shortcode( 'testshortcode', 'test' );
Mai multe informații: http://codex.wordpress.org/Shortcode_API
Dacă trebuie să folosești echo, poți face și astfel (util dacă ai mult markup și e dificil să lucrezi cu stringuri)-
function test() {
ob_start();
echo '-TEST-';
return ob_get_contents();
}
add_shortcode( 'testshortcode', 'test' );

Este interesant, funcționează pe o instalare curată dar nu funcționează într-un plugin care face același lucru, folosea echo și a eșuat ca în exemplul meu, dar când l-am schimbat la return tot nu a funcționat. Iată plugin-ul http://wordpress.org/extend/plugins/wordpress-media-tags/

Am descărcat plugin-ul & l-am verificat, dacă înlocuiești echo cu return acolo, va returna conținutul către funcția apelantă, nu către WordPress.

Tocmai am realizat asta și eram pe punctul de a comenta, dacă pui un alt return pe funcția apelată de callback și înlocuiești echo, funcționează. Mersi.

Acest conținut a fost afișat de două ori pentru mine (o dată înaintea conținutului, a doua oară în locul dorit). Am rezolvat asta prin:
function test()
{
ob_start();
echo '-TEST-';
$ReturnString = ob_get_contents();
ob_end_clean();
return $ReturnString;
}
