dynamicinternet Webdesign

Das Blog

Themen, Tutorials sowie Tipps & Tricks über Webdesign, (X)HTML und CSS, Programmierung, WordPress und was uns sonst noch bewegt.

RSS abonnieren

WordPress Pages nach meta_value sortieren

Warum schon wieder ein Artikel über benutzerdefinierte Felder (custom fields) in WordPress? Ganz einfach, ich wurde von Frank Bueltge dazu gezwungen !!! ;)

Ok, Spass beseite. Ich mag die benutzerdefinierten Felder in WordPress und habe ja ebenfalls schon Einiges und Einiges und Einiges darüber geschrieben. Es lassen sich eine Menge Sachen damit bewerkstelligen, die so nicht ohne weiteres machbar sind. Aber jetzt zum konkreten Beispiel.

Unser Görlitz ist ein Projekt von mir, in dem es unter Anderem um die wunderschönen historischen Häuser der Görlitzer Altstadt geht. In der Rubrik Baudenkmale hat jedes Objekt eine eigene Seite mit Text und Bildern.

Als ich anfing, die Templates für die Seiten zu erstellen, wollte ich einige Infos wie Epoche, Baujahr und Lage des jeweiligen Objekt etwas hervorheben. Ich hätte das mit einer ungeordneten Liste machen können, aber dann dachte ich, mach es mit benutzerdefinierten Feldern, wer weiß, wozu es später gut ist.

Also habe ich die Keys (Schlüssel) Baujahr, Epoche, Lage und Objekt angelegt. Sie stehen danach bei jeder Post/Seite zur Verfügung. Nun brauche ich bei jeder neuen Seite nur die Schlüssel auswählen und mit Werten füllen.

benutzerdefinierte Felder Screenshot

Die benutzerdefinierten Felder auszugeben, ist ganz einfach:



<h2>Kurzinfo</h2>

<?php the_meta(); ?>

Und so sieht das dann auf der Webseite aus:

Screenshot Webseite

Nicht sonderlich spannend.

Auf der Übersichtsseite der Baudenkmale gebe ich die Baudenkmale alphabetisch geordnet mit wp_list_pages aus:



<h3>nach Alphabet</h3>

<ul>

 <?php wp_list_pages('child_of=7&depth=1&title_li=0&sort_column=post_name'); ?>

</ul>

Dann kam mir aber die Idee, die Objekte auch nach Epoche geordnet auszugeben. Das ist so ohne Weiteres mit WordPress nicht möglich. Aber ich habe ja meine benutzerdefinierten Felder, die den Key Epoche haben und als Werte Gotik, Renaissance usw.

Zuerst brauchte ich die verschieden Epochen und dazu konnte ich mit wp_list_pages die jeweiligen zugehörigen Seiten auflisten, da wp_list_pages als Parameter meta_key und meta_value bereitstellt. Hier der Code:



<h3>nach Epoche</h3>

<?php

$epochen = $wpdb->get_results("SELECT DISTINCT meta_value FROM $wpdb->postmeta WHERE meta_key ='Epoche' ORDER BY meta_value ASC");

foreach ($epochen as $epoche) { ?>

 <h4><?php echo $epoche->meta_value; ?></h4>

 <ul>

 	<?php wp_list_pages('child_of=7&depth=1&title_li=0&meta_key=Epoche&meta_value='.$epoche->meta_value.'&sort_column=post_name'); ?>

 </ul>

<?php } ?>

Eine recht einfache Geschichte, die aber wieder einmal sehr schön aufzeigt, was man so alles mit WordPress anstellen kann. Wenn ich jetzt zum Beispiel zu den Häusern als benutzerdefinierte Felder zusätzlich Geo-Koordinaten eingeben würde und dann eine Google-Map damit füttere …

Ich tue es aber nicht, weil alle möglichen Web 2.0 Seiten, denen kein Content einfällt, eben dieses machen ;) .

10 Kommentare
  1. Christian sagt:

    Hallo, deine Artikel sind sehr verständlich geschrieben. Allerdings komme ich mit einem speziellen Problem nicht weiter: Wie kann ich ein bestimmtes Custom Field einer Seite(!) in der Sidebar ausgeben? Ich möchte einen bestimmten Wert der neuesten Seite anzeigen, komme aber einfach nicht weiter.

  2. Micha sagt:

    Ganz einfach:
    Da du ausserhalb des Loops bist, brauchst du zunächst die ID deiner Seite:
    $mypageID = get_the_ID(); //jetzt hast du die ID
    get_post_custom($mypageID) holt alle Schlüssel-/Wertpaare
    get_post_custom_keys($mypageID) holt alle Schlüssel
    get_post_custom_values($mypageID) holt alle Werte
    get_post_custom_values(‘foo’, $mypageID) holt den Wert, wo der Schlüssel foo ist.

  3. Basti sagt:

    Hallo,

    danke für diese Hilfestellung.

    Habe folgendes Problem: Eine Künstler-Seite mit einer Rubrik für “Upcoming Shows” soll nach Datum sortiert werden. Das Datum ist als Custom Field angelegt, da das Datum ja in der Zukunft liegt und die Posts nicht veröffentlicht würden, wenn ich das normale “Published Date” ‘entfremden’ würde.

    Kann mir jemand folgen? :)

    Also die Frage ist, ob ich ein Archiv nach einem Datum sortieren kann das als Custom Field (String!) vorliegt….

    Danke für die Bemühungen : )

  4. Micha sagt:

    Gehen tut das, es ist nur sehr aufwendig. Du muß erst die meta_values holen, in das amerkinaische Datumsformat umwandeln und dann das Array nach dem datum sortieren und dann ausgeben.

  5. Felix sagt:

    coole Sache eigentlich… sollte ich bei mir auch mal machen.

  6. Chris sagt:

    Völlig geniale Sache, werd ich morgen gleich mal ausprobieren. Das einzige was nicht funkt ist der link zur Görlitz Seite, weil dort das “i” fehlt.

    Ciao :-)

  7. Chris sagt:

    Eine kurze Frage hätte ich dann aber doch noch. Wie kann ich mir eigentlich die letzten 10 veröffentlichten Seiten (nicht Posts) anzeigen lassen ???

    Danke!

  8. Micha sagt:

    Chris, ich denk mal sowas in der Art:
    $seiten = $wpdb->get_results('SELECT * FROM '.$wpdb->posts.'
    WHERE post_status="publish"
    AND post_type="page"
    ORDER BY post_date DESC');

    Danach mit
    foreach($seiten as $seite) :
    dein code
    endforeach;

  9. Valentin sagt:

    Basti, ich hatte gerade das gleiche Problem :-)

    Die reine Sortierung der Posts für bestimmte Kategorien kannst du relativ leicht steuern, indem du in der archive.php dem Loop folgenden Aufruf voranstellst:

    ’26′ ist hier die ID der Kategorie “Termine”, die Custom Fields habe ich “date” genannt und der Wert ist ein sortierbares Datumsformat (z.B. 090502).

    Ein menschenlesbares Datum (z.B. “2. Mai”) kommt erstmal in die Überschrift. Hierfür habe ich noch keine bessere Lösung gefunden.

    Man könnte im Loop für diese Posts statt des Post-Datums das Custom Field ausgeben, aber dann bräuchte man noch ein zweites mit einem hüschen Datum (z.B. “2. Mai 2009″).

    Der Vorschlag von Micha, hier ein Array zu verwenden klingt vielversprechend, ist mir aber für den Moment zu aufwändig.

    Bei der Ausgabe erscheint es mir grundsätzlich sinnvoller, das Veranstaltungsdatum zusätzlich zum Post-Datum auszugeben. Ich fände es verwirrend, wenn an der Stelle, wo normalerweise bei allen Posts immer das Veröffentlichungsdatum steht, auf einmal ein anderes Datum angezeigt würde.

  10. Valentin sagt:

    Oops, mein Snippet wurde von WordPress gefressen.

    Habs jetzt beim Schnippler reingelegt:
    http://snipplr.com/view/13971/wordpress-sort-order-by-custom-field-for-specific-category/

Einen Kommentar schreiben