tassonomia personalizzata e pagine riscrivono il conflitto di lumache dà 404


9

Sto usando il plug-in UI di tipo di posta personalizzato per creare le mie tassonomie personalizzate. Ho un portafoglio composto da progetti (tipo di posta personalizzato) con 2 tassonomie personalizzate di tecnologie e clienti. La tassonomia dei clienti ha una lumaca di riscrittura personalizzata di portfolio/clients/, mentre la tassonomia delle tecnologie ha una lumaca di riscrittura personalizzata diportfolio/

Riscrive:
portfolio/html <- la pagina mostra tutti i progetti usando HTML
portfolio/clients/client-a<- la pagina mostra tutti i progetti per il client A

Ora, quando provo a creare una landing page per i clienti che hanno una lumaca di URL, /portfolio/clientsottengo la pagina 404. Sono abbastanza sicuro che ciò sia dovuto alla riscrittura URL contrastante della tassonomia delle tecnologie. Immagino mentre lo cerca nella tassonomia della tecnologia, non esiste quindi sputa la pagina 404. Quindi, come faccio a far funzionare l'URL riscrittura lumaca in modo che quando premo /portfolio/clients, non rispedisca la pagina 404 e utilizzi il modello di pagina corretto?

Risposte:


16

Sembra che tu abbia bisogno di "regole di riscrittura verbose parziali". Le regole di riscrittura dettagliata indicano che tutte le pagine sono messe in primo piano perché WordPress non riesce a capire la differenza tra una pagina e un post. Qui pensa di si, perché tutti gli URL del modulo portfolio/([^/]+)/provengono dalla tua portfoliotassonomia, tranne questo portfolio/clients/. Dovrai metterlo in cima alle regole di riscrittura, in modo che corrisponda alla tassonomia del portafoglio più generica. Probabilmente potresti anche forzare tutte le regole di riscrittura in modo dettagliato, ma ciò avrà un impatto sulle prestazioni se hai molte pagine.

Questa risposta è scritta con la mia comprensione appena acquisita delle regole di riscrittura, quindi spero sia un buon modo per farlo e il codice di esempio non contiene troppi errori.

Una pagina non genera una sola regola di riscrittura, ma genera un gruppo:

  • (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]+)?/?$

Non è necessario crearli da soli, è possibile riutilizzare il potere di WP_Rewrite. Guarda il suo page_rewrite_rules()metodo: se siamo in modalità dettagliata, ottiene un elenco di tutte le pagine (via page_uri_index()) e dei loro allegati, sovrascrive il %pagename%tag di riscrittura e genera le regole di riscrittura per questa pagina. Possiamo fare anche questo:

// 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);

Questo ci fornirà le regole per le pagine, ma non ancora per gli allegati utilizzati nella pagina. Se li desideri anche, ripeti il ​​passaggio per ciascun allegato, ma con add_rewrite_tag('%pagename%', "({$attachment_uri})", 'attachment=')(vedi page_rewrite_rules()per maggiori dettagli).

Bene, abbiamo le regole, ma ora è necessario aggiungerle in qualche modo alla struttura di riscrittura completa. È possibile farlo con add_rewrite_rule(), ma è necessario chiamarlo per ogni regola generata $page_rewrite_rulesnell'array. Per questo motivo, molte persone si agganciano al rewrite_rules_arrayfiltro , poiché puoi semplicemente modificare l'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;
}

Dopo aver incluso questo filtro, è necessario svuotare le regole di riscrittura (una volta, non una per ogni caricamento della pagina, poiché è piuttosto pesante). Puoi farlo chiamando flush_rewrite_rules()o visitando la pagina delle impostazioni "Permalink".


Eccellente! Grazie Jan! Questo ha funzionato. Non avrei potuto ricevere una spiegazione migliore.
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.