Parece que necesitas "reglas de reescritura parcial detallada". Las reglas de reescritura detalladas significan que todas las páginas se colocan en la parte superior porque WordPress no puede descubrir la diferencia entre una página y una publicación. Aquí piensa que puede, porque todas las URL de la forma portfolio/([^/]+)/
son de su taxonomía portfolio
, excepto esta portfolio/clients/
. Tendrá que poner eso por encima de las reglas de reescritura, para que coincida con la taxonomía de cartera más genérica. Probablemente también podría forzar que todas las reglas de reescritura sean detalladas, pero eso tendrá un impacto en el rendimiento si tiene muchas páginas.
Esta respuesta está escrita con mi recién adquirida comprensión de las reglas de reescritura, por lo que espero que sea una buena forma de hacerlo y que el código de ejemplo no contenga demasiados errores.
Una página no genera solo una regla de reescritura, genera un 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]+)?/?$
No tiene que crearlos usted mismo, puede reutilizar el poder de WP_Rewrite
. Mire su page_rewrite_rules()
: si estamos en modo detallado, obtiene una lista de todas las páginas (a través de page_uri_index()
) y sus adjuntos, sobrescribe la etiqueta %pagename%
rewrite y genera las reglas de reescritura para esta página. Podemos hacer esto también:
// 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);
Esto nos dará las reglas para las páginas, pero aún no para los archivos adjuntos utilizados en la página. Si también los desea, repita el paso para cada archivo adjunto, pero con add_rewrite_tag('%pagename%', "({$attachment_uri})", 'attachment=')
(consulte page_rewrite_rules()
para obtener más detalles).
Bien, tenemos las reglas, pero ahora necesita agregarlas a la estructura de reescritura completa de alguna manera. Podría hacer esto con add_rewrite_rule()
, pero debe llamarlo para cada regla generada en la matriz $page_rewrite_rules
. Por este motivo, muchas personas se conectan a el filtro rewrite_rules_array
filter , ya que puedes modificar la matriz allí.
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;
}
Después de incluir este filtro, debe vaciar las reglas de reescritura (una vez, no una por cada carga de página, ya que es bastante pesada). Puede hacerlo llamando a flush_rewrite_rules()
o visitando la página de configuración de "Permalinks".