Comprensione add_rewrite_rule


11

Sto cercando di add_rewrite_rulelavorare per estrarre un parametro dall'URL e passarlo attraverso la richiesta. Ho visto un numero di post su questo, ma non riesco a farlo funzionare.

Se un URL inizia con una determinata stringa, vorrei rimuoverlo dall'URL e passarlo come parametro di query.

URL richiesta esempio:

http://domain.com/foo/my_page

Questo si trasformerebbe in

http://domain.com/my_page?param=foo

Se 'foo' non è presente, dovrebbe semplicemente passare attraverso una normale richiesta. Questa logica dovrebbe applicarsi a qualsiasi URL di pagina o URL di tipo di post personalizzato sul mio sito (sostanzialmente pippo / *). Pensare che funzionerebbe come un passaggio attraverso, se l'URL ha 'foo' spogliarlo e poi passare semplicemente a Wordpress per la sua cosa normale.

Ho già 'param' come query_vars consentite.

In totale, dovrebbe funzionare per quanto segue:

  • / foo / my_page (Pagina)
  • / foo / my_folder / my_page (Pagina secondaria)
  • / foo / example_type (archivio postale personalizzato)
  • / foo / example_type / example_post (Post personalizzato singolo)

qualsiasi URL, che significa post, categorie, tag, ecc., non solo il pagetipo di post o solo una pagina? che dire delle pagine padre / figlio nella gerarchia?
Milo,

@Milo L'ho chiarito per te. Sto usando solo pagine e tipi di post personalizzati (archivio e pagine singole).
Louis W,

Risposte:


8

Una regola di base che funzionerebbe per il tuo esempio:

function wpd_foo_rewrite_rule() {
    add_rewrite_rule(
        '^foo/([^/]*)/?',
        'index.php?pagename=$matches[1]&param=foo',
        'top'
    );
}
add_action( 'init', 'wpd_foo_rewrite_rule' );

Questo prende tutto ciò che viene dopo foo/e lo imposta come pagenameper la query, quindi paramottiene il valore statico foo. Se hai bisogno di pattern URL diversi, avrai bisogno di regole extra per ogni pattern unico. Consultare i WP_Querydocumenti per i vari parametri di query che possono essere impostati nelle regole di riscrittura. Non dimenticare di svuotare le regole di riscrittura dopo averne aggiunte di nuove. Questo può essere fatto visitando la pagina Impostazioni Permalink.

Ora visitando il tuo URL di esempio:

http://domain.com/foo/my_page

caricherà la pagina corretta, ma non si comporterà esattamente come visitare:

http://domain.com/my_page?param=foo

perché quando si usano le riscritture interne, paramè impostato $wp_querynell'oggetto query, non nel $_GETsuperglobal. Se devi lavorare con il codice che sta cercando un valore $_GET, ti servirà un ulteriore passaggio per impostare quel valore:

function wpd_foo_get_param() {
    if( false !== get_query_var( 'param' ) ){
        $_GET['param'] = get_query_var( 'param' );
    }
}
add_action( 'parse_query', 'wpd_foo_get_param' );

Un altro metodo da considerare è l'utilizzo degli endpoint, quindi /foo/sarebbe alla fine degli URL piuttosto che come prefisso. Il vantaggio è che l'API add_rewrite_endpointsemplifica l'aggiunta di tutte le regole necessarie, inclusa l'abilitazione dell'impaginazione.


Grazie per la spiegazione dettagliata. Sembra vicino, funziona per le pagine ma mi dà un errore 404 per l'archivio post personalizzato e gli URL singoli.
Louis W,

bene sì, come ho detto, è necessario aggiungere regole aggiuntive che corrispondono a ciascuno di questi schemi. Non so che aspetto abbiano questi URL nella tua configurazione.
Milo,

Ho un tipo di pagina personalizzato chiamato 'progetti' che ha un archivio e singole pagine. Puoi fare un esempio per questo, e posso fare tutti gli altri.
Louis W,

Inoltre, non sembra funzionare per le sottopagine.
Louis W,

1
Modifica la tua domanda per aggiungere un esempio di ogni modello di URL che necessita di una regola. Non sono davvero preoccupato per l'accettazione della mia risposta, a volte posso indurre le persone a rispondere alle loro stesse domande dando loro qualcosa per cominciare.
Milo

6

Ok, ho ottenuto esempi di lavoro per tutti e 3 i tipi di richieste. Ci sono voluti un sacco di esperimenti e scherzi per farli funzionare. Immagino che Milo sia bravo a spingere le persone a rispondere alle loro stesse domande.

Dopo innumerevoli modifiche e aggiornamento dei permalink, mi sono reso conto che era molto più facile capire gli URL al di fuori di add_rewrite_url e, una volta funzionati, definire la riscrittura. Esempio di essere index.php?param=foo&post_type=example_type.

Un'altra cosa ovvia, ma aggiungerla qui in modo che possa aiutare qualcun altro. Devi definire il tipo di post personalizzato add_rewrite_rule regole PRIMA di definire le regole per i caratteri jolly della pagina / sottopagina. Ho perso un bel po 'di tempo con quello e penso che sia la cosa principale che non mi ha fatto capire perché le regole non hanno funzionato.

Ecco le 3 regole che funzionano per tutte le mie esigenze. La regola Pagina / Sotto-pagina è stata combinata in una sola.

// Custom Post Archive
add_rewrite_rule(
    '^foo/example_type/?$',
    'index.php?param=foo&post_type=example_type',
    'top'
    );

// Custom Post Individual
add_rewrite_rule(
    '^foo/example_type/([^/]*)/?$',
    'index.php?param=foo&example_type=$matches[1]',
    'top'
    );

// Pages, Top-Level and Sub-Pages
// This MUST be placed in the code AFTER custom post add_rewrite_rule
add_rewrite_rule(
    '^foo/(.+)/?$',    
    'index.php?param=foo&pagename=$matches[1]',
    'top'
    );

Inoltre quello che ho fatto è impostare un ciclo per aggiungere più regole personalizzate per il tipo di post. Ricorda, devi definire il tipo di post personalizzato add_rewrite_rule regole PRIMA di definire le regole per i caratteri jolly della pagina / sottopagina.

$custom_types = array('example_type', 'projects', 'people');

foreach($custom_types as $type) {

    // Custom Post Archive
    add_rewrite_rule(
        '^foo/'.$type.'/?$',
        'index.php?param=foo&post_type='.$type,
        'top'
        );

    // Custom Post Individual
    add_rewrite_rule(
        '^foo/'.$type.'/([^/]*)/?$',
        'index.php?param=foo&'.$type.'=$matches[1]',
        'top'
        );

}

L' analizzatore di riscrittura che Milo ha passato è stato molto utile quando ha cercato di capire meglio come Wordpress richiede query per pagine / post.


In ritardo allo spettacolo, ma posso eseguire il ping per un altro esempio? Intendiamoci, non capisco assolutamente il parametro $ tag di add_rewrite_rule. Non ho idea di cosa significhi. Né capisco l'esempio usando pagename = $ match [1] '. HUH ??? Ho un URL come domain.com/detail?id=2&it=3. Voglio che la pagina sia domain.com/detail/2-3/. Sei disposto?
Debbie Kurth,
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.