niestandardowa taksonomia i przepisywanie stron konflikt ślimaków daje 404

9

Korzystam z wtyczki interfejsu użytkownika niestandardowego typu postu, aby utworzyć niestandardowe taksonomie. Mam portfolio złożone z projektów (niestandardowy typ postu) z 2 niestandardowymi taksonomiami technologii i klientów. Taksonomia klientów ma niestandardowy ślimak przepisywania portfolio/clients/, podczas gdy taksonomia technologii ma niestandardowy ślimak przepisywaniaportfolio/

Przepisz:
portfolio/html <- strona wyświetla wszystkie projekty za pomocą HTML
portfolio/clients/client-a<- strona wyświetla wszystkie projekty dla klienta A.

Teraz, gdy próbuję utworzyć stronę docelową dla klientów, która ma informację o adresie URL /portfolio/clients, otrzymuję stronę 404. Jestem prawie pewien, że dzieje się tak z powodu sprzecznego przepisywania adresów URL taksonomii technologii. Zgaduję, że szuka go w taksonomii technologii, nie istnieje, a następnie wyrzuca stronę 404. Jak więc uruchomić ślimak przepisywania adresu URL, aby po kliknięciu /portfolio/clientsnie odsyła strony 404 i używał prawidłowego szablonu strony?

Johannes Pille
źródło

Odpowiedzi:

16

Wydaje się, że potrzebujesz „częściowych pełnych reguł przepisywania”. Pełne reguły przepisywania oznaczają, że wszystkie strony są umieszczane na wierzchu, ponieważ WordPress nie może zrozumieć różnicy między stroną a postem. Tutaj uważa, że ​​może, ponieważ wszystkie adresy URL formularza portfolio/([^/]+)/pochodzą z Twojej portfoliotaksonomii, z wyjątkiem tej portfolio/clients/. Będziesz musiał umieścić tę jedną nad regułami przepisywania, aby pasowała przed bardziej ogólną taksonomią portfela. Prawdopodobnie możesz również wymusić pełne reguły przepisywania, ale będzie to miało wpływ na wydajność, jeśli masz wiele stron.

Ta odpowiedź została napisana z moim właśnie zrozumieniem zasad przepisywania, więc mam nadzieję, że to dobry sposób, aby to zrobić, a przykładowy kod nie zawiera zbyt wielu błędów.

Strona nie generuje tylko jednej reguły przepisywania, generuje grupę:

  • (pagename)/trackback/?$
  • (pagename)/feed/(feed|rdf|rss|rss2|atom)/?$
  • (pagename)/(feed|rdf|rss|rss2|atom)/?$
  • (pagename)/page/?([0-9]{1,})/?$
  • (pagename)/comment-page-([0-9]{1,})/?$
  • (pagename)(/[0-9]+)?/?$

Nie musisz ich tworzyć samodzielnie, możesz ponownie użyć mocy WP_Rewrite. Spójrz na jego page_rewrite_rules()metodę: jeśli jesteśmy w trybie pełnym, pobiera listę wszystkich stron (via page_uri_index()) i ich załączniki, zastępuje %pagename%tag przepisywania i generuje reguły przepisywania dla tej strony. Możemy to również zrobić:

// We only generate them for this page
$page_uri = 'portfolio/clients';
// Returns site root + '%pagename%'
$page_structure = $wp_rewrite->get_page_permastruct();
// Everywhere you see %pagename% in the structure used to generate rules
// in the next step, replace it with our fixed page name
$wp_rewrite->add_rewrite_tag('%pagename%', "({$page_uri})", 'pagename=');
// This generates the group given above
$page_rewrite_rules = $wp_rewrite->generate_rewrite_rules($page_structure, EP_PAGES);

To da nam reguły dla stron, ale jeszcze nie dla załączników używanych na stronie. Jeśli chcesz je również, powtórz krok dla każdego załącznika, ale za pomocą add_rewrite_tag('%pagename%', "({$attachment_uri})", 'attachment=')(zobacz page_rewrite_rules()więcej szczegółów).

Dobrze, mamy reguły, ale teraz musisz je w jakiś sposób dodać do kompletnej struktury przepisywania. Możesz to zrobić za pomocą add_rewrite_rule(), ale musisz to wywołać dla każdej reguły wygenerowanej w $page_rewrite_rulestablicy. Z tego powodu wiele osób zaczepia się w rewrite_rules_arrayfiltrze , ponieważ można tam po prostu zmodyfikować tablicę.

add_filter('rewrite_rules_array', 'add_verbose_portfolio_clients_page');
function add_verbose_portfolio_clients_page($rewrite_rules)
{
    global $wp_rewrite;

    // The previous code snippet comes here, where we generate $page_rewrite_rules

    // Our rules have priority, they should be on top
    $rewrite_rules = array_merge($page_rewrite_rules, $rewrite_rules);

    return $rewrite_rules;
}

Po dołączeniu tego filtra należy opróżnić reguły przepisywania (raz, a nie ładowanie jednej strony, ponieważ jest dość duże). Możesz to zrobić, dzwoniąc flush_rewrite_rules()lub odwiedzając stronę ustawień „Permalinks”.

Jan Fabry
źródło
Świetny! Dzięki Jan! To zadziałało. Nie mogłem otrzymać lepszego wyjaśnienia.