taxonomía personalizada y páginas reescritas slug conflicto da 404

9

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

Rewrites:
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 un slug url de /portfolio/clients , obtengo la página 404. Estoy bastante seguro de que esto se debe a las reescrituras url conflictivas de la taxonomía de tecnologías. Supongo que al buscarlo en la taxonomía tecnológica, no existe, entonces escupe la página 404. Entonces, ¿cómo consigo que la barra de reescritura de url funcione para que cuando golpee a /portfolio/clients , no envíe la página 404 y use la plantilla de página correcta?

    
pregunta Johannes Pille 16.11.2010 - 06:31

1 respuesta

16

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".

    
respondido por el Jan Fabry 16.11.2010 - 08:49

Lea otras preguntas en las etiquetas