Come posso creare percorsi URL personalizzati?
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?

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.

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

@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.

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

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

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

@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.

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.

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

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

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 probabilmente non ha funzionato per me, ma non ho più a disposizione la versione 4.7 quindi non posso verificare. Modificherò la mia risposta.

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

@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.
