taxonomia personalizada e páginas reescrevem o conflito de lesmas

9

Estou usando o plug-in personalizado da interface do usuário do tipo de postagem para criar minhas taxonomias personalizadas. Eu tenho um portfólio que é composto de projetos (tipo de postagem personalizada) com 2 taxonomias personalizadas de tecnologias e clientes. A taxonomia de clientes possui uma lesma de reescrita customizada portfolio/clients/, enquanto a taxonomia de tecnologias possui uma lesma de reescrita customizada deportfolio/

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

Agora, quando tento criar uma página de destino para clientes com uma lesma de URL, /portfolio/clientsrecebo a página 404. Tenho certeza de que isso se deve a reescritas de URL conflitantes da taxonomia de tecnologias. Suponho que, enquanto o pesquisa na taxonomia tecnológica, ele não existe e, em seguida, sai da página 404. Então, como faço para que a URL reescreva a URL funcione para que, quando eu clico /portfolio/clients, ela não retorne a página 404 e use o modelo de página correto?

Johannes Pille
fonte

Respostas:

16

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 portfoliotaxonomia, 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_rulesmatriz. Por esta razão, muitas pessoas ligar para o rewrite_rules_arrayfiltro , 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".

Jan Fabry
fonte
Excelente! Obrigado Jan! Isso funcionou. Eu não poderia ter recebido uma explicação melhor.