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.
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):
- szablon-alpha.php
- 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:
- Przejrzyj posty w zapytaniu,
- Przechowuj post za pomocą szablonu w odpowiedniej tablicy,
- 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ć.
