taxonomía personalizada y páginas reescriben slug conflict da 404

9

Estoy usando el complemento UI de tipo de publicación personalizada para crear mis taxonomías personalizadas. Tengo una cartera compuesta de proyectos (tipo de publicación personalizada) con 2 taxonomías personalizadas de tecnologías y clientes. La taxonomía de los clientes tiene una barra de reescritura personalizada de portfolio/clients/, mientras que la taxonomía de tecnologías tiene una barra de reescritura personalizada deportfolio/

Reescribe:
portfolio/html <- la página muestra todos los proyectos usando HTML
portfolio/clients/client-a<- la página muestra todos los proyectos para el cliente A

Ahora, cuando intento crear una página de destino para clientes que tiene una URL de slug /portfolio/clients, obtengo la página 404. Estoy bastante seguro de que esto se debe a reescrituras de URL en conflicto de la taxonomía de tecnologías. Supongo que cuando lo busca en la taxonomía tecnológica, no existe y luego escupe la página 404. Entonces, ¿cómo hago para que la URL rewrite slug funcione de modo que cuando presiono /portfolio/clients, no envíe la página 404 y use la plantilla de página correcta?

Johannes Pille
fuente

Respuestas:

16

Parece que necesita "reglas parciales de reescritura detallada". Las reglas detalladas de reescritura 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í cree que puede, porque todas las URL del formulario portfolio/([^/]+)/son de su portfoliotaxonomía, excepto esta portfolio/clients/. Tendrá que ponerlo encima de las reglas de reescritura, para que coincida antes de 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 afectará el rendimiento si tiene muchas páginas.

Esta respuesta está escrita con mi comprensión recién obtenida de las reglas de reescritura, así que espero que sea una buena manera de hacerlo y que el código de ejemplo no contenga demasiados errores.

Una página no genera una sola 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()método: si estamos en modo detallado, obtiene una lista de todas las páginas (vía page_uri_index()) y sus archivos adjuntos, sobrescribe la %pagename%etiqueta de reescritura y genera las reglas de reescritura para esta página. También podemos hacer esto:

// 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 quiere, repita el paso para cada archivo adjunto, pero con add_rewrite_tag('%pagename%', "({$attachment_uri})", 'attachment=')(ver page_rewrite_rules()para más detalles).

Bien, tenemos las reglas, pero ahora necesita agregarlas a la estructura de reescritura completa de alguna manera. Puede hacer esto con add_rewrite_rule(), pero debe llamarlo para cada regla generada en la $page_rewrite_rulesmatriz. Por esta razón, muchas personas se enganchan en el rewrite_rules_arrayfiltro , ya que sólo se puede 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 eliminar las reglas de reescritura (una vez, no una cada carga de página, ya que es bastante pesado). Puede hacerlo llamando flush_rewrite_rules()o visitando la página de configuración de "Permalinks".

Jan Fabry
fuente
¡Excelente! Gracias Jan! Esto funcionó. No podría haber recibido una mejor explicación.