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 portfolio
taksonomii, 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_rules
tablicy. Z tego powodu wiele osób zaczepia się w rewrite_rules_array
filtrze , 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”.