Ich versuche gerade, eine Liste von Musiktiteln auszugeben und möchte, dass die Sortierung den ersten Artikel des Titels ignoriert (aber immer noch anzeigt).
Wenn ich zum Beispiel eine Liste von Bands hatte, wird diese in WordPress alphabetisch wie folgt angezeigt:
- Black Sabbath
- Led Zeppelin
- Pink Floyd
- Die Beatles
- Die Knicke
- Die Rolling Stones
- Dünne Lizzy
Stattdessen möchte ich, dass es alphabetisch angezeigt wird, während der ursprüngliche Artikel 'The' ignoriert wird:
- Die Beatles
- Black Sabbath
- Die Knicke
- Led Zeppelin
- Pink Floyd
- Die Rolling Stones
- Dünne Lizzy
Ich bin in einem Blogeintrag aus dem letzten Jahr auf eine Lösung gestoßen , die folgenden Code vorschlägt functions.php
:
function wpcf_create_temp_column($fields) {
global $wpdb;
$matches = 'The';
$has_the = " CASE
WHEN $wpdb->posts.post_title regexp( '^($matches)[[:space:]]' )
THEN trim(substr($wpdb->posts.post_title from 4))
ELSE $wpdb->posts.post_title
END AS title2";
if ($has_the) {
$fields .= ( preg_match( '/^(\s+)?,/', $has_the ) ) ? $has_the : ", $has_the";
}
return $fields;
}
function wpcf_sort_by_temp_column ($orderby) {
$custom_orderby = " UPPER(title2) ASC";
if ($custom_orderby) {
$orderby = $custom_orderby;
}
return $orderby;
}
und dann die Abfrage mit add_filter
vorher und remove_filter
nachher umschließen .
Ich habe es versucht, aber auf meiner Website wird immer wieder der folgende Fehler angezeigt:
WordPress-Datenbankfehler: [Unbekannte Spalte 'title2' in 'order clause']
SELECT wp_posts. * FROM wp_posts WHERE 1 = 1 AND wp_posts.post_type = 'release' AND (wp_posts.post_status = 'publish' OR wp_posts.post_status = 'private') ORDER BY UPPER (title2) ASC
Ich werde nicht lügen, ich bin ziemlich neu im PHP-Teil von WordPress, also bin ich mir nicht sicher, warum ich diesen Fehler bekomme. Ich kann sehen, dass es etwas mit der 'title2'-Spalte zu tun hat, aber nach meinem Verständnis sollte sich die erste Funktion darum kümmern. Auch wenn es einen intelligenteren Weg gibt, bin ich ganz Ohr. Ich habe auf dieser Seite herumgegoogelt und gesucht, aber ich habe nicht wirklich viele Lösungen gefunden.
Mein Code, der die Filter verwendet, sieht wie folgt aus:
<?php
$args_post = array('post_type' => 'release', 'orderby' => 'title', 'order' => 'ASC', 'posts_per_page' => -1, );
add_filter('post_fields', 'wpcf_create_temp_column'); /* remove initial 'The' from post titles */
add_filter('posts_orderby', 'wpcf_sort_by_temp_column');
$loop = new WP_Query($args_post);
remove_filter('post_fields', 'wpcf_create_temp_column');
remove_filter('posts_orderby', 'wpcf_sort_by_temp_column');
while ($loop->have_posts() ) : $loop->the_post();
?>
Antworten:
Das Problem
Ich denke da ist ein Tippfehler drin:
Der Name des Filters ist
posts_fields
nichtpost_fields
.Dies könnte erklären, warum das
title2
Feld unbekannt ist, da seine Definition nicht zur generierten SQL-Zeichenfolge hinzugefügt wird.Alternative - Einzelfilter
Wir können es umschreiben, um nur einen einzigen Filter zu verwenden:
Hier können Sie nun die benutzerdefinierte Bestellung mit dem
_custom
orderby-Parameter aktivieren :Alternative - Rekursiv
TRIM()
Lassen Sie uns die rekursive Idee umzusetzen Pascal Birchler , kommentiert hier :
wo wir zum Beispiel die rekursive Funktion konstruieren können als:
Das bedeutet, dass
erzeugt:
Alternative - MariaDB
Im Allgemeinen verwende ich gerne MariaDB anstelle von MySQL . Dann ist es viel einfacher, weil MariaDB 10.0.5 unterstützt
REGEXP_REPLACE
:quelle
functions.php
und ihn über aufrufen,orderby
wenn ich ihn brauche. Tolle Lösung - danke :-)Eine einfachere Möglichkeit besteht darin, den Permalink-Slug für die Posts zu ändern, die diesen benötigen (unter dem Titel auf dem Post-Schreibbildschirm), und diesen dann nur für die Bestellung anstelle des Titels zu verwenden.
dh verwenden
post_name
nichtpost_title
für die Sortierung ...Dies würde auch bedeuten, dass Ihr Permalink möglicherweise anders ist, wenn Sie% postname% in Ihrer Permalink-Struktur verwenden, was ein zusätzlicher Bonus sein könnte.
z.B. gibt es
http://example.com/rolling-stones/
nichthttp://example.com/the-rolling-stones/
EDIT : Code zum Aktualisieren der vorhandenen Slugs, Entfernen der unerwünschten Präfixe aus der
post_name
Spalte ...quelle
BEARBEITEN
Ich habe den Code ein wenig verbessert. Alle Codeblöcke werden entsprechend aktualisiert. Nur ein Hinweis, bevor ich zu den Updates in der ORIGINAL-ANTWORT übergehe , habe ich den Code so eingerichtet, dass er mit den folgenden Elementen funktioniert
Benutzerdefinierter Beitragstyp ->
release
Benutzerdefinierte Taxonomie ->
game
Stellen Sie sicher, dass dies Ihren Bedürfnissen entspricht
URSPRÜNGLICHE ANTWORT
Zusätzlich zu den anderen Antworten und dem Tippfehler, auf den @birgire hingewiesen hat, gibt es hier einen anderen Ansatz.
Zuerst legen wir den Titel als verborgenes benutzerdefiniertes Feld fest, entfernen jedoch zuerst die Wörter
the
, die wir ausschließen möchten. Bevor wir das tun, müssen wir zuerst eine Hilfsfunktion erstellen, um die verbotenen Wörter aus den Termnamen und Post-Titeln zu entfernenNachdem wir das behandelt haben, schauen wir uns den Code an, um unser benutzerdefiniertes Feld festzulegen. Sie müssen diesen Code vollständig entfernen, sobald Sie eine Seite einmal geladen haben. Wenn Sie eine große Website mit einer Tonne Beiträge haben, können Sie festlegen ,
posts_per_page
um etwas zu100
und die Skripte ein paar Mal laufen , bis alle Beiträge das benutzerdefinierte Feld haben , um alle Beiträge eingestellt wordenNachdem die benutzerdefinierten Felder für alle Beiträge festgelegt wurden und der obige Code entfernt wurde, müssen wir sicherstellen, dass für dieses benutzerdefinierte Feld alle neuen Beiträge festgelegt werden oder wann immer wir den Beitragstitel aktualisieren. Dafür verwenden wir den
transition_post_status
Haken. Der folgende Code kann in ein (von mir empfohlenes ) Plugin oder in Ihr Plugin eingefügt werdenfunctions.php
ABFRAGEN IHRER POSTS
Sie können Ihre Abfragen wie gewohnt ohne benutzerdefinierte Filter ausführen. Sie können Ihre Beiträge wie folgt abfragen und sortieren
quelle
Die Antworten von Birgire funktionieren gut, wenn Sie nur nach diesem Feld bestellen. Ich habe einige Änderungen vorgenommen, damit es bei der Bestellung nach mehreren Feldern funktioniert (ich bin nicht sicher, ob es richtig funktioniert, wenn die Titelbestellung die primäre ist):
quelle