Come posso creare percorsi URL personalizzati?

20 ago 2011, 01:24:08
Visualizzazioni: 123K
Voti: 70

Ho un requisito molto particolare, ma spero di poterlo spiegare senza essere troppo confuso. Ho creato un template di pagina dove elenco alcune proprietà che ottengo da un file XML esterno. Finora nessun problema, e diciamo che l'URL è così:

http://www.example.com/properties/

Ogni proprietà ha un link che dovrebbe reindirizzare l'utente a una pagina "Singola Proprietà" che mostra più informazioni su di essa. Mi chiedevo se ci fosse un modo per rendere il link in questo modo:

http://www.example.com/properties/123

Dove 123 sarebbe l'id della proprietà. Quindi se ho l'URL come properties/some_id voglio essere in grado di caricare un file di visualizzazione (come i file single.php o page.php), ma specifico per questa condizione URL.

È possibile?

0
Tutte le risposte alla domanda 2
10
86

Aggiungi questo al file functions.php del tuo tema, oppure inseriscilo in un plugin.

add_action( 'init', 'wpse26388_rewrites_init' );
function wpse26388_rewrites_init(){
    add_rewrite_rule(
        'properties/([0-9]+)/?$',
        'index.php?pagename=properties&property_id=$matches[1]',
        'top' );
}

add_filter( 'query_vars', 'wpse26388_query_vars' );
function wpse26388_query_vars( $query_vars ){
    $query_vars[] = 'property_id';
    return $query_vars;
}

Questo aggiunge una regola di riscrittura che indirizza le richieste a /properties/ seguite da qualsiasi combinazione di numeri alla pagina con nome properties, impostando la variabile di query property_id. Assicurati di visitare la pagina delle impostazioni dei permalink e salvare per aggiornare le regole di riscrittura, in modo che questa nuova regola venga inclusa.

Nel tuo template page-properties.php, get_query_var('property_id') restituirà l'ID della proprietà se impostato, altrimenti mostrerà la pagina delle proprietà predefinita.

20 ago 2011 02:44:23
Commenti

Questo era QUASI funzionante per me, ma ho dovuto aggiungere: add_filter('init','flushRules');
function flushRules(){ global $wp_rewrite; $wp_rewrite->flush_rules(); }

tooshel tooshel
13 nov 2012 19:52:34

@tooshel sicuramente non vuoi eseguire il flush delle regole ad ogni richiesta, è un'operazione costosa e rallenterà il tuo sito in modo significativo. Hai bisogno di eseguire il flush delle regole solo una volta, all'attivazione del plugin, o semplicemente visitando la pagina delle impostazioni dei permalink.

Milo Milo
13 nov 2012 22:17:06

Sì, lo capisco... ma quando stai testando è comodo averlo inserito!

tooshel tooshel
14 nov 2012 22:32:02

Un'espressione regolare più intelligente per riscrivere l'URL potrebbe essere ^properties/([0-9]+)/?. Altrimenti corrisponderebbe a qualcosa come example/properties/1

Ryan Taylor Ryan Taylor
12 dic 2014 19:34:52

@RyanTaylor sei sicuro di questo? non cattura example/properties/1 quando lo testo.

Milo Milo
12 dic 2014 20:14:15

Qual è la posizione del file page-properties.php? L'ho messo nella directory del plugin. È corretto?

Farid Movsumov Farid Movsumov
30 giu 2016 09:09:56

@FeridMovsumov i file del tema vengono sempre caricati dalla directory del tema attivo, a meno che non aggiungi un filtro per caricarli da un'altra posizione.

Milo Milo
30 giu 2016 18:52:36

Ciao @Milo, questo è un bellissimo pezzo di codice. Sai come fare per evitare che entri in conflitto quando si usa $paged = (get_query_var('paged')) ? get_query_var('paged') : 1; ? La funzione sta catturando $page (e lasciandolo vuoto) e non riesco a continuare la paginazione.

Jaypee Jaypee
8 ago 2017 20:27:05

@Milo cosa intendi con put it in a plugin. ? dove esattamente? Ovunque nel plugin è possibile? oppure in wp-content/plugins/myPlugin/myPlugin.php ?

SL5net SL5net
17 mag 2021 14:54:39

Il filtro query_vars sembra non funzionare (WP 5.7), restituisce un errore: Warning: Invalid argument supplied for foreach() in wp/wp-includes/class-wp.php on line 296

jnaklaas jnaklaas
4 lug 2021 19:13:44
Mostra i restanti 5 commenti
5
11

Un altro modo per farlo:

add_action('init', function() {
    // Aggiunge una regola di riscrittura per gli URL tipo /properties/123
    add_rewrite_rule( '^properties/([0-9]+)/?',
                      'index.php?pagename=properties&property_id=$matches[1]',
                      'top' );
}, 10, 0);

add_action('init', function() {
    // Aggiunge un tag di riscrittura per catturare l'ID proprietà
    add_rewrite_tag( '%property_id%', '([^&]+)' );
}, 10, 0);

Codex API Riscrittura/add rewrite rule

Codex API Riscrittura/add rewrite tag

21 mag 2017 12:24:24
Commenti

La risposta accettata funziona con la versione 4.7 (e 4.8), non sono sicuro del perché tu pensi che non funzioni. Il tuo codice sta facendo essenzialmente la stessa cosa, add_rewrite_tag aggiunge la variabile di query allo stesso array del filtro query_vars.

Milo Milo
7 lug 2017 20:45:11

@Milo probabilmente non ha funzionato per me, ma non ho più a disposizione la versione 4.7 quindi non posso verificare. Modificherò la mia risposta.

Christian Lescuyer Christian Lescuyer
8 lug 2017 10:28:30

@Milo Anche se personalmente preferisco il rewrite tag, ho comunque testato la risposta accettata e funziona. Solo questione di gusti personali, però.

Johansson Johansson
8 lug 2017 18:36:11

@JackJohansson i rewrite tag sono necessari quando li usi in una permastruct. Sono solo un pezzo di dati extra che WordPress in questo caso non utilizza mai.

Milo Milo
8 lug 2017 18:47:38

entrambe le regole possono essere aggiunte allo stesso metodo, ottenendo una funzione più pulita e utile a cui tornare e capire quando si fanno lavori di manutenzione

eballeste eballeste
14 lug 2018 18:51:40