Utworzyłem systematykę „forum”, korzystając z następujących zasad:
register_taxonomy(
'forum',
array('topic'),
array(
'public' => true,
'name' => _a('Forums'),
'singular_name' => _a('Forum'),
'show_ui' => true,
'show_in_nav_menus' => true,
'hierarchical' => true,
'labels' => array(
'name' => _a('Forums'),
'singular_name' => _a('Forum'),
'search_items' => _a('Search Forums'),
'popular_items' => _a('Popular Forums'),
'all_items' => _a('All Forums'),
'parent_item' => _a('Parent Forum'),
'parent_item_colon' => _a('Parent Forum:'),
'edit_item' => _a('Edit Forum'),
'update_item' => _a('Update Forum'),
'add_new_item' => _a('Add New Forum'),
'new_item_name' => _a('New Forum Name'),
),
'query_var' => true,
'rewrite' => array('slug' => 'forums', 'with_front' => false, 'hierarchical' => true),
)
);
W interfejsie URL wygląda następująco:
forums/general-discussion/sub-forum
Jak mogę usunąć przedni ślimak („fora”)? To znaczy zmień adresy URL na:
general-discussion/sub-forum
Jeśli przekażę pusty argument o błędzie do register_taxonomy (), to działa, ale powoduje to problemy z permalinkami typu post powiązanymi z tą taksonomią
custom-post-types
custom-taxonomy
permalinks
onetrickpony
źródło
źródło
'slug' => 'forums'
puste, po prostu usuwając je całkowicie i po prostu mając'rewrite' => array('with_front' => false, 'hierarchical' => true)
? Myślę, że to działało w przeszłości dla mnie. Upewnij się także, czy przepłukałeś permalinki.'slug' => ''
sprawia, że działa, ale następnie posty korzystające z tej taksonomii generują 404s%forum%
powinien być segmentem najwyższego poziomuOdpowiedzi:
AKTUALIZACJA
Od czasu napisania tego rdzenia WordPress dodano
'do_parse_request'
haczyk, który pozwala na eleganckie zarządzanie routingiem adresów URL bez konieczności rozszerzaniaWP
klasy. Szczegółowo omówiłem ten temat w moim wykładzie WordCamp 2014 w Atlancie zatytułowanym „ Hardcore URL Routing ” ; slajdy są dostępne pod linkiem.ORYGINALNA ODPOWIEDŹ
Projektowanie adresów URL było ważne od ponad dekady; Napisałem nawet o tym blog kilka lat temu. I chociaż WordPress to suma, to genialne oprogramowanie, niestety jego system do przepisywania adresów URL nie ma już mózgów (IMHO, oczywiście. :) W każdym razie cieszę się, że ludzie dbają o projektowanie adresów URL!
Mam zamiar udzielić wtyczki, którą nazywam,
WP_Extended
która jest dowodem koncepcji tej propozycji na Tracu (zauważ, że propozycja zaczęła się jako jedna rzecz i ewoluowała w inną, więc musisz przeczytać całą rzecz, aby zobaczyć, gdzie to było na czele.)Zasadniczo chodzi o podklasę
WP
klasy, przesłonięcieparse_request()
metody, a następnie przypisanie$wp
zmiennej globalnej instancją podklasy. Następnie wparse_request()
tobie sprawdź ścieżkę według segmentu ścieżki zamiast korzystać z listy wyrażeń regularnych, które muszą pasować do adresu URL w całości.Tak więc, mówiąc wprost, technika ta wstawia logikę przed
parse_request()
sprawdzaniem zgodności adresów URL z RegEx i zamiast tego najpierw szuka dopasowań terminów taksonomicznych, ale TYLKO zastępujeparse_request()
i pozostawia nienaruszoną resztę systemu routingu URL WordPress, w tym i zwłaszcza użycie$query_vars
zmiennej.W twoim przypadku użycia ta implementacja porównuje tylko segmenty ścieżki URL z warunkami taksonomii, ponieważ to wszystko, czego potrzebujesz. Ta implementacja kontroluje warunki taksonomii poszanowaniem relacji rodzic-dziecko utrzymujące a kiedy znajdzie dopasowanie przypisuje ścieżkę URL (minus początkowe i końcowe ukośniki) do
$wp->query_vars['category_name']
,$wp->query_vars['tag']
lub$wp->query_vars['taxonomy']
&$wp->query_vars['term']
i omijaparse_request()
sposobuWP
klasie.Z drugiej strony, jeśli ścieżka adresu URL nie zgadza się z terminem z określonej taksonomii, deleguje logikę routingu adresu URL do systemu przepisywania WordPress, wywołując
parse_request()
metodęWP
klasy.Aby użyć w
WP_Extended
przypadku użycia, musisz wywołaćregister_url_route()
funkcję zfunctions.php
pliku motywu w następujący sposób:Co to jest kod źródłowy wtyczki:
PS CAVEAT # 1
Chociaż dla danej strony myślę, że ta technika działa doskonale, ale NIGDY nie należy jej używać do dystrybucji wtyczki na WordPress.org, z której mogą korzystać inni . Jeśli jest to rdzeń pakietu oprogramowania opartego na WordPress, może to być w porządku. W przeciwnym razie technika ta powinna być ograniczona do poprawy routingu adresów URL dla konkretnej witryny .
Czemu? Ponieważ tylko jedna wtyczka może korzystać z tej techniki . Jeśli dwie wtyczki spróbują go użyć, będą ze sobą konfliktować.
Nawiasem mówiąc, tę strategię można rozszerzyć, aby generalnie obsługiwać praktycznie każdy wzorzec przypadku użycia, który może być wymagany, i właśnie to zamierzam wdrożyć, gdy tylko znajdę wolny czas lub klienta, który może sponsorować czas, który zajmie budować w pełni ogólne implementacje.
CAVEAT # 2
Napisałem to, aby zastąpić
parse_request()
tę bardzo dużą funkcję, i jest całkiem możliwe, że przegapiłem właściwość lub dwa globalne$wp
obiekty, które powinienem był ustawić. Więc jeśli coś zadziwia, daj mi znać i chętnie zbadaj go i w razie potrzeby popraw odpowiedź.Tak czy inaczej...
źródło
'forum'
taksonomii, ale'forums'
a nie'forum'
? Czy spodziewasz się, że adresy URL prowadzące do tych stron zmienią się (jeśli tak, nic dziwnego, mój kod nie dotyczy drukowania adresów URL, a jedynie routing adresów URL.)site/rootforum/
działa, alesite/rootforum/subforum/
nie działa (błąd 404) ...Naprawdę proste.
Krok 1: W ogóle przestań używać parametru przepisywania. Wprowadzimy twoje własne przepisy.
Krok 2: Ustaw pełne zasady strony. To zmusza normalne strony do posiadania własnych reguł zamiast do łapania wszystkiego na dole strony.
Krok 3: Utwórz kilka reguł przepisywania, aby obsłużyć przypadki użycia.
Krok 4: Ręcznie wymuś regułę koloru. Najłatwiejszy sposób: przejdź do ustawień-> bezpośredni link i kliknij przycisk Zapisz. Wolę to niż metodę aktywacji wtyczki na własny użytek, ponieważ mogę zmusić reguły do opróżnienia przy każdej zmianie.
Czas kodu:
Pamiętaj, że po dodaniu tego kodu musisz mieć go aktywnym, kiedy idziesz opróżniać reguły permalink (zapisując stronę w Ustawienia-> Permalinki)!
Po wyczyszczeniu reguł i zapisaniu ich w bazie danych, / cokolwiek powinno przejść do twojego forum = jakakolwiek strona systematyki.
Reguły przepisywania naprawdę nie są trudne, jeśli rozumiesz wyrażenia regularne. Używam tego kodu, aby pomóc mi w debugowaniu:
W ten sposób mogę zobaczyć obecne zasady na pierwszy rzut oka na mojej stronie. Pamiętaj tylko, że pod jakimkolwiek adresem URL system zaczyna się na górze reguł i przechodzi przez nie, aż znajdzie taki, który pasuje. Dopasowanie jest następnie używane do przepisania zapytania na bardziej normalnie wyglądający? Klucz = zestaw wartości. Te klucze są analizowane w tym, co trafia do obiektu WP_Query. Prosty.
Edycja: Uwaga: ta metoda prawdopodobnie będzie działać tylko wtedy, gdy normalna niestandardowa struktura postu zaczyna się od czegoś, co nie jest przeszkodą, na przykład% category% lub czegoś podobnego. Musisz go rozpocząć od ciągu statycznego lub liczbowego, na przykład% rok%. Ma to na celu zapobieganie przechwytywaniu adresu URL przez użytkownika, zanim dotrze on do reguł.
źródło
Nie będziesz w stanie tego zrobić przy użyciu samego WP_Rewrite, ponieważ nie można odróżnić ślimaków terminowych od postowych.
Trzeba również podłączyć się do „żądania” i zapobiec 404, ustawiając zmienną zapytania post zamiast taksonomii.
Coś takiego:
Pamiętaj, że taksonomia musi zostać zdefiniowana przed typem postu.
Byłby to dobry moment na wskazanie, że taksonomia i typ postu z tym samym zapytaniem var to zły pomysł.
Ponadto nie będziesz w stanie dotrzeć do postów, które mają taki sam ślimak jak jeden z warunków.
źródło
Rzuciłbym okiem na kod wtyczki najwyższego poziomu dla kotów:
http://fortes.com/projects/wordpress/top-level-cats/
Możesz łatwo to dostosować, aby szukał niestandardowego ślimaka taksonomii, zmieniając
w linii 74 do czegoś takiego jak:
źródło
Proponuję rzucić okiem na wtyczkę Custom Post Permalinks . Nie mam teraz czasu na testowanie, ale może to pomóc w twojej sytuacji.
źródło
%forum%
, czego dokładnie staram się uniknąć ...Ponieważ znam drugie pytanie , odpowiem na to pytanie.
Nie przetestowałem tego wcale, ale może działać, jeśli wykonasz to zaraz po zarejestrowaniu wszystkich wymaganych permastruktów:
Co to robi: usuwa reguły przepisywania wygenerowane z linków tematycznych z normalnego przepływu tablicy reguł i ponownie łączy je na końcu tablicy. Zapobiega to zakłócaniu tych reguł przez inne reguły przepisywania. Następnie wymusza pełne przepisywanie reguł (każda strona otrzymuje indywidualną regułę z określonym wyrażeniem regularnym). Zapobiega to ingerencji stron w reguły Twojego tematu. Na koniec wykonuje twardy zapis (upewnij się, że plik .htaccess jest zapisywalny, w przeciwnym razie nie zadziała) i zapisuje bardzo dużą, bardzo skomplikowaną tablicę reguł przepisywania.
źródło
Jest do tego wtyczka .
Usuwa ślimak typu, dodając określoną regułę dla każdej niestandardowej strony typu posta.
źródło
Nie jestem pewien, czy to zadziała w przypadku taksonomii, ale działało w przypadku niestandardowych typów postów
Chociaż nie była aktualizowana przez 2 lata, poniższa wtyczka działała dla mnie: http://wordpress.org/plugins/remove-slug-from-custom-post-type/
Do Twojej wiadomości używam WP
3.9.1
z typami WP1.5.7
źródło
Użyj ukośnika jako wartości dla ślimaka ... 100% działa
źródło
page
typy postów mają wartość 404.