orderby Problem
lima-city → Forum → Programmiersprachen → PHP, MySQL & .htaccess
array
bewertung
code
film
format
gefunden url
http
jahr
laufzeit
note
ordern
schauspieler
sicher sagen
spalte
tabelle
text
type
url
video
zahl
-
Also ich habe gerade ein neues Projekt angefangen eine kleine Movie-Database mit Filmkritiken von mir. Dafür nutze ich Wordpress mit einem angepasstem Theme, Custom Taxonomys usw.
In der Sidebar gibt es ein Ranking für die fünf besten Filme. Beim ursprünglichen Theme war nur eine Bewertung bis 5 vorgesehen, ich habe diese Bewertung bis auf 10 erweitert. Jedoch habe ich jetzt das Problem, dass er bis 9 die Filme richtig sortiert, jedoch Filme mit Bestwertung 10 nicht als höchstes festlegt, da die Zahl vermutlich ja mit 1 beginnt.
<div class="featbox"> <h3 class="sidetitl "> Top Movies </h3> <?php $rate_query = new WP_Query( array ( 'post_type' => 'movies', 'orderby' => 'meta_value', 'meta_key' => 'wtf_rscore','posts_per_page'=>'5' ) ); while ( $rate_query->have_posts() ) : $rate_query->the_post(); ?> <div class="fblock clearfix"> <?php if ( has_post_thumbnail() ) { ?> <img class="thumbim" src="<?php bloginfo('stylesheet_directory'); ?>/timthumb.php?src=<?php get_image_url(); ?>&h=60&w=80&zc=1" alt=""/> <?php } else { ?> <img class="thumbim" src="<?php bloginfo('template_directory'); ?>/images/dummy.png" alt="" /> <?php } ?> <div class="rinfo clearfix"> <h3><a href="<?php the_permalink() ?>" title="<?php the_title(); ?>"><?php echo short_title('...', 4); ?></a></h3> <span class="sholder"> <span class="scorebar score-<?php $rscore=get_post_meta($post->ID, 'wtf_rscore', true); echo $rscore; ?>"> </span> </span> <p><span class="mgenre"><?php echo get_the_term_list( $post->ID, 'movie-genre', '', ', ', '' ); ?></span></p> </div> </div> <?php endwhile; ?> </div>
Das dazugehörige Array sieht so aus:
$meta_box = array( 'id' => 'boxoffice', 'title' => 'Movie review details', 'page' => 'movies', 'context' => 'normal', 'priority' => 'high', 'fields' => array( array( 'name' => 'Jahr der Veröffentlichung', 'desc' => 'Füge das Jahr ein, indem der Film veröffentlicht wurde ', 'id' => $prefix . 'ryear', 'type' => 'text', 'std' => '' ), array( 'name' => 'Regie', 'desc' => 'Name des Regisseurs', 'id' => $prefix . 'dirctr', 'type' => 'text', 'std' => '' ), array( 'name' => 'Schauspieler', 'desc' => 'Namen der Schauspieler', 'id' => $prefix . 'stars', 'type' => 'text', 'std' => '' ), array( 'name' => 'Laufzeit', 'desc' => 'Laufzeit des Films in Minuten', 'id' => $prefix . 'runtime', 'type' => 'text', 'std' => '' ), array( 'name' => 'Video trailer', 'desc' => 'Video trailer url', 'id' => $prefix . 'video', 'type' => 'textarea', 'std' => '' ), array( 'name' => 'Deine Filmbewertung', 'desc' => 'Deine Filmbewertung von 1-10', 'id' => $prefix . 'rscore', 'type' => 'select', 'options' => array( '1','2','3','4','5','6','7','8','9','10' ), 'std' => '' ) ), );
In Aktion könnt ihr das ganze hier sehen:http://effektfabrik.lima-city.de/
Also wie kriege ich das jetzt hin, dass er Filme mit der Bewertung 10 an oberster Stelle sortiert.
-
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage
-
Dieses Verhalten tritt auf wenn über Zeichenfolgen und nicht über Zahlen sortiert wird. Ich kann dir jetzt aber keine Fehlerbehebung vorschlagen.
Das einzige was ich dir sicher sagen kann ist, dass bei der Bewertung ein Zahlen-Datentyp hingehört, damit richtig sortiert werden kann. -
hackyourlife schrieb:
Das einzige was ich dir sicher sagen kann ist, dass bei der Bewertung ein Zahlen-Datentyp hingehört, damit richtig sortiert werden kann.
Genau das habe ich mir auch gedacht, doch habe ich es weder direkt als Text deklariert noch weiß ich an welcher Stelle ich das Format einstelle und wie die Syntax dafür aussieht.
Habe schon ein bisschen gegoogelt, habe aber noch nicht das richtige gefunden. Vielleicht hat jemand noch einen kleinen Denkanstoss. -
Hi,
ich nehme mal jetzt an, dass dein Tabellen-Feld in der Datenbank das falsche Format hat.
Wie schon agesprochen wurde, musst du den Typ auf INTEGER umstellen.
Das solltest du unter phpMyAdmin ohne Probleme ändern können.
Wie sieht denn deine Tabelle bisher aus? -
Ja also ich habe jetzt ein bisschen was ausprobiert:
du hattest recht: meta_value hat das format longtext
da aber meta_value nicht nur die Bewertungen von 1-10 beinhaltet, sondern noch die anderen Meta-Dateien sprich, Erscheinungsjahr, URLs, Schauspieler, Regiedaten etc. kann ich nicht einfach das Datenformat der Spalte ändern.
Deswegen habe ich folgendes gemacht.
1. ALTER table wp_postmeta ADD meta_value2 tinyint
2. UPDATE wp_postmeta SET `meta_value2` =`meta_value` WHERE `meta_key`="wtf_rscore"
So nun habe ich eine weitere Spalte meta_value2 mit den Daten aus meta_value, jedoch überall da wo es kein wtf_rscore gibt ist der Standardwert NULL eingetragen und an den Stellen wo es für meta_key = wtf_rscore den Score mit dem richtigen Datenformat eingetragen ist.
Nun habe ich in der sidebar.php
einfach folgendes abgeändert:
<div class="featbox"> <h3 class="sidetitl "> Top Movies </h3> <?php $rate_query = new WP_Query( array ( 'post_type' => 'movies', 'orderby' => 'meta_value2', 'meta_key' => 'wtf_rscore','posts_per_page'=>'5' ) ); while ( $rate_query->have_posts() ) : $rate_query->the_post(); ?>
Also gleich zu Anfang habe ich einfach meta_value mit meta_value2 ausgetauscht.
Nun aktualisiere ich die sidebar.php per FTP und gucke ob ich einen Effekt erzielt habe und siehe da... Nope!!!
Nun ist das ganze unsortiert! Er zeigt mir einfach die Bewertungen der letzten 5 Filmeinträge. WTF!
Steh schon wieder auf dem Schlauch.
Edit:
Habe folgendes zum Thema gefunden:
http://bueltge.de/wordpress-query-quick-tipps/717/
unter "Loop auf Basis benutzerdefinierten Felder, der die nach diesen sortiert":
query_posts('meta_key=my_type&meta_compare=<=&my_value=20&orderby=my_value'); if (have_posts()) : while ( have_posts() ) : the_post(); ?>
Wie muss ich meine Form anpassen?
Edit2:
nochwas gefunden: http://codex.wordpress.org/Class_Reference/WP_Query
Order & Orderby Parameters
'meta_value' - Note that a 'meta_key=keyname' must also be present in the query. Note also that the sorting will be alphabetical which is fine for strings (i.e. words), but can be unexpected for numbers (e.g. 1, 3, 34, 4, 56, 6, etc, rather than 1, 3, 4, 6, 34, 56 as you might naturally expect).
'meta_value_num' - Order by numeric meta value (available with Version 2.8). Also note that a 'meta_key=keyname' must also be present in the query. This value allows for numerical sorting as noted above in 'meta_value'.
Also muss ich einfach mal mit meta_value_num ausprobieren!
Und YEAH es hat geklappt:
<?php $rate_query = new WP_Query( array ( 'post_type' => 'movies', 'orderby' => 'meta_value_num', 'meta_key' => 'wtf_rscore', 'posts_per_page'=>'5' ) ); while ( $rate_query->have_posts() ) : $rate_query->the_post(); ?>
Beitrag zuletzt geändert: 7.2.2012 14:03:36 von effektfabrik -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage