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

Benutzerdefinierte Umschreibungsregeln und Seitenvorlagen in WordPress

31

Die WordPress Rewrite API ist eine solide API, vorausgesetzt, Sie sind mit regulären Ausdrücken vertraut.

Und ehrlich gesagt, selbst wenn Sie es nicht sind, machen es Tools wie PHP Live RegEx wirklich einfach, Ihren Code zu testen, bevor Sie ihn in den add_rewrite_ruleAPI-Aufruf einfügen.

Benutzerdefinierte Umschreibungsregeln und Seitenvorlagen in WordPress

Es kann jedoch vorkommen, dass Sie sich in einer Situation befinden, in der Sie mit Rewrite-Regeln und Seitenvorlagen arbeiten müssen. Und wenn das der Fall ist, ist es nicht immer so einfach wie ein einfacher Aufruf mit einem einzigen regulären Ausdruck.

Der Grund? Wenn Sie mehrere Seiten haben, die dieselbe Vorlage verwenden, befindet sich die Seite nicht immer im selben Index in der Abfrage, die auf jeder Seite ausgeführt wird.

Zu diesem Zweck müssen wir etwas anders damit umgehen, als beispielsweise einfach auf einen numerischen Index von Informationen in der globalen Abfrage zuzugreifen.

Regeln und Seitenvorlagen umschreiben

Nehmen wir zunächst an, dass wir zwei Vorlagen haben (die keine bestimmte Reihenfolge haben):

  1. template-alpha.php
  2. template-beta.php

Und dann nehmen wir an, wir möchten eine benutzerdefinierte URL für Seiten einrichten, die jeweils eine dieser Vorlagen verwenden.

Dies würde sich in die folgenden Schritte aufteilen:

  1. Iterieren Sie durch die Posts in der Abfrage,
  2. Speichern Sie den Beitrag mit der Vorlage in seinem entsprechenden Array,
  3. Richten Sie die Umschreibungsregeln für jeden Beitrag mit einer bestimmten Abfrage ein.

In diesem Beispiel halte ich die Rewrite-Regeln ziemlich einfach. Schließlich kann es schwierig genug sein, regulären Ausdrücken zu folgen, daher kann der Versuch, diesen zu folgen, während man mit dem Query-Objekt, mehreren Arrays und der Handhabung der Regeln umgeht, ein bisschen viel sein.

Vor diesem Hintergrund ist hier ein Beispielcode, der basierend auf den obigen Schritten aufgeschlüsselt ist. Am Ende des Posts teile ich ein Snippet, das alles in ein paar separaten Funktionen zusammenfasst, damit Sie sehen können, wie all dies zusammenpasst.

Nachdem dies gesagt wurde, erfahren Sie hier, wie Sie mit all dem oben genannten umgehen.

1 Umschreibungsregeln hinzufügen

Zuerst müssen wir einige Informationen aus dem globalen WordPress-Abfrageobjekt lesen, um alle Seiten zu finden, auf die Vorlagen angewendet wurden.

Dazu können wir die Informationen aus dem globalen Abfrageobjekt in eine lokale Variable einlesen. Dies macht es einfach, sich aus dem Rest des Codes herauszuziehen, wenn es nichts gibt, womit man arbeiten könnte.

<?php 

$query = $this->query->query([
    'post_type' => 'page',
    'meta_key' => '_wp_page_template',
    'meta_value' => ['template-alpha.php', 'template-beta.php'],
]);

if (!$query) {
    return;
}

// More to come...

2 Relevante Informationen in einem Array speichern

Angenommen, es gibt Seiten mit Vorlagen, dann speichern wir jede der Seiten in Arrays, damit wir ihre jeweiligen Umschreibungsregeln einfach verwalten können.

<?php

foreach ($query as $post) {
    $slug = get_page_template_slug($post->ID);

    if ('template-alpha.php' === $slug) {
        $this->alphaPages[] = $post;
    }

    if ('template-find-a-camp.php' === $slug) {
        $this->betaPages[] = $post;
    }
}

Beachten Sie, dass ich oben auf ein globales Array verweise. Angenommen, dies wird einfach als leeres Array im Konstruktor der Klasse initialisiert.

3 Richten Sie die Rewrite-Regeln ein

Jetzt, da wir zwei Arrays haben – eines für jede Vorlage und die Seiten, die sie enthalten – können wir sie durchlaufen und jeder dieser Seiten Umschreibungsregeln zuweisen.

Nehmen wir zum Beispiel an, dass wir für eine Vorlage, sagen wir Alpha, Rewrite-Regeln für die USA und Bundesstaaten einrichten möchten.

Hier ist Code fürtemplate-alpha.php:

<?php

add_rewrite_tag('%country%', '([^&]+)');
add_rewrite_tag('%state%', '([^&]+)');

foreach ($this->alphaPages as $post) {
    add_rewrite_rule(
        '^'.$post->post_name.'/([^/]*)/([^/]*)/?',
        'index.php?page_id='.$post->ID.'&country=$matches[1]&state=$matches[2]',
        'top'
    );

    add_rewrite_rule(
        '^'.$post->post_name.'/([^/]*)/?',
        'index.php?page_id='.$post->ID.'&country=$matches[1]',
        'top'
    );
}

Und hier ist Code für template-beta.php:

<?php

add_rewrite_tag('%acme-id%', '([^&]+)');

foreach ($this->betaPages as $post) {
    add_rewrite_rule(
        '^(.*)?/([A-Za-z0-9-]+-)(d+)/?',
        'index.php?page_id='.$post->ID.'&acme-id=$matches[3]',
        'top'
    );
}

Natürlich dienen die im obigen Code verwendeten regulären Ausdrücke nur zu Demonstrationszwecken. Ihre wird für alles sein, was für Ihr Projekt benötigt wird.

4 Jetzt alle zusammen

Es ist wichtig, all diese Funktionen in eigene Methoden aufzuteilen, damit sie bei Bedarf einfach gekapselt und getestet werden können.

Zu diesem Zweck sieht der vollständige Code wie folgt aus:

<?php

public function addRewriteRules()
{
    $query = $this->query->query([
        'post_type' => 'page',
        'meta_key' => '_wp_page_template',
        'meta_value' => ['template-alpha.php', 'template-beta.php'],
    ]);

    if (!$query) {
        return;
    }

    $this->setPageTypes($query);
    $this->setAlphaRewriteRules();
    $this->setBetaRewriteRules();
}

private function setPageTypes($query)
{
    foreach ($query as $post) {
        $slug = get_page_template_slug($post->ID);

        if ('template-alpha.php' === $slug) {
            $this->alphaPages[] = $post;
        }

        if ('template-find-a-camp.php' === $slug) {
            $this->betaPages[] = $post;
        }
    }
}

private function setAlphaRewriteRules()
{
    add_rewrite_tag('%country%', '([^&]+)');
    add_rewrite_tag('%state%', '([^&]+)');

    foreach ($this->alphaRules as $post) {
        add_rewrite_rule(
            '^'.$post->post_name.'/([^/]*)/([^/]*)/?',
            'index.php?page_id='.$post->ID.'&country=$matches[1]&state=$matches[2]',
            'top'
        );

        add_rewrite_rule(
            '^'.$post->post_name.'/([^/]*)/?',
            'index.php?page_id='.$post->ID.'&country=$matches[1]',
            'top'
        );
    }
}

private function setBetaRewriteRules()
{
    add_rewrite_tag('%acme-id%', '([^&]+)');

    foreach ($this->betaPages as $post) {
        add_rewrite_rule(
            '^(.*)?/([A-Za-z0-9-]+-)(d+)/?',
            'index.php?page_id='.$post->ID.'&acme-id=$matches[3]',
            'top'
        );
    }
}

Denken Sie jedoch daran; Dies basiert nur auf dem in diesem Beitrag geteilten Democode. Wenn Sie an Ihrem Projekt arbeiten, werden die regulären Ausdrücke, Vorlagen usw. variieren.

Aufnahmequelle: tommcfarlin.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