✅ WEB- und WordPress-Nachrichten, Themen, Plugins. Hier teilen wir Tipps und beste Website-Lösungen.

Tutorial: Benutzerdefinierte URL-Endpunkte mit der WordPress Rewrite API

19

Haben Sie sich jemals gewünscht, Sie könnten einzelne Beiträge, Seiten oder Ihre benutzerdefinierten Beitragstypen mit einer benutzerdefinierten Vorlage erweitern, die ihre eigene URL-Struktur beibehält? Mit der WordPress Rewrite API ist dies uneingeschränkt möglich und überhaupt nicht schwierig.

In diesem Tutorial sehen wir uns an, wie man eine einzelne benutzerdefinierte Beitragstypansicht mit einem anderen Slug anhängt, der eine andere Vorlage lädt. Mit anderen Worten, wenn ein einzelner benutzerdefinierter Beitragstyp die URL „example.com/destination/venice/” hat, können Sie URL-Regeln für separate Seiten mit zugehörigen Informationen zu jedem Ziel hinzufügen, zum Beispiel „example.com/destination/venice”. /activities/” und „example.com/destination/venice/attractions/”.

Wenn Sie daran interessiert sind, wie Sie Endpunkte zur Seite „Mein Konto” von WooCommerce hinzufügen können, habe ich einen weiteren Beitrag dazu !

Die WordPress Rewrite API verfügt über viele nützliche Funktionen zum Schreiben Ihrer eigenen benutzerdefinierten URL-Regeln. Sie haben vielleicht die bekannteste und umfassendste Funktion gesehen; add_rewrite_rule(). Dieses Tutorial verwendet jedoch die ähnliche add_rewrite_endpoint(), die sehr nützlich ist, um URL-„Endpunkte” hinzuzufügen (im Grunde genommen werden benutzerdefinierte URL-Slugs nach etwas hinzugefügt, das bereits vorhanden ist, z. B. nach dem Ende eines einzelnen Beitrags oder einer einzelnen Kategorie). Sie können dasselbe Ergebnis erzielen, indem Sie verwenden, add_rewrite_rule()aber das Hinzufügen von Endpunkten ist einfacher.

Was wir machen werden

In diesem Leitfaden wird davon ausgegangen, dass wir zwei benutzerdefinierte Beitragstypen erstellt haben. „Film” und „Schauspieler”. Die Permalink-Regel für einen einzelnen Film lautet „example.com/movie/fight-club/” und für einen einzelnen Schauspieler „example.com/actor/brad-pitt/”. Wir wollen eine separate Seite für jeden Film, die alle Schauspieler in diesem Film zeigt, zu finden unter „example.com/movie/fight-club/actors/” und ähnlich eine separate Seite für jeden Schauspieler, die alle Filme zeigt, in denen der Schauspieler mitgespielt hat, befindet sich unter „example.com/actor/brad-pitt/movies/”.

Ich werde nicht ins Detail gehen, wie man diese beiden benutzerdefinierten Beitragstypen hinzufügt; Wenn Sie Hilfe bei diesem Teil benötigen, empfehle ich Ihnen, meinen Beitrag über das Hinzufügen benutzerdefinierter Beitragstypen zu lesen .

Schreiben des Codes

Der erste Schritt ist das Aufrufen add_rewrite_endpoint()einer Funktion, die an eingehakt ist init(im Allgemeinen sind alle Funktionen in der Rewrite-API an angeschlossen init). um unsere beiden gewünschten Endpunkte zu registrieren; „Filme” und „Schauspieler”. Die Funktion nimmt zwei Argumente entgegen; erstens den gewünschten Endpunkt (z. B. „Filme”) und zweitens eine Konstante dafür, wo der Endpunkt „wohnen” soll (z. B. Seiten, Autor, Archive usw.). Schauen Sie in der Dokumentation nach, welche Konstanten Sie verwenden können; Wie für dieses Beispiel ist der General EP_PERMALINKin Ordnung:

add_action('init', function() { add_rewrite_endpoint('movies', EP_PERMALINK); add_rewrite_endpoint('actors', EP_PERMALINK); });

NB: Wenn Ihr benutzerdefinierter Beitragstyp hierarchisch ist, das heißt, er hat 'hierarchical' => truein seinem register_post_type(), müssen Sie die Konstante EP_PERMALINKmit ausschalten EP_PAGES.

Nachdem Sie diesen Code gespeichert haben, müssen Sie zu Einstellungen > Permalinks gehen und einfach auf die Schaltfläche Speichern klicken, um die Permalinks zu aktualisieren. Wann immer Sie eine Rewrite-Regel hinzufügen oder ändern, müssen Sie Ihre Permalinks aktualisieren, damit sie funktioniert!

Umgang mit den Abfrage-Vars

Als Theme- oder Plugin-Entwickler können Sie herausfinden, ob die Vorlagen für diese Endpunkte angezeigt werden sollen oder nicht, indem Sie „Query Vars” aktivieren. im Grunde das globale Abfrageobjekt von WordPress. Wir tun dies, indem wir get_query_var()mit der Abfrage als Argument aufrufen (‘movies’ oder ‘actors’).

Wenn Sie mit add_rewrite_rule()oder get_query_var()zuvor gearbeitet haben, wissen Sie vielleicht bereits, dass WordPress benutzerdefinierte Abfragevariablen nicht automatisch hinzufügt. Normalerweise query_varsmüssten Sie Ihre benutzerdefinierten Variablen filtern und hinzufügen, damit WordPress sie füllt. Allerdings add_rewrite_endpoint()tut dies automatisch für uns.

Wenn wir jedoch versuchen anzurufen get_query_var('movies'), scheint es nie eingestellt zu sein. Das liegt daran, dass es davon ausgeht, dass es einen Wert haben muss, um festgelegt zu werden. Endpunktregeln gehen davon aus, dass alles, was nach dem Endpunkt kommt, der Wert ist. Zum Beispiel würde „example.com/actor/brad-pitt/movies/some-value/” funktionieren, da auf dieser Seite get_query_var('movies')der Wert „some-value” zurückgegeben würde. Aber das ist nicht das, was wir wollen, wir wollen, dass es nur mit dem einzelnen Endpunkt funktioniert. Um dies zu lösen, müssen wir uns in den requestFilter von WordPress einklinken und WordPress darüber informieren, dass die Abfragevariablen den Endpunkt mit einem gewissen Wert hinzufügen sollten, wenn wir an unseren Endpunkten sind (wir setzen ihn einfach auf true).

add_filter('request', function($vars) { if (isset($vars['movies'])) { $vars['movies'] = true; } if (isset($vars['actors'])) { $vars['actors'] = true; } return $vars; });

Wenn Sie jetzt versuchen, get_query_vars('movies')when bei „example.com/actor/brad-pitt/movies/” zu verwenden, erhalten Sie den Wert true(wichtig ist, dass er tatsächlich festgelegt wurde).

Vorlage wird geladen

Der nächste Schritt ist die Entscheidung, was auf diesen beiden Endpunkten passieren soll; oder anders gesagt, welche Vorlagen Sie laden möchten. Dieser Teil liegt bei Ihnen, Sie könnten sich daran anschließen, template_redirectaber das wird wirklich nur empfohlen, wenn Sie eine tatsächliche Weiterleitung durchführen möchten. Ich empfehle, sich an den template_includeFilter anzuschließen und WordPress einfach mitzuteilen, welche Vorlagen verwendet werden sollen, wenn wir an unseren benutzerdefinierten Endpunkten sind. Nehmen wir an, das Theme hat die PHP-Templates single-actor-movies.phpfür „example.com/actor//movies/” und single-movie-actors.phpfür „example.com/movie//actors/”.

add_filter('template_include', function($template) { if (is_singular() && get_query_var('movies')) { $post = get_queried_object(); return locate_template(['single-actor-movies.php']); } if (is_singular() && get_query_var('actors')) { $post = get_queried_object(); return locate_template(['single-movie-actors.php']); } return $template; });

Mit diesem Filter sollte WordPress die bereitgestellten Vorlagen für unsere benutzerdefinierten Endpunkte laden, und innerhalb dieser Vorlagen $postwäre das globale Objekt das zugehörige einzelne Post-Objekt vor dem Endpunkt – z. B. das einzelne Akteur-Post-Objekt, wenn wir bei der Vorlage zum Anzeigen aller sind Filme, in denen der Schauspieler aufgetreten ist. Dies erleichtert uns die Abfrage der Informationen, die wir zeigen möchten.

Abrufen der URL zu Ihrem Endpunkt

Unsere benutzerdefinierten Endpunkte und Seiten zu haben, ist alles in Ordnung, aber irgendwo müssten Sie auf diese verlinken. Beispielsweise möchten Sie in der Einzelfilmvorlage einen Link „Alle Schauspieler anzeigen”, der zu Ihrem Endpunkt führt.

Leider gibt es dafür keine so einfache WordPress-Funktion. Sie müssen die URL selbst erstellen. Ich empfehle die Verwendung [get_site_url](https://developer.wordpress.org/reference/functions/get_site_url/)()für standortweite Endpunkte, oder Sie würden im obigen Fall auf einen bestimmten Beitrag verweisen [get_the_permalink](https://developer.wordpress.org/reference/functions/get_the_permalink/)()(entweder innerhalb der Schleife oder durch Angabe einer Beitrags-ID) und den Endpunkt wie folgt anhängen:

echo get_the_permalink(). '/actors';

Aufnahmequelle: awhitepixel.com

Diese Website verwendet Cookies, um Ihre Erfahrung zu verbessern. Wir gehen davon aus, dass Sie damit einverstanden sind, Sie können sich jedoch abmelden, wenn Sie möchten. Annehmen Weiterlesen