Úvodní stránka › Fórum podpory WordPressu › Problémy s WordPressem › Naléhavé – Nefunguje shortcode
Štítky: get_the_title(), MVC, shortcode, the_title(), WP_Query, Zkrácený zápis
Zvolené téma obsahuje celkem 8 odpovědí. Do diskuze (4 účastníci) se naposledy zapojil uživatel admin a poslední změna je stará 11 let, 1 měsíc.
-
AutorPříspěvky
-
28. prosince 2013 (20:34) #6258
Ahoj. Trochu jsem pracoval na uživatelských nastaveních, a přestal mi fungovat shortcode pro výpis příspěvků z post type. Kód jsem si asi padesátkrát prohlížel, zdali tam něco najdu (return/špatná podmínka…) ale bezvýsledně, tak doufám v to, že mě tady někdo uvědomí o chybě. Děkuji moc
<?php function songbook_listshc(){
$songbook_listshquery=array(
'post_type'=>'song',
'nopaging'=>true,
'orderby'=>(get_option('songbook_shcdefs_orderby'))?get_option('songbook_shcdefs_orderby'):'title',
'order'=>(get_option('songbook_shcdefs_order'))?get_option('songbook_shcdefs_order'):'desc',
'posts_per_page'=>-1
);
query_posts($songbook_listshquery);
if(have_posts()){ ?>
...žádnéPHP...
<?php
$songbooklist_result='<table class="songbook_songlist">';
while ( have_posts()):the_post();
$songbooklist_result.='<tr>';
$songbooklist_result.='<td class="songbook_songlist_onesong_info">';
$songbook_songauthors=(get_option('songbook_disp_authorsinshc'))?'<span>('.strip_tags(get_the_term_list($post->post_id,'songauthor','',', ')).')</span>':'';
$songbook_files=(get_option('songbook_disp_filelistinshc')=='display'&&get_post_meta(get_the_ID(),'songbook_filebox',true))?explode(',',get_post_meta(get_the_ID(),'songbook_filebox',true)):false;
$songbooklist_result.='<a href="'.get_permalink().'" alt="'.__('Display whole song','wpsongbook').'">';
the_title();
$songbooklist_result.='</a>';
if($songbook_songauthors)$songbooklist_result.=' '.$songbook_songauthors;
$songbooklist_result.='</td>';
if(is_user_logged_in()&&$songbook_files){
$songbooklist_result.='<td>';
foreach ($songbook_files as $songbook_toicon_onefile){
$songbook_file_ext=pathinfo(wp_get_attachment_url($songbook_toicon_onefile),PATHINFO_EXTENSION);
$songbook_file_url=wp_get_attachment_url($songbook_toicon_onefile);
$songbook_file_basename=basename(get_attached_file($songbook_toicon_onefile));
$songbook_icon_url=plugins_url().'/wp-songbook/img/exticons_32/'.$songbook_file_ext.'.png';
$songbook_icon_img='<img style="margin:1px;float:left;width:20px;height:20px;" src="'.$songbook_icon_url.'" alt="'.$songbook_file_basename.' title="'.$songbook_file_basename.'/>';
if($songbook_toicon_onefile)$songbooklist_result.='<a href="'.$songbook_file_url.'" alt="'.$songbook_file_basename.'">'.$songbook_icon_img.'</a>';
}
}
$songbooklist_result.='</td>';
$songbooklist_result.='</tr>';
endwhile;
$songbooklist_result.='</table>';
wp_reset_query();
}
if($songbooklist_result)return$songbooklist_result;
}
add_shortcode('songbook','songbook_listshc');Vkládám kód do stránky ([songbook]), ale jakoby vůbec neexistoval jeho základ – pouze se vypíše jako znaky.
Vidíte někde někdo chybu?
29. prosince 2013 (15:05) #17040Bezvýsledně jsem zkusil sestavit novou funkci a nový shortcode, ale vůbec mi to nebere, ačkoliv, když do stejného souboru umístím nějakou silnější funkci (exit/die), normálně se provede… Už jsem z toho docela zoufalý. Naléhavě vás prosím o pomoc
30. prosince 2013 (21:45) #170413. ledna 2014 (13:35) #17042Zásadní chyba je v použití funkce the_title(), která v tomto případě vypíše název, ale už se neukládá do proměnné $songbooklist_result. V tomto případě je vhodnější použítí funkce get_the_title().
Stávající řádek kódu:
the_title();
je třeba nahradit tímto:
$songbooklist_result .= get_the_title();
Mimochodem, ten kód je strašně formátovaný a rozhodně doporučuji v tomto případě nepoužívat funkci query_posts(), ale raději WP_Query() či get_posts().
3. ledna 2014 (19:37) #17043Ještě mám pro vás takovou “anketní otázku”: Existují výhody psaní pluginu ve formě celé třídy, nebo je to úplně jedno?
Připouštím, že to v oku profesionála musí vypadat hrozně, ale pro mě je to životní výkon, ačkoliv na lehké přestavbě budu v průběhu času pracovat. Toto je takový zlatý základ k (možná) fungujícímu pluginu. :)
Je to mizerné, že na odpověď přijdu vždy malou chvíli před tím, než mi tady někdo poradí.
Trochu jsem to předělal, a místo shortcode, dávám v nastavení možnost vybrat stránku (popř. ji automaticky vložit).
3. ledna 2014 (21:59) #17044Malá odpověď na anketní otázku:-) Je zřejmě lepší použít celou třídu, neboť by se kód měl rozdělit do menších logicky souvisejících celků. Ale v případě WordPressu to nemusí až tak platit. Způsob, kterým se ve WP míchá PHP s HTML je prostě špatný. Možná je na to spoustu vývojářů zvyklých, ale když člověk jednou používá striktní oddělení modelu od výpisu dat (MVC), pak už nemůže jít jinou cestou. Proto nedokáži zcela přesně rozhodnout, zda je lepší psát jako třídu nebo vše dohromady.
4. ledna 2014 (5:44) #17045Pokud je to anketní otázka, tak já hlasuji pro třídy. Třeba option u pluginu načteš v konstruktoru a krásně se s tím pracuje.
4. ledna 2014 (20:48) #17046Jsem v otázce tříd zatím kuře a uvědomil jsem si jen to, že nemusím řešit prefixy funkcí, pokud jsou ve třídě. Když někdo řekne konstruktor třídy, nevím, co si představit a myslím, že na to mám ještě chvíli čas :D. Jak čas plyne, pomalu si to všechno uvědomuju a dostává to jakous-takous formu…
Děkuji za názory. Krásný (již 4 dny) nový rok :)
6. ledna 2014 (10:21) #17047Osobně to tak nějak střídám :-) Třídy (a obecně OOP) je asi programátorsky přehlednější způsob, ale někdy je potřeba udělat nějaký drobný plugin, kde to raději napíšu do několika řádků (s vlastním prefixem funkce). Pokud chcete psát opravdu nějaké složitější pluginy pro WordPress, tak doporučuji nastudovat a použít nějaké předpřipravené řešení, např. WordPress Plugin Boilerplate. Hezky se naučíte, jak psát dokumentaci k jednotlivým funkcím, jak vytvářet soubory s třídami a načítat je v hlavním souboru pluginu, atd.
A moje narážka na nečitelný a špatně formátovaný kód odkazovala spíše na něco jiného (chybějící mezery, odrážky, inline CSS, atd). Podívejte se třeba do manuálu.
P.S. Ano, samotný WordPress je z programátorského hlediska procedurální paskvil, ale funguje perfektně (a postupně se zlepšuje).
-
AutorPříspěvky
Pokud chcete odpovědět na toto téma, musíte se nejdříve přihlásit.