Ich habe eine 'Forum'-Taxonomie nach folgenden Regeln erstellt:
register_taxonomy(
'forum',
array('topic'),
array(
'public' => true,
'name' => _a('Forums'),
'singular_name' => _a('Forum'),
'show_ui' => true,
'show_in_nav_menus' => true,
'hierarchical' => true,
'labels' => array(
'name' => _a('Forums'),
'singular_name' => _a('Forum'),
'search_items' => _a('Search Forums'),
'popular_items' => _a('Popular Forums'),
'all_items' => _a('All Forums'),
'parent_item' => _a('Parent Forum'),
'parent_item_colon' => _a('Parent Forum:'),
'edit_item' => _a('Edit Forum'),
'update_item' => _a('Update Forum'),
'add_new_item' => _a('Add New Forum'),
'new_item_name' => _a('New Forum Name'),
),
'query_var' => true,
'rewrite' => array('slug' => 'forums', 'with_front' => false, 'hierarchical' => true),
)
);
Im Frontend sehen die URLs so aus:
forums/general-discussion/sub-forum
Wie kann ich die vordere Schnecke ("Foren") entfernen? Ändern Sie also die URLs in:
general-discussion/sub-forum
Wenn ich ein leeres Slug-Argument an register_taxonomy () übergebe, funktioniert es, aber dies führt zu Problemen mit den Permalinks des mit dieser Taxonomie verknüpften Post-Typs
custom-post-types
custom-taxonomy
permalinks
ein Trickpony
quelle
quelle
'slug' => 'forums'
leer zu lassen, nur um es zu entfernen und nur zu haben'rewrite' => array('with_front' => false, 'hierarchical' => true)
? Ich denke, das hat in der Vergangenheit bei mir funktioniert. Stellen Sie auch sicher, dass Sie die Permalinks spülen.'slug' => ''
macht es möglich, aber dann erzeugen Posts, die diese Taxonomie verwenden, 404s%forum%
sollte ein Top-Level-Segment seinAntworten:
AKTUALISIEREN
Seit dem Schreiben dieses WordPress-Kerns wurde der
'do_parse_request'
Hook hinzugefügt, mit dem das URL-Routing elegant gehandhabt werden kann, ohne dass dieWP
Klasse erweitert werden muss. Ich habe das Thema in meinem WordCamp-Vortrag 2014 in Atlanta mit dem Titel " Hardcore URL Routing " ausführlich behandelt . Die Folien finden Sie unter dem Link.URSPRÜNGLICHE ANTWORT
URL-Design ist seit mehr als einem Jahrzehnt wichtig. Ich habe sogar vor einigen Jahren einen Blog darüber geschrieben . Und obwohl WordPress eine großartige Software ist , ist das URL-Rewrite-System leider nur kurz vor dem Tod (IMHO, natürlich. :) Wie auch immer, ich bin froh, Leute zu sehen, die sich um das URL-Design kümmern!
Die Antwort, die ich geben werde, ist ein Plugin, das ich anrufe und
WP_Extended
das ein Proof of Concept für diesen Vorschlag auf Trac ist. (Beachten Sie, dass der Vorschlag als eine Sache begann und sich in eine andere entwickelte. Sie müssen also die gesamte Sache lesen, um zu sehen, wo es ging voran.)Grundsätzlich besteht die Idee darin, die
WP
Klasse in Unterklassen zu unterteilen , dieparse_request()
Methode zu überschreiben und dann die globale$wp
Variable mit einer Instanz der Unterklasse zuzuweisen . Dannparse_request()
inspiziere in dir tatsächlich den Pfad nach Pfadsegment, anstatt eine Liste regulärer Ausdrücke zu verwenden, die mit der URL in ihrer Gesamtheit übereinstimmen müssen.Um es explizit auszudrücken, fügt diese Technik eine Logik ein, vor der
parse_request()
nach URL-zu-RegEx-Übereinstimmungen gesucht wird und stattdessen zuerst nach Taxonomiebegriffsübereinstimmungen gesucht wird. Sie ersetzt jedoch NURparse_request()
den gesamten Rest des WordPress-URL-Routingsystems, einschließlich und vor allem die Verwendung der$query_vars
Variablen.Für Ihren Anwendungsfall vergleicht diese Implementierung nur URL-Pfadsegmente mit Taxonomiebegriffen, da dies alles ist, was Sie benötigen. Diese Implementierung prüft Begriffe Taxonomie Eltern-Kind - Zeitbeziehungen zu respektieren und wenn es eine Übereinstimmung findet es ordnet den URL - Pfad (minus vorderen und hinteren Schrägstriche) zu
$wp->query_vars['category_name']
,$wp->query_vars['tag']
oder$wp->query_vars['taxonomy']
&$wp->query_vars['term']
und es umgeht dieparse_request()
Methode derWP
Klasse.Wenn der URL-Pfad andererseits nicht mit einem Begriff aus einer von Ihnen angegebenen Taxonomie übereinstimmt , delegiert er die URL-Routing-Logik durch Aufrufen der
parse_request()
Methode von an das WordPress-UmschreibesystemWP
Klasse .Um
WP_Extended
für Ihren Anwendungsfall zu verwenden, müssen Sie dieregister_url_route()
Funktion aus derfunctions.php
Datei Ihres Themas folgendermaßen aufrufen :Was ist hier der Quellcode für das Plugin:
PS CAVEAT # 1
Obwohl ich denke, dass diese Technik für eine bestimmte Site hervorragend funktioniert, sollte diese Technik NIEMALS für ein Plugin verwendet werden, das auf WordPress.org verteilt wird, damit andere es verwenden können . Wenn es sich um den Kern eines auf WordPress basierenden Softwarepakets handelt, ist dies möglicherweise in Ordnung. Andernfalls sollte sich diese Technik auf die Verbesserung des URL-Routings für eine bestimmte Site beschränken .
Warum? Weil nur ein Plugin diese Technik anwenden kann . Wenn zwei Plugins versuchen, es zu verwenden, treten Konflikte auf.
Abgesehen davon kann diese Strategie erweitert werden, um praktisch jedes erforderliche Use-Case-Muster generisch zu handhaben, und das werde ich implementieren, sobald ich entweder die freie Zeit finde oder einen Kunden, der die Zeit sponsern kann, die es dauern würde Erstellen Sie vollständig generische Implementierungen.
CAVEAT # 2
Ich habe dies geschrieben, um zu überschreiben,
parse_request()
was eine sehr große Funktion ist, und es ist gut möglich, dass ich ein oder zwei der globalen Objekte verpasst habe$wp
Objekts, das ich hätte setzen sollen habe recherchiere es und überarbeite die Antwort, wenn nötig.Sowieso...
quelle
'forum'
'forums'
eher zufällig als genannt'forum'
? Erwarten Sie, dass sich die URLs, die auf diese Seiten verlinken, ändern (falls ja, kein Wunder, mein Code behandelt nicht das Drucken von URLs, sondern nur das Weiterleiten von URLs.)site/rootforum/
funktioniert, abersite/rootforum/subforum/
nicht (404-Fehler) ...Wirklich einfach.
Schritt 1: Verwenden Sie den Rewrite-Parameter überhaupt nicht mehr. Wir werden Ihre eigenen Rewrites rollen.
Schritt 2: Legen Sie ausführliche Seitenregeln fest. Dies erzwingt, dass normale Seiten ihre eigenen Regeln haben, anstatt ein Sammelbegriff am Ende der Seite zu sein.
Schritt 3: Erstellen Sie einige Umschreiberegeln für Ihre Anwendungsfälle.
Schritt 4: Manuelles Erzwingen von Flush-Regeln. Der einfachste Weg: Gehen Sie zu Einstellungen-> Permalink und klicken Sie auf die Schaltfläche Speichern. Ich bevorzuge dies einer Plugin-Aktivierungsmethode für meinen eigenen Gebrauch, da ich die Regeln zwingen kann, zu löschen, wenn ich etwas ändere.
Also Code Zeit:
Denken Sie daran, dass Sie diesen Code nach dem Hinzufügen aktivieren müssen, wenn Sie die Permalink-Regeln löschen (indem Sie die Seite unter Einstellungen-> Permalinks speichern)!
Nachdem Sie die Regeln gelöscht und in der Datenbank gespeichert haben, sollte / whatever in Ihrem Forum angezeigt werden = auf jeder Taxonomieseite.
Rewrite-Regeln sind wirklich nicht so schwierig, wenn Sie reguläre Ausdrücke verstehen. Ich verwende diesen Code, um beim Debuggen zu helfen:
Auf diese Weise kann ich die aktuellen Regeln auf meiner Seite auf einen Blick sehen. Denken Sie daran, dass das System bei jeder angegebenen URL an der Spitze der Regeln beginnt und diese durchläuft, bis es eine übereinstimmende findet. Die Übereinstimmung wird dann verwendet, um die Abfrage in einen normaleren? Key = value-Satz umzuschreiben. Diese Schlüssel werden in den Inhalt des WP_Query-Objekts analysiert. Einfach.
Bearbeiten: Nebenbei bemerkt, diese Methode wird wahrscheinlich nur funktionieren, wenn Ihre normale benutzerdefinierte Post-Struktur mit etwas beginnt, das kein Schlagwort ist, wie% category% oder so etwas. Sie müssen es mit einer statischen Zeichenfolge oder einer Zahl wie% year% beginnen. Dies soll verhindern, dass Ihre URL abgefangen wird, bevor sie Ihren Regeln entspricht.
quelle
Sie können dies nicht allein mit WP_Rewrite tun, da hier nicht zwischen Term-Slugs und Post-Slugs unterschieden werden kann.
Sie müssen sich auch in 'request' einklinken und 404 verhindern, indem Sie die Post-Query-Variable anstelle der Taxonomie-Variable festlegen.
Etwas wie das:
Beachten Sie, dass die Taxonomie definiert werden muss , bevor dem Beitragstyp .
Dies ist ein guter Zeitpunkt, um darauf hinzuweisen, dass eine Taxonomie und ein Beitragstyp mit derselben Abfragevariable eine schlechte Idee sind.
Außerdem können Sie keine Posts erreichen, die denselben Slug wie einer der Begriffe haben.
quelle
Ich würde mir den Code des Top-Level-Katzen-Plugins ansehen:
http://fortes.com/projects/wordpress/top-level-cats/
Sie können das leicht anpassen, damit es nach Ihrem benutzerdefinierten Taxonomie-Slug sucht, indem Sie das ändern
in Zeile 74 zu so etwas wie:
quelle
Ich würde vorschlagen, sich das Plugin für benutzerdefinierte Post-Permalinks anzuschauen . Ich habe momentan keine Zeit zum Testen, aber es kann in Ihrer Situation hilfreich sein.
quelle
%forum%
, was genau das ist, was ich zu vermeiden versuche ...Da kenne ich mich mit deiner anderen Frage aus bin, beantworte ich sie in diesem Sinne.
Ich habe das überhaupt nicht getestet, aber es könnte funktionieren, wenn Sie dies einmal ausführen, nachdem Sie alle gewünschten Permastrukturen registriert haben:
Dies bewirkt Folgendes: Die aus dem Themen-Permalink generierten Umschreibregeln werden aus dem normalen Ablauf des Regel-Arrays entfernt und am Ende des Arrays wieder zusammengeführt. Dadurch wird verhindert, dass diese Regeln andere Umschreibregeln beeinträchtigen. Als Nächstes werden ausführliche Umschreibregeln erzwungen (jede Seite erhält eine individuelle Regel mit einem bestimmten regulären Ausdruck). Dies verhindert, dass die Seiten die Regeln Ihres Themas stören. Schließlich wird ein Hard Flush ausgeführt (stellen Sie sicher, dass Ihre .htaccess-Datei schreibbar ist, da dies sonst nicht funktioniert) und das sehr große, sehr komplizierte Array von Umschreibregeln gespeichert.
quelle
Dafür gibt es ein Plugin .
Der Typ-Slug wird entfernt, indem für jede benutzerdefinierte Post-Typ-Seite eine bestimmte Regel hinzugefügt wird.
quelle
Ich bin nicht sicher, ob dies für Taxonomien funktioniert, aber für benutzerdefinierte Beitragstypen
Obwohl es seit 2 Jahren nicht mehr aktualisiert wurde, funktionierte das folgende Plugin für mich: http://wordpress.org/plugins/remove-slug-from-custom-post-type/
Zu Ihrer Information: Ich verwende WP
3.9.1
mit WP-Typen1.5.7
quelle
Verwenden Sie einen Schrägstrich als Wert für slug ... 100% working
quelle
page
Beitragstyp auf 404 gesetzt wird.