custom taxonomy e páginas reescrevem slug conflict dá 404

9

Estou usando o plug-in do Custom Post Type UI para criar minhas taxonomias personalizadas. Eu tenho um portfólio que é composto de projetos (tipo de postagem personalizado) com 2 taxonomias personalizadas de tecnologias e clientes. A taxonomia de clientes tem um slr de reescrita personalizada de portfolio/clients/ , enquanto a taxonomia de tecnologias tem um slr de reescrita personalizada de portfolio/

Reconfigura:
portfolio/html < - a página exibe todos os projetos que usam HTML
portfolio/clients/client-a < - a página exibe todos os projetos para o cliente A

Agora, quando tento criar uma página de destino para clientes com um URL de /portfolio/clients , obtenho a página 404. Tenho certeza que isso é por causa de URLs conflitantes reescritas da taxonomia de tecnologias. Eu estou supondo como ele procura na taxonomia de tecnologia, não existe, então, cospe a página 404. Então, como faço para que a lesma de reescrita de url funcione para que, quando eu atingir /portfolio/clients , ela não retorne a página 404 e use o modelo de página correto?

    
por Johannes Pille 16.11.2010 / 06:31

1 resposta

16

Você parece precisar de "regras de reescrita verbais parciais". Regras de reescrita verbosa significa 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 um post. Aqui ele acha que pode, porque todas as URLs do formulário portfolio/([^/]+)/ são da sua portfolio taxonomy, exceto essa portfolio/clients/ . Você terá que colocar esse em cima das regras de reescrita, para que ele corresponda antes da taxonomia de portfólio mais genérica. Você provavelmente também poderia forçar todas as regras de reescrita a serem detalhadas, mas isso afetará o desempenho se você tiver muitas páginas.

Esta resposta está escrita com a minha compreensão de regras de reescrita recém-adquirida, por isso espero que seja uma boa maneira de o fazer e o código de exemplo não contenha muitos erros.

Uma página não gera apenas uma regra de reescrita, ela 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á-los sozinho. Você pode reutilizar o poder de WP_Rewrite . Veja o método page_rewrite_rules() : se estivermos em modo detalhado, obtém uma lista de todas as páginas (via page_uri_index() ) e seus anexos, sobrescreve a tag% re_rite %pagename% e gera as regras de reconfiguração para esta página. Nós 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 nos dará 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, nós temos as regras, mas agora você precisa adicioná-las à estrutura completa de reescrita de alguma forma. Você poderia fazer isso com add_rewrite_rule() , mas deve chamá-lo para cada regra gerada na matriz $page_rewrite_rules . Por esse motivo, muitas pessoas conectam-se ao rewrite_rules_array filter , desde que você pode apenas modificar o 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;
}

Depois de incluir esse filtro, você deve liberar as regras de reconfiguração (uma vez, não uma, a cada carregamento de página, pois é bastante pesado). Você pode fazer isso chamando flush_rewrite_rules() ou visitando a página de configurações "Permalinks".

    
por Jan Fabry 16.11.2010 / 08:49