Sembra che tu abbia bisogno di "regole di riscrittura verbose parziali". Le regole di riscrittura dettagliata indicano che tutte le pagine sono messe in primo piano perché WordPress non riesce a capire la differenza tra una pagina e un post. Qui pensa di si, perché tutti gli URL del modulo portfolio/([^/]+)/
provengono dalla tua portfolio
tassonomia, tranne questo portfolio/clients/
. Dovrai metterlo in cima alle regole di riscrittura, in modo che corrisponda alla tassonomia del portafoglio più generica. Probabilmente potresti anche forzare tutte le regole di riscrittura in modo dettagliato, ma ciò avrà un impatto sulle prestazioni se hai molte pagine.
Questa risposta è scritta con la mia comprensione appena acquisita delle regole di riscrittura, quindi spero sia un buon modo per farlo e il codice di esempio non contiene troppi errori.
Una pagina non genera una sola regola di riscrittura, ma genera un gruppo:
(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]+)?/?$
Non è necessario crearli da soli, è possibile riutilizzare il potere di WP_Rewrite
. Guarda il suo page_rewrite_rules()
metodo: se siamo in modalità dettagliata, ottiene un elenco di tutte le pagine (via page_uri_index()
) e dei loro allegati, sovrascrive il %pagename%
tag di riscrittura e genera le regole di riscrittura per questa pagina. Possiamo fare anche questo:
// 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);
Questo ci fornirà le regole per le pagine, ma non ancora per gli allegati utilizzati nella pagina. Se li desideri anche, ripeti il passaggio per ciascun allegato, ma con add_rewrite_tag('%pagename%', "({$attachment_uri})", 'attachment=')
(vedi page_rewrite_rules()
per maggiori dettagli).
Bene, abbiamo le regole, ma ora è necessario aggiungerle in qualche modo alla struttura di riscrittura completa. È possibile farlo con add_rewrite_rule()
, ma è necessario chiamarlo per ogni regola generata $page_rewrite_rules
nell'array. Per questo motivo, molte persone si agganciano al rewrite_rules_array
filtro , poiché puoi semplicemente modificare l'array lì.
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;
}
Dopo aver incluso questo filtro, è necessario svuotare le regole di riscrittura (una volta, non una per ogni caricamento della pagina, poiché è piuttosto pesante). Puoi farlo chiamando flush_rewrite_rules()
o visitando la pagina delle impostazioni "Permalink".