Sie müssen drei wichtige Dinge tun:
- Erstellen Sie eine benutzerdefinierte Umschreiberegel, um Teile des URI in Werte umzuwandeln, an die übergeben wird
index.php
.
- In
myroute
und myargument
auf Wordpress - Abfrage Variablen weiße Liste, so dass Wordpress nicht einfach ignorieren , wenn sie in einer Abfragezeichenfolge angezeigt.
- Löschen Sie die Umschreiberegeln.
Erstens werde ich empfehlen, dass http://www.example.org/myroute/myargument
Sie sich stattdessen für ein spezielles Präfix oder Suffix entscheiden, um anzugeben, wann der URI als eine dieser speziellen "Routen" betrachtet werden soll. Für dieses Beispiel habe ich das Präfix api
so gewählt, dass es so ist http://www.example.org/api/myroute/myargument
. Ich habe api
mich für eine API entschieden, als ich etwas RESTful gemacht habe, wie das, woran Sie anscheinend arbeiten.
Der Code
add_filter( 'rewrite_rules_array', 'my_insert_rewrite_rules' );
add_filter( 'query_vars', 'my_insert_query_vars' );
add_action( 'wp_loaded', 'my_flush_rules' );
// flush_rules() if our rules are not yet included
function my_flush_rules() {
$rules = get_option( 'rewrite_rules' );
if ( ! isset( $rules['api/(.*?)/(.+?)'] ) ) {
global $wp_rewrite;
$wp_rewrite->flush_rules();
}
}
// Adding a new rule
function my_insert_rewrite_rules( $rules ) {
$newrules = array();
$newrules['api/(.*?)/(.+?)'] = 'index.php?myroute=$matches[1]&myargument=$matches[2]';
return $newrules + $rules;
}
// Adding the id var so that WP recognizes it
function my_insert_query_vars( $vars ) {
array_push( $vars, 'myroute', 'myargument' );
return $vars;
}
Schnelle Aufschlüsselung
Es ist alles ziemlich einfach. Das Regex-Muster wird einer Liste aller Umschreiberegeln in WordPress hinzugefügt, und Ihr benutzerdefiniertes Muster steht ganz oben auf der Liste. Wenn das Muster übereinstimmt, durchsucht WordPress die Liste der Umschreiberegeln nicht mehr und verwendet die erfassten Werte des regulären Ausdrucks anstelle der Referenzen ( $matches[1]
und $matches[2]
) in der an übergebenen Abfragezeichenfolge index.php
.
Durch das Hinzufügen der Abfragevariablen myroute
und myargument
der Whitelist wird WordPress nur auf sie achten, anstatt sie zu verwerfen.
Alternative Methode zum "Namespace" Ihrer benutzerdefinierten Route
Wenn Sie die Verwendung /api/
als Präfix vermeiden möchten, können Sie stattdessen eine Abfragezeichenfolgenvariable / ein Abfragezeichenfolgenfeld verwenden. Um so etwas zu tun, würden Sie den regulären Ausdruck in etwas Ähnliches ändern (.*?)/(.+?)\\?api=1
und dann api
als zusätzlichen Parameter zum array_push()
Aufruf von hinzufügen my_insert_query_vars()
.
Das würde die benutzerdefinierte Route so ändern, dass sie jederzeit api=1
ausgelöst wird http://example.com/anytext/anytext?api=1
. Dies ist das erste Element der Abfragezeichenfolge, z. B. für .
Ignorieren Sie die Verwendung des Begriffs "Namespace" - verwenden Sie ihn nur der Kürze halber.
Wenn Sie keinen 'Namespace' mit einem Präfix oder einem Suffix haben, werden Sie mit kollidierenden URI-Mustern enden. Dies liegt daran, dass WordPress Ihr benutzerdefiniertes Muster nicht von einem Muster unterscheiden kann, das als Beitrag oder Seite gedacht ist. Wie würde WordPress wissen, dass dies myroute
keine Taxonomie, kein Begriff oder keine übergeordnete Seite ist?
Hoffe das hilft.
my_insert_rewrite_rules
der Reihenfolge der Definition definiert! Beginnen Sie zuerst mit der längsten Regel und arbeiten Sie dann bis zur einfachsten, andernfalls überschreibt / api / myroute / api / myroute / myargument.Um etwas näher auf das einzugehen, was eddiemoya oben getan hat:
Wie das Originalposter dieser Frage wollte ich ein benutzerdefiniertes Umschreiben erstellen und auch eine benutzerdefinierte Vorlage für diese Umschreibeseite bereitstellen. Mit dem Code von edditmoya habe ich in die richtige Richtung gestartet und eine zusätzliche Funktion hinzugefügt, um meine benutzerdefinierte Vorlage beim Zugriff auf die Seite bereitzustellen.
Die benutzerdefinierte Vorlage kann sich überall befinden, in meinem Fall ist sie im Plugin-Verzeichnis gespeichert.
Ich wollte auch nur überprüfen, ob die Umschreiberegeln während der Plugin-Aktivierung gelöscht werden mussten, also habe ich das auf einen register_activation_hook gesetzt
Unten finden Sie ein vollständiges Beispiel für das, was ich getan habe:
AKTUALISIERT vereinfacht auf Empfehlung von milo
quelle
add_rewrite_endpoint
, wodurch die Regel für Sie generiert und die Abfragevariable auf einmal hinzugefügt wird. Auch wenn Sie Ihre eigenen Umschreiberegeln hinzufügen, empfehle ich dieadd_rewrite_rule
Funktion anstelle der Filterungrewrite_rules_array
.