Autor Zpráva
moom
Profil
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
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
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
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
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
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
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
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
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
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.

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0