Naléhavé – Nefunguje shortcode

Úvodní stránka Fórum podpory WordPressu Problémy s WordPressem Naléhavé – Nefunguje shortcode

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á 6 let, 2 měsíce.

Aktuálně je na stránce zobrazeno 9 příspěvků - 1. až 9. (z celkem 9)
  • Autor
    Příspěvky
  • #6258

    sjiamnocna
    Participant
    Web

    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.='&nbsp;'.$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?

    #17040

    sjiamnocna
    Participant
    Web

    Bezvý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

    #17041

    Musilda
    Participant
    Web

    A nemáš ten shortcode definovaný třeba dvakrát?

    #17042

    admin
    Keymaster
    Web

    Zá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().

    #17043

    sjiamnocna
    Participant
    Web

    Ješ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).

    #17044

    Rybajz
    Participant
    Web

    Malá 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.

    #17045

    Musilda
    Participant
    Web

    Pokud 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.

    #17046

    sjiamnocna
    Participant
    Web

    Jsem 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 :)

    #17047

    admin
    Keymaster
    Web

    Osobně 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).

Aktuálně je na stránce zobrazeno 9 příspěvků - 1. až 9. (z celkem 9)

Pokud chcete odpovědět na toto téma, musíte se nejdříve přihlásit.