✅ Nowości, motywy, wtyczki WEB i WordPress. Tutaj dzielimy się wskazówkami i najlepszymi rozwiązaniami dla stron internetowych.

Niestandardowe reguły przepisywania i szablony stron w WordPress

15

WordPress Rewrite API jest solidnym interfejsem API, zakładając, że znasz się na wyrażeniach regularnych.

I szczerze mówiąc, nawet jeśli nie, narzędzia takie jak PHP Live RegEx bardzo ułatwiają testowanie kodu przed umieszczeniem go w add_rewrite_rulewywołaniu API.

Niestandardowe reguły przepisywania i szablony stron w WordPress

Jednak zdarzają się sytuacje, w których możesz znaleźć się w sytuacji, w której będziesz musiał pracować z regułami przepisywania i szablonami stron. A kiedy tak jest, nie zawsze jest to tak proste, jak wykonanie prostego wywołania za pomocą pojedynczego wyrażenia regularnego.

Powód? Jeśli masz wiele stron korzystających z tego samego szablonu, nie zawsze będziesz mieć stronę w tym samym indeksie w zapytaniu uruchamianym na każdej stronie.

W tym celu musimy sobie z tym poradzić w nieco inny sposób niż, powiedzmy, po prostu dostęp do liczbowego indeksu informacji w zapytaniu globalnym.

Przepisz reguły i szablony stron

Najpierw załóżmy, że mamy dwa szablony (które nie są w określonej kolejności):

  1. szablon-alpha.php
  2. szablon-beta.php

A potem załóżmy, że chcemy ustawić niestandardowy URL dla stron, z których każda korzysta z jednego z tych szablonów.

Podziałałoby to na następujące kroki:

  1. Przejrzyj posty w zapytaniu,
  2. Przechowuj post za pomocą szablonu w odpowiedniej tablicy,
  3. Skonfiguruj reguły przepisywania dla każdego posta zawierającego dane zapytanie.

W tym przykładzie zachowam dość proste zasady przepisywania. W końcu wyrażenia regularne mogą być wystarczająco trudne do naśladowania, więc próba podążania za nimi podczas pracy z obiektem Query, wieloma tablicami i obsługą reguł może być trochę za dużo.

Mając to na uwadze, oto przykładowy kod, który jest podzielony na podstawie powyższych kroków. Na końcu posta udostępnię fragment, który łączy wszystko w kilka oddzielnych funkcji, dzięki czemu możesz zobaczyć, jak to wszystko do siebie pasuje.

Mając to na uwadze, oto jak poradzić sobie z wszystkimi powyższymi.

1 Dodawanie reguł przepisywania

Najpierw musimy przeczytać kilka informacji z globalnego obiektu zapytania WordPress, aby znaleźć wszystkie strony, do których zastosowano szablony.

W tym celu możemy wczytać informacje z globalnego obiektu zapytania do zmiennej lokalnej. Ułatwia to ominięcie reszty kodu, jeśli nie ma z czym pracować.

<?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 Przechowuj istotne informacje w tablicy

Zakładając, że istnieją strony mające szablony, będziemy kontynuować przechowywanie każdej ze stron w tablicach, abyśmy mogli łatwo zarządzać ich odpowiednimi regułami przepisywania.

<?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;
    }
}

Zauważ, że powyżej odwołuję się do tablicy globalnej. Załóżmy, że jest to po prostu inicjowane jako pusta tablica w konstruktorze klasy.

3 Skonfiguruj zasady przepisywania

Teraz, gdy mamy dwie tablice – po jednej dla każdego szablonu i stron, które go zawierają – możemy je iterować i przypisać reguły przepisywania dla każdej z tych stron.

Załóżmy na przykład, że dla jednego szablonu, powiedzmy alfa, chcemy ustawić reguły przepisywania dla Stanów Zjednoczonych i stanów.

Oto kod dlatemplate-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'
    );
}

A oto kod dla 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'
    );
}

Oczywiście wyrażenia regularne użyte w powyższym kodzie służą jedynie do celów demonstracyjnych. Twoje będzie na wszystko, co jest potrzebne do twojego projektu.

4 Teraz wszyscy razem

Ważne jest, aby podzielić wszystkie te funkcje na własne metody, aby w razie potrzeby można je było łatwo hermetyzować i przetestować.

W tym celu, oto jak będzie wyglądał pełny kod :

<?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'
        );
    }
}

Pamiętaj jednak; jest to oparte tylko na kodzie demonstracyjnym udostępnionym w tym poście. Podczas pracy nad projektem wyrażenia regularne, szablony itd. będą się różnić.

Źródło nagrywania: tommcfarlin.com

Ta strona korzysta z plików cookie, aby poprawić Twoje wrażenia. Zakładamy, że nie masz nic przeciwko, ale możesz zrezygnować, jeśli chcesz. Akceptuję Więcej szczegółów