Ein Archiv mit Thumbs via custom fields für WordPress

tempa wrote this 15:13:

Nachdem ich vor einigen Tagen meine erste eigene WordPress.PHP-Erweiterung für die Sidebar zusammengefriggelt hatte, ging ich munter daran, diesen netten praktischen Code-Schnipsel in eine Seite einzubinden und parallel die ganze Angelelgenheit ein wenig auszubauen. Doch was relativ schnell und einfach in die Sidebar einzubauen ging, erweist sich in der Seite in der erweiterten Form doch als reichlich widerspenstig. Nach etlichen Try&Error-Fehlschlägen und zahlreichen traurigen Teilerfolgen, habe ich es nun beinahe geschafft … beinahe, denn leider looped mein Script noch etwas übereifrig gleich mehrfach und listet die Liste damit mehrfach hintereinander. Ich will mit der Geschichte von Anfang an beginnen.

Um in in dem neuen T-Shirt-Projekt unter franchie.de meinen Kunden praktische Suchhilfen und Sortierkriterien in die Hand zugeben, so dass Sie A) gezielt nach Motiven schauen können und sich B) sich einen geordneten Überblick über die Motive verschaffen können, habe ich in der Kategorie Motive ein Custom Field eingeführt, das:

  1. den Namen des Vorschaubildes enthält,
  2. Stichwörter, die die Motive in Motivgruppen unterteilt, wie z.B. Humor, Menschen, Grafik, Plottdruck, Aktion-XY und
  3. Link zur Shopseite mit den Shirts auf denen das Motiv abgebildet ist

Wird in einem Beitrag mehr als ein Motiv vorgestellt, dann sind in dem Feld mehrere Zeilen mit den Angaben wie oben angezeigt. Aus diesen Angaben soll nun eine Galerie-Seite erstellt werden, also eine Archivseite mit Thumbs, die die Definitionlist-Formatierung nutzt, die hier im Weblog vorgestellt wurde. Der Code ist ähnlich dem Code für die Thumbnailgalerie in der Sidebar, allerdings steckt in dem folgenden PHP-Code noch ein Bug und ich hoffe nun, dass sich mir jemand erbarmt und sagen kann, wo ich den Loop limitieren muss, so dass er nur einmal und nicht mehrmals durchläuft und Bilder und Links listet. Aaaahlsooooh … finde den Bug:

  1. <?php /* */
  2. $getThumbs = new WP_Query();
  3. $getThumbs->query('');
  4. while ($getThumbs->have_posts()) : $getThumbs->the_post();
  5. $dgal = get_posts('category=1');
  6. foreach($dgal as $post) : setup_postdata($post);
  7. $galArr = explode("n", get_post_meta($post->ID, "designthumbs", true));
  8. foreach($galArr as $thepics){
  9. $dtharr = explode(",", $thepics);
  10. $pos = strpos($dtharr[1], 'Menschen');
  11. if($pos===false){}else{
  12. $galentry = '<dl class="galerie2">'."nt".'<dt><span><img src="http://franchie.de/ ... /'.$dtharr[0].'" alt="'.$dtharr[2].'" /></span></dt>'."nt".'<dd><a href="'.get_permalink($post->ID, '', true).'" title="'.the_title('','',false).'">Details ansehen</a> /<br /><a href="http://franchie.spreadshirt.net/ ... /'.$dtharr[3].'" title="'.$dtharr[2].'">Will ich haben!</a></dd>'."n".'</dl>';
    //writing actual galery entry
  13. echo $galentry;
  14. }
  15. }
  16. endforeach;
  17. endwhile;
  18. //*/
  19. ?>

OK, hier ist soweit ich den Programm-code verstehe:

  1. Ich eröffne ein PHP-Statement und für den Fall das mein erster Versuch eine Fluppe ist, lege ich auch gleich das Auskommentieren mit dem Trick 17 an, bei dem ich in dieser Zeile nur den letzten Slash wegnehmen muss und schon ist der Block hier bis Zeile 18 auskommentiert.
  2. Ich Greife auf die WP-Klasse Query zu und öffne eine neue Instanz
  3. Ich schreibe das Ergebnis der Klasse in die Variable $getThumbs.
  4. Ich öffne ein While-Schleifchen, das solange kringelt, solange es noch einen Post findet.
  5. Ich isoliere alle Beiträge die meiner Kategory entsprechen und schreibe diese in die Variable $dgal
  6. Ich öffne ein foreach-Schleifchen, das durch meine Einträge im Array $dgal enthalten sind
  7. Ich fische aus diesem Array das/die Metafelder, die die Bezeichnung „designthumbs“ führen und zerlege hierbei gleich noch die Metainhalte in eine Array nach über das Trennzeichen „Zeilenwechsel“
  8. Den so gewonnen neuen Array wandere ich mit einer weiteren foreach-Schleife durch
  9. In diesem Prozess zerlege ich die komma-spearierten Zeileneinträge in seine Bestandteile und erhalte so Teil-Url des Thumbs, Stichwörter zum Thumb und die assoziierte Shopseite zum Thumb.
  10. Ich definiere einen Selektoren.
  11. Ich packe wie Aschenputtel über die If-Klausel mit dem zuvor defnierten Selektor die Erbsen und die Linsen in zwei separate Schälchen. Mit dem Ersten stelle ich nichts an mit dem Zweiten …
  12. schreibe ich den eigentlichen Galerie-Eintrag in ein Variable. Dabei lerne ich, dass ich nun nicht the_permalink() (wie bei der Sidebar) verwenden darf sondern im Beiträgen get_permalink() verwenden muss und dann the_title() in beiden Fällen stimmt … *Phrrrrz* Was natürlich über ich rate mal, weil schließlich gibt es auch ein get_post_meta() zustande kommt und nicht weil im Codex oder in der deutschen Doku hier ein hilfreicher Hinweis stünde *grrrh*
  13. Ich gebe die Variable aus meinem Erbsenschälchen per echo aus
  14. und schließe das IF
  15. Ich schließe foreach innen
  16. Ich schließe das foreach außen
  17. Ich schließe die while-schleife
  18. Ich kommentiere den mehrzeiligen Kommentarschluß mit doppelten Slash aus, so dass dieser nicht stört wenn oben in der ersten Zeile der mehrzeilige Kommentar noch geschlossen ist.
  19. Ich schließe mein PHP-Script

Soweit man mich fragt, liegt das Problem in der While-Anweisung oder in der ersten foreach-Schleife … aber hier fehlt mir noch die Erfahrung mit WordPress in Bezug auf PHP-Programmierung … *seufz*

Nachtrag: Sollte jemandem auffallen, das ich ein foreach nicht geschlossen habe … oder dass man hier auch ein Semikolons nach den geschweiften Klammern setzen kann … sollte? … das das war mir auch schon aufgefallen mit dem Ergebnis, dass die von den fünf Einträgen mit entsprechendem custom field dieses nicht mehr nur fünf Mal gelistet wird, sondern freundlich 25 Mal. Schätze das Problem liegt an den geschachtelten foreach-Schleifen … ich krieg die Meise … *piep piep piep*

Nachtrag: Fehler in Fehlerhaftes einbauen, die helfen den Fehler zu verstehen ist was Feines.

Alles was das PHP-Skript aus der Sidebar brauchte, um in der Page zu funktionieren, war die Anderung von the_permalink() in get_permalink().

Zum Fehler verstehen: Beim rumrätseln und mit klassichem Anfänger-Unverstand und in bester copy&paste-Mentalität aus diversen Codeschnipseln, hatte ich erst einen eigenen Loop aufgemacht — die whileschleife und hatte dann unabhängig von der Whileschleife in jedem Durchgang eine foreach-Schleife exerziert, die ebenfalls alle Posts herauszieht und dann wurde auch brav in jeder Schleife alles aufgedröselt und und angezeigt, was dann zu fünf einträgen führte.
Loopidooh! 😀

Die Lösung Nope … noch nicht die Lösung für die Thumb-Galerie:

Wer also eine solche Thumbliste für sein Weblog möchte hier ist der bereinigte Code:

  1. <?php /* */
  2. $dgal = get_posts('category=1');
  3. foreach($dgal as $post) : setup_postdata($post);
  4. $galArr = explode("n", get_post_meta($post->ID, "designthumbs", true));
  5. foreach($galArr as $thepics){
  6. $dtharr = explode(",", $thepics);
  7. $pos = strpos($dtharr[1], 'Menschen');
  8. if($pos===false){}else{
  9. $galentry = '<dl class="galerie2">'."nt".'<dt><span><img src="http://franchie.de/ ... /'.$dtharr[0].'" alt="'.$dtharr[2].'" /></span></dt>'."nt".'<dd><a href="'.get_permalink($post->ID, '', true).'" title="'.the_title('','',false).'">Details ansehen</a> /<br /><a href="http://franchie.spreadshirt.net/ ... /'.$dtharr[3].'" title="'.$dtharr[2].'">Will ich haben!</a></dd>'."n".'</dl>';
    //writing actual galery entry
  10. echo $galentry;
  11. }
  12. }
  13. endforeach;
  14. //*/
  15. ?>

Noch immer steh ich auf dem Schlauch und kann zwar schon eine Galerie für recent Thumbs anlegen, nicht aber wie einem Archiv jeweils alle Ausfiltern, die ein Kriterium erfüllen und dann die nächste Liste machen, die ein anderes Kriterium erfüllen und die nächste und die nächste …

Für Hinweise die mich auf dem rechte Pfad leiten also immer noch dankbar

9 Responses to “Ein Archiv mit Thumbs via custom fields für WordPress”

  1. Basic Thinking Blog | php-problem Says:

    […] sich jemand Silkes Problem anschauen, die nichts anderes als eine Thumbnailübersicht mit Links erstellen möchte, […]

  2. Michael Says:

    Hm, ich bin Robert’s Hinweis gefolgt und hab mir Deinen Code angeschaut, aber, was soll da nochmal gemacht werden? Hast Du den Kram irgendwo am Laufen?

  3. Silke Schümann Says:

    Ich habe ich http://franchie.de die Thumbs in der Sidebar erfolgreich ausgelesen.

    Ansonsten ist die Test-Umgebung unter 1a-test dot de / blog
    Ich will diese Adresse nur nicht in irgendwelchen Suchmaschinen wiederfinden und schon gar nicht bei den Spammern, sonst böte ich einen Link an. 😉

    Die Seite „Test2: Designlisiting“ zeigt eine Liste. Doch kann ich diese Abfrage nicht wiederholen.

    Ich will z.B. alle Thumbs einer Kategorie anzeigen, die das Thema Dschungel behandeln. Dazu gibt es in den Customfields das Feld Designthums.

    Ich habe in der Kategorie 1 ein Custom field namens ‚designthumbs‘. In dem Feld ist der Inhalt wie folgt:

    Name des Thumbs_a, Stichwort1 Stichwort2 Stichwort3 etc, externerLink_a
    Name des Thumbs_b, Stichwort1 Stichwort3 Stichwort7 etc, externerLink_b
    etc.

    Diese Thumbs sollen in einer Galerie in einer Seite ausgegeben werden:

    H3: Stichwort 1:
    ============
    [Thumb_a]
    Postlink
    externer Link a

    [Thumb_b]
    Postlink
    externer Link b

    H3 Stichwort 2
    ============
    [Thumb_a]
    Postlink
    externer Link a

    etc.

  4. Ulf Says:

    ich würde bei der Syntax für Schleifen konsequent die C-ähnliche Variante mit geschweiften klammern nehmen, nicht die alternative mit Doppelpunkt und „endwhile“ bzw. „endforeach“.

  5. Silke Schümann Says:

    Ich ziehe diees Variante ebenfalls vor, dovh wenn ich Code übernehmen, dann ändere ich hierfür nicht extra. Es dürfte gehzpft wei gesprungen sein, welche man nimmt, solange man noch den Überblick behält. Insbesondere da ich die Dopelpunkt-Variante ohnehin noch nicht ganz verstehe.

    In der Verwendung des einen oder des anderen liegt nicht das Problem. Mir ist nicht klar, warum ich die Query nicht mehrmals aufrufen kann. Mit Klassen kenn ich mich noch weniger aus, sonst könnte ich den Spaß in einer Klasse abkapseln und für jedes Stichwort eine neue Instanz aufrufen … *seufz* zumindest wenn ich Klassen soweit ich sie verstehe, richtig verstehe.

  6. Michael Says:

    Wie wäre es, wenn Du die Zeile

    $dgal = get_posts(‚category=1‘);

    auslagerst und den Rest in eine Funktion packts, der Du $dgal übergibst. Das wäre auch performanter, denn die Query würde dann nur einmal ausgeführt werden.

  7. Silke Schümann Says:

    Jepp. Das war’s:
    ES tut!

    Lösung ist nun in einem eigenen Beitrag: Step1 zur Archiv-Thumbgalerie via Custom fields Marke Eigenbau Fertig und betriebstüchtig! 🙂

  8. Andreas Says:

    Hey, ich habe den Code wie oben benutzt und auch

    $dgal = get_posts(‚category=1′);

    on der richtigen Zeile eingesetzt nur bei mir läufts immernoch nicht. Kann mich jmd via email kontaktiern um meine code sich kurz anzuschauen etc. Das wäre sehr nett und lieb 🙂

  9. Silke schümann Says:

    Du warst auf dieser Seite: Step1 zur Archiv-Thumbgalerie via Custom fields Marke Eigenbau

    http://templaterie.de/blog/931/step1-zur-archiv-thumbgalerie-via-custom-fields-marke-eigenbau/

    Hier war ich noch am Basteln. Ich fürchte meine PHP-Kenntnisse sind noch zu schwach ausgeprägt um erfolgreich eine Fehlersuche durchzuführen.

    Ich habe auch mit dem support im WP-Forum gearbeitet. Poste Deinen Code doch Mal ins Forum, wenn Dir der Link hier im Kommentar nicht hilft.

Leave a Reply