Autor | Zpráva | ||
---|---|---|---|
moom Profil |
#1 · Zasláno: 29. 4. 2014, 17:48:55
Lidi zlatí zatím se učím PHP a napsal jsem si tento kód pro Wordpress a mám pocit, že
to určitě půjde napsat nějak jednodušeji, ale moc netuším jak. Můžete mně prosím nakopnout, popokopnout. <?php if (is_category('1')): query_posts('cat=1'); elseif (is_category('3')): query_posts('cat=3'); elseif (is_category('4')): query_posts('cat=4'); elseif (is_category('5')): query_posts('cat=5'); elseif (is_category('6')): query_posts('cat=6'); elseif (is_category('7')): query_posts('cat=7'); elseif (is_category('8')): query_posts('cat=8'); elseif (is_category('9')): query_posts('cat=9'); elseif (is_category('11')): query_posts('cat=11'); elseif (is_category('12')): query_posts('cat=12'); elseif (is_category('13')): query_posts('cat=13'); elseif (is_category('14')): query_posts('cat=14'); else: query_posts(); endif; ?> |
||
juriad Profil |
To fakt chceš první kategorii, která existuje? Ty snad obecně nevíš, jaké má číslo?
$found = false; $cats = array(1, 3, 4, 5, 6, 7, 8, 9, 11, 12, 13, 14); foreach ($cats as $cat) { if (is_category($cat)) { query_posts('cat='.$cat); $found = true; break; } } if (!$found) { query_posts(); } |
||
rafej Profil |
#3 · Zasláno: 29. 4. 2014, 18:25:39
Tohle by mohlo být efektivnější
$curCatID = the_category_ID($echo=false); $cats = array(1, 3, 4, 5, 6, 7, 8, 9, 11, 12, 13, 14); if (in_array($curCatID,$cats)){ query_posts('cat='.$curCatID); }else{ query_posts(); } |
||
juriad Profil |
#4 · Zasláno: 29. 4. 2014, 18:29:58
rafej:
Ano, vyhýbáš se cyklu, ale tvůj kód skutečně ekvivalentní? Nemám žádné zkušenosti s WP. Moc se mi nelíbí to přiřázení při volání funkce the_category_ID. To je asi chybka, ne? |
||
rafej Profil |
#5 · Zasláno: 29. 4. 2014, 19:01:42
juriad:
Místo $curCatID = the_category_ID($echo=false); lze použít novější if (is_category()) { $category = get_category(get_query_var('cat')); $curCatID = $category->cat_ID; } ale první zápis je spolehlivější, i když zastaralý. Funkce the_category_ID() bez parametru vypisuje rovnou na výstup, takto uloží hodnotu do proměnné.
|
||
juriad Profil |
#6 · Zasláno: 29. 4. 2014, 19:06:29
OK, já WP neznám, z toho důvodu jsem odpověděl z hlediska znalostí PHP.
Ale proč hodnotu false ukládáš do proměnné $echo? Pochopil bych něco jako toto z důvodu dokumentace: $curCatID = the_category_ID(/*echo*/ false); |
||
rafej Profil |
#7 · Zasláno: 29. 4. 2014, 19:19:49
Máš pravdu, v závorce stačí jen
false , zůstalo mi to tam jen při kopírování z poznámek (pro edukační účely ponechávám i názvy parametrů).
|
||
moom Profil |
#8 · Zasláno: 30. 4. 2014, 07:35:50
Lidi zlatí děkuji, děkuji, obě dvě pomoci jsou pro mě důležité
a konečně začínám trošku poodhalovat kouzlo PHP. Takže pokud to nepletu, budou fungovat oba příklady, jenom u druhého je to přímo pro WP, kde se berou zjištěné kategorie. Koukám na různé návody k PHP a všiml jsem si, že docela často lidi píší $cats as $cat něco množného na jednotné,
k čemu se to prosím přesně hodí? Proč se rovnou nenapíše $cats .
Viz první pomoc od Juriada. if (is_category()) { $category = get_category(get_query_var('cat')); $curCatID = $category->cat_ID; } $cats = array(1, 3, 4, 5, 6, 7, 8, 9, 11, 12, 13, 14); if (in_array($curCatID,$cats)){ query_posts('cat='.$curCatID); }else{ query_posts(); } Ještě jednou díky za popokopnutí! |
||
juriad Profil |
#9 · Zasláno: 30. 4. 2014, 09:34:35
http://cz2.php.net/control-structures.foreach
Tedy foreach je cyklus, který prochází nějaké pole a každý prvek pole postupně uloží do nějaké proměnné. V mém přpadě prochází pole $cats (všimnul jsi si správně, že jsem v názvy použil množné číslo pro přehlednost; proměnná obsahuje těch kategorií více) a prvky postupně ukládá do proměnné $cat (jednotné číslo). To as je klíčové slovo oddělující tyto dvě části a umožňující čtení zápisu: foreach member of $cats accessed as $cat do ... česky: pro každý prvek $cats přístupný jako $cat udělej ... $cisla = array(1,2,3,5); foreach ($cisla as $cislo) { echo 2 * $cislo, ' '; } # vypíše 2 4 6 10 |
||
peta Profil |
Uplne nejrychlejsi konstrukce je if-elseif-return u funkce.
In_array, ikdyz velmi elegantni je strasne pomala, lepsi je pouzit isset (array_keyexist) pro pole s indexy. Takze, kdybys in_array pouzival pro vetsi mnozstvi, rekneme 100-1000 kategorii, tak to neni moc vyhodne. $pole = array( 1 => '', 2 => '' ); |
||
moom Profil |
#11 · Zasláno: 30. 4. 2014, 15:43:19
juriad:
Děkuji už je mně je to jasné. Paráda, to se hodí, teda to se musí znát :), Děkuji, děkuji peta: no moc tomu nerozumím, to je prosím na ten můj první příklad? |
||
Tori Profil |
#12 · Zasláno: 30. 4. 2014, 22:29:18
moom:
peta chtěl říct, že je rozdíl mezi hledáním hodnoty v poli (funkce in_array nebo array_search) a hledáním klíče / indexu (funkce isset nebo array_key_exists). Když mám pole $pole1 = array(2 => 'dva', 3 => 'tri', 'vcera' => 'utery'); a chci zjistit, jestli tam je hodnota "utery", tak PHP dělá něco podobného jako juriad v [#2] - musí to pole projít a porovnat hodnotu každého prvku, jestli to je "utery". Kdežto když chci zjistit, jestli v tom samém poli je klíč "vcera", tak je to rychlejší, protože PHP neprochází celé pole (má ty klíče interně uložené nějak jinak). Je dobře o tomhle rozdílu vědět, ale reálně se to projeví až při velkých polích dat.
|
||
Časová prodleva: 10 let
|
0