Alphabetische Sortierung

  • Hallo zusammen,

    ich bin Wordpress-Neuling und auch leider nicht sonderlich bewandert in php (bin mehr so der Java-Programmierer). Aber ich müsste mein Wordpress ein bisschen anpassen. Evtl. kann mir dabei ja jemand unter die Arme greifen!?

    Und zwar geht es darum, dass:

    1.) Ich bei der Ansicht eines Beitrags (single.php) oben in der Navigationsleiste nicht den chronologisch nächsten/vorhergehenden Beitrag, sondern den alphabetisch nächsten/vorhergehenden Beitrag angezeigt bekommen möchte. Hab auch schon ein bisschen mit der query_posts Methode rumgespielt und versucht die while Schleife meinen Bedürfnissen anzupassen, aber irgendwie will das nicht wirklich so. Ich glaube dafür fehlt mir das grundsätzliche Verständnis für php :neutral: .

    2.) Was auch sehr nützlich wäre, wäre wenn bei der Ansicht einer Kategorie die Beiträge ebenfalls in alphabetischer Reihenfolge dargestellt werden würden und nicht in chronologischer.

    3.) Ist es möglich die Alphabetische Sortierung der Kategorien im dazugehörigen Widget so anzupassen, dass ein "9." vor "10." dargestellt wird? Also die Wertigkeit des Punktes höher eingeschätzt wird als die einer Zahl? Sonst müsste ich anstelle von "9." "09." schreiben, was sehr hässlich aussieht.

    Das wars auch schon für den Anfang. Vorgefertigte Lösungen benötige ich nicht, wenn Ihr mir gute Links posten könnt, wo das alles erklärt wird (hab leider keine gefunden). Wenn aber jemand ne komplette Lösung dafür hat, dann werde ich diese natürlich auch nicht abschlagen :mrgreen: .

    Danke und Gruß
    Stefan

    Ps.: Mein Theme ist das Standard-DE-Theme.

    • Anzeige

    Hallo!

    Wenn du gerade an deiner Website arbeitest oder dein aktuelles Hosting überdenkst: Wir betreiben mit NetzLiving eine Hosting-Plattform, die speziell auf Performance, Sicherheit und einfache Verwaltung ausgelegt ist.

    • ✔️ Schnelle Ladezeiten (optimiert für WordPress & Co.)
    • ✔️ Deutsche Server & DSGVO-konform
    • ✔️ Persönlicher Support (kein 0815-Ticket-System)

    Mehr erfahren

  • 1.) Ich bei der Ansicht eines Beitrags (single.php) oben in der Navigationsleiste nicht den chronologisch nächsten/vorhergehenden Beitrag, sondern den alphabetisch nächsten/vorhergehenden Beitrag angezeigt bekommen möchte.


    Mmh, da wirst du dir wohl was selbst schreiben müssen, denn:

    Zitat von Codex

    displays a link to the next post which exists in chronological order from the current post.


    Template Tags/next post link « WordPress Codex

    Zitat

    2.) Was auch sehr nützlich wäre, wäre wenn bei der Ansicht einer Kategorie die Beiträge ebenfalls in alphabetischer Reihenfolge dargestellt werden würden und nicht in chronologischer.


    Das ist kein Problem. query_posts() hast du ja schon gefunden, für die Kategorieanzeige verwendest du einfach ein Kategorietemplate:
    Category Templates « WordPress Codex

    Zitat

    3.) Ist es möglich die Alphabetische Sortierung der Kategorien im dazugehörigen Widget so anzupassen, dass ein "9." vor "10." dargestellt wird?.


    Eher nicht. Da musst du dir die passende Sortierfunktion wahrscheinlich ebenfalls selbst bauen...

  • Auch in diesem Thread danke für deine Antworten :mrgreen:.

    Zu 1.) Gibts dazu evtl. irgendwo Tutorials die sowas oder zumindest etwas ähnliches beschreiben? Weil ich kenn mich mit PHP sehr wenig und der WordPress Software schonmal gleich gar nicht aus :cry:.

    Zu 2.) Merci, werde ich mir mal anschauen. Mal gucken wie lange ich zum Verzweifeln benötige ;)

    Zu 3.) Du weißt nicht zufällig wo diese Sortierfunktion definiert wird?

    Danke und Gruß
    Stefan

  • Zu 1.) Gibts dazu evtl. irgendwo Tutorials die sowas oder zumindest etwas ähnliches beschreiben? Weil ich kenn mich mit PHP sehr wenig und der WordPress Software schonmal gleich gar nicht aus :cry:.


    Da kann ich dir leider grade nicht helfen. Ich vermeide solche Links in der Regel. ;-)

    Zitat

    Zu 3.) Du weißt nicht zufällig wo diese Sortierfunktion definiert wird?


    Die Standard-Parameter beziehen sich dann direkt auf die SQL-Query, d.h. den "ORDER BY"-Part. Mir würde da nur einfallen, eine eigene Query zu basteln. Diese liefert dann ein Array mit den gefundenen Posts zurück, welches du dann sortieren kannst. Ich glaube aber nicht, dass das sonderlich performant ist.

    Ich kann dir noch folgende Links anbieten:
    Function Reference/WP Query « WordPress Codex
    Template Tags/get posts « WordPress Codex
    PHP: usort - Manual

  • OK, dann komme ich nochmal zu 2. zurück:

    Wenn ich das richtig verstanden habe, dann muss ich die Sortierung der query_posts Methode anpassen. Und zwar im Category-Template. Da ich weder die category-6.php noch die category.php habe, muss ich also die archive.php anpassen. Dort finde ich aber keinen Aufruf der Methode query_posts???

    Sorry für die dämlichen Fragen, aber ich kenne mich da gar nicht aus :oops:.

    Danke und Gruß
    Stefan

  • Macht ja nix. :-)
    Zur Erklärung: WP sucht beim Aufruf einer Kategorieübersicht nach einer category-6.php (6 = ID der Kategorie). Findet es diese sucht es nach der category.php, archive.php und zuletzt index.ph des Themes. Erstmal klar soweit? Du könntest also z.B. deine archive.php (verantwortlich für alle "Archive") hernehmen, kopieren und die Kopie in category.php umbenennen.

    In der so erstellten category.php findest du irgendwo ein have_posts(). Vorm 1. Auftreten dieser Funktion (meist 2x vorhanden: 1x als Abfrage ob Posts vorhanden sind, und ein 2. Mal für den sog. "Loop") kannst du query_posts() rufen und den "Loop" damit beeinflussen.

    Mal noch 2 Links dazu:
    Template Hierarchy « WordPress Codex
    The Loop « WordPress Codex

  • Also 2. funktioniert - Danke :-D ! Aber dadurch, dass ich jetzt den query_posts aufruf direkt in meiner archive.php habe, kann ich die Anzahl an Posts pro Seite nicht mehr limitieren. Ist ja auch logisch, woher soll wp sonst wissen, welche posts angezeigt wurden und welche noch nicht. Ich müsste also irgendwie den "ursprünglichen" query_posts ausfindig machen :confused: .

    Meine Idee für 1.: query_posts auf alphabetische Sortierung umstellen. Eine Variable definieren und dann eine Schleife durchlaufen lassen, bis der aktuell dargestellte Post erreicht ist und die Variable bei jedem Durchlauf um 1 erhöhen. Dann nochmal query_posts durchlaufen lassen und sobald wir bei dem post an der stelle 1 unter dem ermittelten Wert ist diesen ausgeben und selbiges nochmal für die stelle 1 über dem ermittelten Wert.

    Soweit die Theorie, nur in der Praxis hab ich keine Ahnung :neutral: .

    3.) Kann ich erstmal zurückstellen.

    Danke und Gruß
    Stefan

  • Für 1. könnte man die Filter get_next_post_sort, get_next_post_where, get_previous_post_sort und get_previous_post_where nehmen, s. Dokumentation

    Dazu müsste man den Code in wp-includes/link-template.php Zeile 579f. etwas näher studieren...

  • Die Sortierung bei 3. könnte man der Datenbank überlassen und die ORDER BY Klausel per Filter überschreiben:

    Code
    ORDER BY 
      ABS(SUBSTRING_INDEX(post_title, ' ', 1)),  
      SUBSTR(post_title,LOCATE(' ',post_title)+1)

    Das zerlegt den post_title in die beiden Komponenten
    1) alles bis zum ersten Leerzeichen als Zahl interpretiert
    2) alles nach dem ersten Leerzeichen als String interpretiert

    Sieht etwas komplizierter aus, könnte aber funktionieren :-D

    Einmal editiert, zuletzt von spickzettel (28. August 2008 um 01:05)

  • Also 2. funktioniert - Danke :-D ! Aber dadurch, dass ich jetzt den query_posts aufruf direkt in meiner archive.php habe, kann ich die Anzahl an Posts pro Seite nicht mehr limitieren. Ist ja auch logisch, woher soll wp sonst wissen, welche posts angezeigt wurden und welche noch nicht. Ich müsste also irgendwie den "ursprünglichen" query_posts ausfindig machen :confused: .


    Ich komm grad nicht mehr mit. :-) Kannst du das mal an einem Codebeispiel erklären? query_posts() kennt ja "posts_per_page" und auch "showposts"/"offset" für die Limitierung, sowie "paged" für die Seitenaufteilung. Außerdem gibts noch $query_string, der den ursprünglichen Loop-Querystring enthält.

  • marX

    Stimmt, funktioniert wie es soll. Ich war nur irritiert, dass unten kein "Ältere Beiträge" erscheint, sondern nur oben :confused: .

    spickzettel

    Danke für deine Mühen zu 3., aber wo sind denn die SQLs?

    Zu 1.) habe ich jetzt dank dir mein link-template.php so umgeschrieben (function get_adjacent_post):

    Usrprünglich:

    Jetzt:

    Es scheint zu funktionieren,. Mir wäre aber lieb, wenn da nochmal ein "Experte" drüber schauen könnte, nicht dass ich hier groben Unfug anstelle :oops: . Meine Änderungen:

    1.) neue Variable => current_post_title
    2.) anpassen von $where
    3.) anpassen von $sort

    Danke und Gruß
    Stefan

  • Stimmt, funktioniert wie es soll. Ich war nur irritiert, dass unten kein "Ältere Beiträge" erscheint, sondern nur oben :confused: .


    Da kommt es nur drauf an, wo im Template der code für die vorherigen/nächsten Beiträge steht. ;-)

    Zitat

    Zu 1.) habe ich jetzt dank dir mein link-template.php so umgeschrieben (function get_adjacent_post):


    Der "grobe Unfug" besteht hier am ehesten darin, dass du die Core-Datei direkt bearbeitest. Diese wird beim nächsten Core-Update evtl. überschrieben und deine Änderungen sind damit natürlich wieder weg. Sauberer wäre es, sich hier mit einem Plugin (bzw. auch in der functions.php des Themes) in die Filter einzuhängen, und die Queries so zu beeinflussen.

    Die Hooks wären dann diese hier 9siehe Link von spickzettel):

    Zitat

    get_next_post_sort
    in function get_next_post (which finds the post after the currently-displayed post), applied to the SQL ORDER BY clause (which normally orders by post date in ascending order with a limit of 1 post). Filter function arguments: ORDER BY clause.

    get_next_post_where
    in function get_next_post (which finds the post after the currently-displayed post), applied to the SQL WHERE clause (which normally looks for the next dated published post). Filter function arguments: WHERE clause, stay in same category (true/false), list of excluded categories.


    Die beiden werden dann jeweils bei den apply_filters()-Aufrufen angewendet.

  • Fränkisches Fragewort mit 2 Buchstaben: Hä?

    Sorry, aber ich versteh nur Bahnhof von dem, was du mir da versuchst mitzuteilen :confused: . Bin wie gesagt ein totaler n00b was WP und PHP angeht und kann mit "in den Filter einhängen", "Hooks", "apply_filters()-Aufrufen", ... relativ wenig anfangen. Sorry ...

  • Hehe. :-)

    Ich weiß, alles nicht so einfach... aber wie erklärt man's am besten...

    Erstmal Begriffe:
    "Hook" (Haken) - eine Stelle an der sich ein Plugin irgendwo einklinken kann.
    apply_filters() führt dann die an diser Stelle eingeklinkten plugins aus, darum musst du dich nicht kümmern. Du musst nur wissen, an welcher Stelle apply_filters() ausgeführt wird, um zu wissen, was du an dieser Stelle mit einem Plugin ausrichten kannst. mehr dazu in der Plugin-Dokumentation von WordPress.

    Da du aber schriebst, dass du "mehr so der Java-Programmierer" bist, dachte ich du kannst zumindest was mit den Begriffen anfangen. Eine Plugin-Schnittstelle ist ja prinzipiell immer ähnlich aufgebaut. ;-)

    Okay, was ich eigentlich sagen will: statt den direkten Änderungen im Core-Code von WP (also in wp-inlcudes/) solltest du versuchen deine Änderungen in ein Plugin auszulagern. Hauptgrund: Updatesicherheit.
    du musst dazu eigentlich "nur" deine 2 geänderten Zeilen statt im Core-Code in einem Plugin vornehmen. Und dazu dient der "Hook" (der hier per apply_filters() ausgeführt wird). Die Namen der hooks hab ich dir ja für die "next"-Links herausgesucht, für die "prev"-Links gilt das dann analog.

    Dein Plugin müsste also folgendes tun:
    Per "add_filter( $filter_name, $callback_function )" eine Funktion in den entsprechenden "Hook" einhängen. Die Funktion callback_function() ersetzt z.B. dann den Original-String:

    Code
    ORDER BY [B][COLOR="Red"]p.post_date[/COLOR][/B] $order LIMIT 1


    mit deinem geänderten String:

    Code
    ORDER BY [B][COLOR="Blue"]p.post_title[/COLOR][/B] $order LIMIT 1


    Das ist ja eine einfache str_replace()-Aufgabe an dieser Stelle.

    Ich hoffe jetzt ists etwas klarer geworden. Wenn nicht, einfach nachfragen. ;-)

  • Zu 3:

    PHP
    <?php 
    function neworder($orderby) {
      $orderby=" ABS(SUBSTRING_INDEX(post_title, ' ', 1)),  
      SUBSTR(post_title,LOCATE(' ',post_title)+1) ";
      return $orderby;
    }
    add_filter('posts_orderby','neworder'); ?>

    in ein eigenes Plugin oder in die functions.php des Themes. Das geht natürlich davon aus, dass man diese Sortierung immer haben will. Wenn es nur für eine Kategorie, z.B. die mit der Nummer 1, sein soll:

    PHP
    if (is_category(1)) {
        $orderby=...
      }
      return $orderby;

    Einmal editiert, zuletzt von spickzettel (28. August 2008 um 17:18)

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!