Meta lekérési probléma

Megpróbálom leírni röviden a körülményeket.











Adott egy query_posts() lekérdezés, adott meta mezőkkel rendelkező postokat hívok meg.











Majd ezeknek a meta mezőit lekérem. Egyféle meta mezőből van több, ezt egy foreach ciklussal kiiratom. Ugye elvileg olyan sorrendben kéne kipakolnia a mezőket, amilyen sorrendben fel vannak vive az adminon. De nem, néhánynál becsúszik hiba. És nem az admin sorrend szerint jelenik meg.











Először rossz karakterekre gondoltam, de nem, hanem az adatbázisban okoz valami zavart. Hiába kéne ID szerint rendeződnie a soroknak, mégsem így van, és ugye a foreach ciklus is soronként megy végig szépen a lekért adatokon.











Ilyenkor mit érdemes tenni, Alter table-lel tegyek rá egy order by utasítást az adott oszlopra a táblában? Vagy a foreach-ben kellene valami rendezési elv szerint megoldani? Egy átlag query-vel meg lehetne oldani a dolgot, de a query_posts() már nem ad olyan lehetőséget, hogy ID szerint rendezve dobja vissza nekem a lekérdezés az adatsorokat.











Csatoltam egy képet a tábláról és egy érdekes helyen lévő elemről. Van valakinek ezzel kapcsolatban bármi tapasztalata?











[attachment=292:Screen shot 2011-02-15 at 2.41.40.png]

Azért azt megnézném, hogy alter table-el te felteszel bármilyen ordert egy táblára.





Ugyanis az ORDER utasítás, csak SELECT-ben lehet, mivel adat rendezési, és nem tábla tulajdonság…











De döntsd el, hogy nagyon egyedi query-t akarsz írni, vagy a query_posts-al.





Ha utóbbival akkor annak itt a leírása, és a lehetséges opciói:





http://codex.wordpress.org/Function_Reference/query_posts

ALTER TABLE Syntax











Én úgy tudom működik. Bár ez csak egyszeri kihatással van a táblára.











Viszont a kérdésem ettől függetlenül még az, hogy mitől történt ez a táblában? Elvileg egy AUTO_INCREMENT-es érték teljesen false helyre került.























A beillesztett linket ismerem , :slight_smile: a query_post() funkció használatát mutatja be, értelmezésem szerint tehát ott be lehet ugyan állítani paramétereket, de nem tudok én lekérdezést indítani. Vagyis tudomásom szerint a MySQL query-be már nem tudok lényegesen jobban beleszólni, mint amit az ott megadott paraméterek biztosítanak. És ebben pedig nem tudom megadni, hogy a post_meta sorok ID-ja szerint rendezze a lekérdezést, a post_meta-t csak mint egyedi azonosító tudom rendezőelvnek megadni, abban is a meta_value-t. Vagyis “rendezd a postjaimat egy meta_key meta_value-ja alapján”.











Egyébként a post-ok alaptartalmai és a post_meta két külön tábla…, szóval eleve nem egy szimpla egyedi lekérdezésről van szó azt hiszem. De lehet tévedek.

Vagyis, hogy pontosítsam. Én nem a postok lekérdezésénél vagyok megakadva. Azokra megvan a metodika, és rendben is van, hanem, amikor az egy-egy lekérdezett posthoz tartozó metákat kiiratom egy foreach ciklussal, akkor a meták nem olyan sorrendben íródnak ki, ahogy az adminon fel vannak vive. Ez pedig tippem szerint azért van, mert a MySQL táblában egyszerűen néhány ID nem ott van, ahol kellene lenni, ezt mutatja be a mellékelt kép is. Ezért az van, hogy, amikor a query soronként behúzza az adatokat, akkor egy magasabb ID-jű meta előbbre kerül, mint egy alacsonyabb ID-jű.











Mivel a query simán soronként megy rajta végig, mivel arra nem szól az ő utasítása, hogy a metákat valami alapján rendezze, hanem csak a postokat.

Remélem jó helyre írok.





Elnézést, nagyon kezdő vagyok wp-ben és php-ban is, bár programozói múltam van, de egész más program nyelvekben.





Végig fogom nyálazni a wordpress.org doksiját, de ez rengeteg idő.





A wp-t tényleg csak dicsérni tudom, egy hét alatt egész jó kis weboldalt lehetett összehozni.





De nagy szükségem van arra, hogy a post-ok egy numerikus egyedi mező alapján legyenek rendezve.





Eddig ezt találtam:





$querystr = "





SELECT wposts.*





FROM $wpdb->posts wposts, $wpdb->postmeta wpostmeta





WHERE wposts.ID = wpostmeta.post_id





AND wpostmeta.meta_key = ‘price’





AND wposts.post_type = ‘post’





ORDER BY ABS(wpostmeta.meta_value) DESC





";





De nem tudom hova kellene ezt beszúrnom.




  • 3D-Realty sablont használok. Nézegettem a themes folder file-it, de itt már csak have_posts() funkciókat találtam, ami már használ egy valahol megírt lekérdezést select-et. Ezért az a gyanúm, hogy a fent említett részletet egy wp file-ba kell behelyezni. De melyikbe???





    Előre is köszönném a segítséget.

Inkább itt nézz szét, mint queryt illesztgess a fájlokba…











http://codex.wordpress.org/Function_Reference/query_posts


'sasi83' wrote on '2011-02-16:




Ez pedig tippem szerint azért van, mert a MySQL táblában egyszerűen néhány ID nem ott van, ahol kellene lenni, ezt mutatja be a mellékelt kép is. Ezért az van, hogy, amikor a query soronként behúzza az adatokat, akkor egy magasabb ID-jű meta előbbre kerül, mint egy alacsonyabb ID-jű.





Mivel a query simán soronként megy rajta végig, mivel arra nem szól az ő utasítása, hogy a metákat valami alapján rendezze, hanem csak a postokat.








Ez esetben kiszeded a metákat, végig mész rajtuk egy foreachel, elrakod egy tömbbe, majd a tömböt úgy rendezed, ahogy akarod, és végül s tömböd iratod ki.

'DjZoNe' wrote on '2011-02-17:




Inkább itt nézz szét, mint queryt illesztgess a fájlokba...





http://codex.wordpress.org/Function_Reference/query_posts





Köszönöm, hogy tanácsot adtál.


Ezt találtam:





'post', 'orderby' => 'meta_value', 'meta_key' => 'ar' ) ); ?>





Ha ezt beraktam a themes index.php-be if (have_posts()) elé, akkor minden más szűrési és rendezési szempontot felülírtam vele. Elfelejtette a kategória szerinti szűrést pl.


Ha beraktam a themes page.php-ba a loop elé, akkor meg figyelmen kívül hagyja.





Meg lehet-e oldani, hogy a fent említett query_posts tartalmazza a wp által generált lekérdezést is és benne legyen a rendezés az egyedi mező szerint.

A fent linkelt oldalon posts_orderby filter használatával megtudod oldani.











Pl. a functions.php-ban ilyesmi formában:









Code:



function my_posts_orderby( $orderby = '' )

{

$orderby .= " ABS(wpostmeta.meta_value) DESC ";

return $orderby;

}

add_filter( 'posts_orderby', 'my_posts_orderby' );


'demjengi' wrote on '2011-02-18:




Köszönöm, hogy tanácsot adtál.


Ezt találtam:





'post', 'orderby' => 'meta_value', 'meta_key' => 'ar' ) ); ?>





Ha ezt beraktam a themes index.php-be if (have_posts()) elé, akkor minden más szűrési és rendezési szempontot felülírtam vele. Elfelejtette a kategória szerinti szűrést pl.


Ha beraktam a themes page.php-ba a loop elé, akkor meg figyelmen kívül hagyja.





Meg lehet-e oldani, hogy a fent említett query_posts tartalmazza a wp által generált lekérdezést is és benne legyen a rendezés az egyedi mező szerint.








Igen, a query_posts() gyakorlatilag felülírja az alaplekérdezést. Ezt fent az alapinfóban asszem le is írják. Tehát, ha a default loop elé teszed, akkor az összes bejegyzést lekéri és a metamező szerint rendezi.





A filtert én még nem próbáltam, de az index.php-n ugye az van, hogy akkor minden kategóriát meghívsz. Ha kategóriánként van a sorszámozás, akkor valószínű nem jó elrendezést fogsz kapni. Ott én mást használnék. A category.php-ba pedig úgy vinném be a lekérdezést, hogy mindig kategóriánként hívja le a postokat. Ezt egyszerű megtenni, mert URL alapján a WP tudja milyen kategóriában van a query elé beteszel egy változót, amibe kiszeded a post ID-t, majd azt átadod a query-nek.





Code:



// Lekéred azon a URL-en ahol van a kategória nevét

$dinamikuskat = single_cat_title("", false);

// név alapján ID-t kérsz belőle

$kategoria_id = get_cat_ID($dinamikuskat);



//Lekéred a postokat a megadott feltételek szerint

//Vigyázz az oldalakra tördelés megint külön ügy, talán ez meg van már oldva, de egy ideig nem működött

query_posts(array(

'cat' => $kategoria_id,

'posts_per_page' => '-1',

'orderby' => 'meta_value_num',

'meta_key' => 'sorszam',

'order' => 'ASC'

));








Utána megröptetsz egy while ciklust, és a végére biztos-ami biztos egy wp_reset_query()-t is bepakolsz. Ez azért fontos, mert különben összezavarodik a következő lekérdezés.

'DjZoNe' wrote on '2011-02-17:




Ez esetben kiszeded a metákat, végig mész rajtuk egy foreachel, elrakod egy tömbbe, majd a tömböt úgy rendezed, ahogy akarod, és végül s tömböd iratod ki.








Ötletnek nem rossz, bár ezt a probléma megkerülésének érzem inkább, végső esetben ez lesz. Köszi :)





A hibás táblasorokra nincs tipped? Az szolgáltató miatt lehet vagy WP?

'DjZoNe' wrote on '2011-02-18:







Code:



function my_posts_orderby( $orderby = '' )

{

$orderby .= " ABS(wpostmeta.meta_value) DESC ";

return $orderby;

}

add_filter( 'posts_orderby', 'my_posts_orderby' );











Nem megy ez nekem. Ha ezt a funkciót betettem, akkor egy post-ot sem talált meg.

Hogy, és hol tudnám a $orderby értékét kiíratni a sablon területén?





Jó volna látni, hogy mi van benne.











Köszönöm a türelmet. Remélem leszek még okosabb-

Sablon funkciókba betettem:





function my_posts_orderby( $orderby = ‘’ )





{





$orderby .= " ABS(wpostmeta.meta_value) DESC ";





return $orderby;





}











A sablon index.php-ba betettem:





























Az eredmény ez lett:





wpbi_posts.post_date DESC wpbi_posts.post_date DESC











Nem változtatta meg. Mit tegyek?

Az add_filter is a functionsba kell.

Először úgy próbáltam, akkor egyetlen post-ot sem talált meg.

Újra betettem a az általad írt funkciót add_filterrel együtt, a sablon function.php-be.





Sablon index.php-ba:





Az kiírás: wpbi_posts.post_date DESC











Egy bejegyzést sem talál meg.

Lehet, hogy nincs igazam, de a sablon nem egy adatbázisból leszedett már rendezett bejegyzés halmazt kap?





Nem lehet az én esetemben, inkább a query.php-t úgy módosítani, hogy minden post az egyedi ar mező alapján legyen rendezve?


'demjengi' wrote on '2011-02-20:




Lehet, hogy nincs igazam, de a sablon nem egy adatbázisból leszedett már rendezett bejegyzés halmazt kap?


Nem lehet az én esetemben, inkább a query.php-t úgy módosítani, hogy minden post az egyedi ar mező alapján legyen rendezve?








Fentebb már leírtam a megoldást, check it :)

Megküzdöttem érte, de ezzel elértem, hogy a post-ok kategórián belül ár szerint növekvő sorrendben jönnek:





$args = array(





'category_name' => get_query_var('category_name'),





'post_type' => 'post',





'orderby' => 'meta_value',





'meta_key' => 'ar',





'order' => 'ASC'





);





query_posts( $args );