Você parece precisar de "regras de reescrita detalhada parcial". Regras de reescrita verbais significam que todas as páginas são colocadas no topo porque o WordPress não consegue descobrir a diferença entre uma página e uma postagem. Aqui ele pensa que pode, porque todos os URLs do formulário portfolio/([^/]+)/
são da sua portfolio
taxonomia, exceto este portfolio/clients/
. Você precisará colocar essa regra em cima das regras de reescrita, para que ela corresponda antes da taxonomia mais genérica do portfólio. Você provavelmente também pode forçar todas as regras de reescrita a serem detalhadas, mas isso afetará o desempenho se você tiver muitas páginas.
Essa resposta foi escrita com meu entendimento recém-adquirido de regras de reescrita, portanto, espero que seja uma boa maneira de fazê-lo e o código de exemplo não contenha muitos erros.
Uma página não gera apenas uma regra de reescrita, gera um grupo:
(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]+)?/?$
Você não precisa criá-las, pode reutilizar o poder de WP_Rewrite
. Veja o page_rewrite_rules()
método: se estivermos no modo detalhado, ele obtém uma lista de todas as páginas (via page_uri_index()
) e seus anexos, sobrescreve a %pagename%
tag reescrita e gera as regras de reescrita para esta página. Também podemos fazer isso:
// 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);
Isso fornecerá as regras para as páginas, mas ainda não para os anexos usados na página. Se você também quiser, repita a etapa para cada anexo, mas com add_rewrite_tag('%pagename%', "({$attachment_uri})", 'attachment=')
(consulte page_rewrite_rules()
para obter mais detalhes).
Bom, temos as regras, mas agora você precisa adicioná-las à estrutura de reescrita completa de alguma forma. Você pode fazer isso com add_rewrite_rule()
, mas deve chamá-lo para todas as regras geradas na $page_rewrite_rules
matriz. Por esta razão, muitas pessoas ligar para o rewrite_rules_array
filtro , já que você pode simplesmente modificar a matriz 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;
}
Depois de incluir esse filtro, você deve liberar as regras de reescrita (uma vez, não uma a cada carregamento da página, pois é bastante pesada). Você pode fazer isso ligando flush_rewrite_rules()
ou visitando a página de configurações "Permalinks".