Problem mit der Tag-Array-Sortierung

Lesezeit: 6 Minuten

Benutzeravatar von Milan
Mailand

25.10.2012 – Immer noch nicht gelöst! Siehe unten:

Mein Kunde hat eine WordPress-Tag-Cloud (Tag-Array) mit Tags, die enthalten [“] Charakter sowie [The] Präfix für einige Tags. Dh:

"rose"
"autumn"
The Abby
The Cloud
The Elephant

Offensichtlich alle Tags, die in Anführungszeichen eingeschlossen sind [“] werden oben in der Liste sortiert und alle Wörter, die mit beginnen [The] Präfix sind irgendwo um den Buchstaben herum sortiert [T] (nach der logischen ASC-Reihenfolge).

Dabei wurde mir eingestreut: „Alle Tags (in der WP-Tag-Cloud) müssen aufsteigend bestellt werden, außer denen, die die enthalten [” “] oder [The] Zeichen müssen mit allen anderen Tags in chronologischer Reihenfolge sortiert werden, wobei die ignoriert werden [“] und [The] Präfix.

Ich habe mir die WP-Kernfunktion angesehen:

**function wp_generate_tag_cloud**

aber ich habe keine ahnung wo ich anfangen soll. In der rohen SQL-Anweisung könnte ich wahrscheinlich trim() verwenden, um das herauszufiltern [” “] und [The] Zeichen bilden das Tag-Cloud-Array, aber das ist nur ein Gedanke, von dem ich keine Ahnung habe, wie ich ihn anwenden soll.

  • Möchten Sie sie in MySQL oder PHP sortieren?

    – Jack

    24. Oktober 2012 um 2:26 Uhr

  • Ich denke, beides ist in Ordnung, solange ich es an das WP anschließen kann [wp_generate_tag_cloud] Hauptfunktion. Die Frage ist nicht, wie man die MySQL-Abfrage dazu bringt, die ausgewählten Zeichen zu ignorieren und sie folglich zu sortieren (ORDER BY) ASC, die Frage ist, wie man “jede” gute Lösung in die WP-Plattform integriert. Vielen Dank.

    – Mailand

    24. Oktober 2012 um 4:01 Uhr

  • Könnten Sie nicht einfach die Datenbanktabelle aktualisieren und sowohl die Zitate als auch den Artikel entfernen? Fügen Sie dann so etwas wie einen Filter im Tag-Formular hinzu, um diese Dinge für neu erstellte Tags zu entfernen?

    – Wadim Aschikman

    26. Oktober 2012 um 19:42 Uhr


  • @VadimAshikhman Ich denke, die Tags sollen die Anführungszeichen enthalten, daher wäre es nicht richtig, sie zu entfernen.

    – Nick Perkins

    2. November 2012 um 4:28 Uhr

Benutzeravatar von lanzz
lanzz

wp_generate_tag_cloud() ruft einen Filter namens auf tag_cloud_sortdie die in der angegebene Sortierreihenfolge überschreiben kann $args Parameter. Das tag_cloud_sort filter erhält ein Array von Tags und die tatsächliche $args Parameter übergeben wp_generate_tag_cloud()damit es die vollständigen Einstellungen der überprüfen kann wp_generate_tag_cloud() aufrufen und sein Verhalten entsprechend anpassen.

Du könntest so etwas versuchen:

function custom_tag_sort($tags, $args) {
    if ($args['orderby'] != 'name') {
        // do not reorder if sort order is not by name.
        // wp_generate_tag_cloud() is smart enough to notice order
        // is not changed and will proceed with its regular sort logic.
        return $tags;
    }
    uasort($tags, 'custom_tag_sort_compare');
}

function custom_tag_sort_compare($a, $b) {
    return strnatcasecmp(
        custom_tag_sort_normalize($a->name),
        custom_tag_sort_normalize($b->name)
    );
}

function custom_tag_sort_normalize($tag) {
    // strip quote marks
    $tag = trim($tag, '"');
    // strip leading definitive article
    $tag = preg_replace('/^\s*the\s+/i', '', $tag);
    return $tag;
}

add_filter('tag_cloud_sort', 'custom_tag_sort');

Haftungsausschluss: Ich habe dies nach nur oberflächlicher Prüfung geschrieben wp_generate_tag_cloud() Funktion. Ich habe es nicht auf einer Live-WordPress-Installation getestet; Ich habe nur überprüft, ob die Sortierfunktion auf Ihrer Beispiel-Tag-Cloud korrekt funktioniert:

The Abby
"autumn"
The Cloud
The Elephant
"rose"

  • Hallo, das sieht vielversprechend aus. Ich habe es in die Datei functions.php aufgenommen. Es scheint noch nicht zu funktionieren, aber lass mich damit herumspielen und ich werde dich hochstimmen, wenn mich das auf den richtigen Weg bringen würde. Vielen Dank!

    – Mailand

    27. Oktober 2012 um 4:06 Uhr

  • ..OK, ich werde das abstimmen, obwohl ich es immer noch nicht in meinem Skript zum Laufen gebracht habe, da ich nicht nach ‘Name’ sortiere, sondern stattdessen ein Array zurückgebe, dh: wp_tag_cloud(‘format=array’)

    – Mailand

    28. Oktober 2012 um 5:46 Uhr

  • Die Voreinstellung für die orderby Argument für beide wp_tag_cloud und wp_generate_tag_cloud ist namealso wenn du anrufst wp_tag_cloud('format=array') Sie werden immer noch nach Namen sortiert wp_generate_tag_cloud. Meine Implementierung vermeidet nur dann eine falsche Sortierung, wenn wp_generate_tag_cloud ist ausdrücklich mit einer anderen Sortierreihenfolge aufgerufen.

    – lanz

    28. Oktober 2012 um 9:21 Uhr

ok, Sie möchten also vermeiden, den Kerncode von WordPress zu ändern … wenn Ihr Client auf die Schaltfläche “Aktualisieren” klickt, nachdem Sie ihm gesagt haben, dass er es nicht tun soll, dann müssen Sie hineingehen und erneut damit herumspielen … verwenden Sie stattdessen Aktionshaken. Praktischerweise gibt es einen zum Einhängen in die Ausgabe für die Tag-Cloud-Funktion. fügen Sie dies zu Ihrer Themes-Funktionsdatei hinzu

function tagCloudFilter($tagCloudString, $args)
{
    $tagCloudString = str_replace('The','', $tagCloudString);
    $tagCloudString = str_replace('"','', $tagCloudString);
}

add_filter('wp_tag_cloud', 'tagCloudFilter', 10, 2);

Das wird zumindest das Zeug loswerden, das Sie nicht wollen. Was die Sortierung angeht, bin ich mir nicht sicher, aber das sollte Sie auf den Weg bringen. es kann einfacher sein, es mit jquery zu sortieren

Wenn Sie den Kerncode wirklich ändern möchten, führen Sie eine Foreach-Schleife im Tag-Array aus, bevor es formatiert wird, und verwenden Sie die str_replaces von oben in dieser Schleife. Führen Sie einfach sort () für dieses Array aus, und Sie sollten gut sein. Aber wenn ich es wäre, würde ich mit der halben Lösung gehen und es nicht alphabetisch machen lassen, als den WordPress-Kern zu modifizieren

  • TEIL 1: Hallo; Danke. Ihr Kommentar macht Sinn und ich stimme zu, dass das Letzte, was ich tun möchte, darin besteht, den Kern zu ändern und mich dazu zu zwingen, mich jedes Mal an die Änderungen zu erinnern, wenn WP aktualisiert werden muss. Davon abgesehen ist der Action-Hook str_replace eine großartige Lösung. Es fällt mir jedoch schwer, herauszufinden, wie ich mich richtig in die “Funktion wp_generate_tag_cloud” einklinken kann, damit auch die SQL-Abfrage geändert wird. Zum Beispiel könnte ich die aktuelle MySQL-Abfrage irgendwie mit der Klausel ….ORDER BY TRIM( LEADING ‘The ‘ FROM (slug) ) anhängen. (Ich habe es nicht getestet, ich bin nur …

    – Mailand

    24. Oktober 2012 um 3:49 Uhr

  • TEIL 2: … es von oben auf meinem Kopf kochen) aber WIE? Wenn ich str_replace verwende, werden die Zeichen buchstäblich herausgefiltert (ersetzt), die aus den Array-Werten bestehen, die ich noch behalten muss. Irgendwelche weiteren Gedanken? Danke nochmal.

    – Mailand

    24. Oktober 2012 um 3:49 Uhr

Hier ist ein Gedanke:

Sie könnten die ursprüngliche tag_cloud-Funktion kopieren und Ihre eigene in Ihrer functions.php erstellen.

Sie nehmen die gewünschten Änderungen vor und fügen diesen Filter in die Funktion ein:

$return = apply_filters( 'YOUR_tag_cloud_function', $return, $args );

Erstellen Sie dann den vorherigen Filter, um Ihre Funktion zum Hook hinzuzufügen:

add_filter('wp_tag_cloud', 'YOUR_tag_cloud_function');

Ich weiß nicht, ob es funktioniert, ich habe es nicht getestet. Was denkst du?

1390270cookie-checkProblem mit der Tag-Array-Sortierung

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy