Utilizzo di "slug" personalizzati/dinamici per una pagina
Ho una pagina personalizzata che utilizza un template chiamato "Stores" http://example.com/stores/
. Questa pagina avrà un elenco di stati e/o aziende come categorie. Per questo sistema ho un tipo di post personalizzato "store" che può essere assegnato a una singola categoria (stato o azienda),
Ogni negozio non è una pagina specifica, ma un'informazione di contatto che viene visualizzata in un layout stile elenco telefonico per stati/aziende.
Il problema che ho ora è, come posso fare in modo che il mio template "Stores" accetti richieste URL da http://example.com/stores/california/
(senza generare errore 404)?
California
in questo senso non è una pagina, ma una query. Inoltre non voglio creare manualmente una pagina per ciascuna di queste categorie (Poiché viene estratta dal database, ed è automatica). Potrei utilizzare ?state=california
per questo scopo, ma vorrei imparare il modo corretto per consentire questo URL all'interno di WordPress.
Il modo corretto è modificare manualmente il file htaccess? Non verrebbe sovrascritto se si modifica la struttura dei permalink? Come dovrei formattare l'htaccess?

Crea un Template di Pagina
Aggiungi una nuova pagina e assegnale lo slug stores
Aggiungi una Variabile di Query Pubblica
add_filter('query_vars', 'add_state_var', 0, 1);
function add_state_var($vars){
$vars[] = 'state';
return $vars;
}
Aggiungi una Regola di Rewrite
Questo indirizzerà la tua richiesta alla tua pagina stores
.
add_rewrite_rule('^stores/([^/]*)/?','index.php?post_type=page&name=stores&state=$matches[1]','top');
All'interno del tuo Template
Puoi accedere alla tua variabile state nel seguente modo:
$state = get_query_var('state');
Rigenera i tuoi Permalink
Vai su Impostazioni->Permalink per rigenerare i permalink e aggiungere la tua regola di rewrite allo stack.

Mi dispiace per il ritardo. Questo codice funziona, ma c'è un problema che non riesco a identificare con il wiki. Ora quando vado su stores/alabama invece di ottenere una pagina 404 carica correttamente la pagina Store. Ma, mi reindirizza nuovamente a /stores/, e non c'è traccia della variabile di query "state" (ho persino verificato $wp_query nel mio template, nulla riguardo alabama). Perché viene reindirizzato nuovamente a /state/? Ho resettato i permalink (quindi l'URL continua a "funzionare").

Aggiornamento: Se rimuovo post_type=page&name=stores
allora arrivo alla landing page, tuttavia la variabile di query "state" esiste. Il reindirizzamento sta rimuovendo la variabile di query, anche se non sono ancora sicuro del perché specificare il post type stia causando un reindirizzamento in primo luogo.

Anche per me la soluzione con 'post_type=page&name=stores' non funziona. Ho dovuto utilizzare l'approccio della soluzione di Jared con gli ID delle pagine.

Ho trovato la risposta sul sito di WordPress e ho testato la soluzione: https://codex.wordpress.org/Rewrite_API/add_rewrite_rule#Using_Custom_Templates_with_custom_querystring
Crea un Template di Pagina
Crea un template di pagina per i negozi e applicalo a una pagina.
$stores = get_query_var('stores');
Aggiungi un Tag di Rewrite
Nel tuo functions.php aggiungi un tag di rewrite, che fa sapere a WordPress di cercare il tag specifico
function custom_rewrite_tag() {
add_rewrite_tag('%stores%', '([^&]+)');
}
add_action('init', 'custom_rewrite_tag', 10, 0);
Aggiungi una Regola di Rewrite
Ora per formattare l'URL e puntarlo a index.php con le variabili, inserisci il seguente codice nel tuo functions.php. Nota: Devi aggiornare il page_id con l'ID della pagina dei negozi (in questo esempio è 12).
function custom_rewrite_rule() {
add_rewrite_rule('^stores/([^/]*)/?','index.php?page_id=12&stores=$matches[1]','top');
}
add_action('init', 'custom_rewrite_rule', 10, 0);
Da qui puoi navigare su /stores/south-dakota/ e la variabile $stores nel tuo template di pagina sarà "south-dakota".

Anch'io stavo cercando di fare la stessa cosa e alla fine l'ho risolta nel seguente modo.
Aggiungi il seguente codice al tuo functions.php all'interno del tema.
add_filter('query_vars', 'add_state_var', 0, 1);
function add_state_var($vars){
// Aggiunge la variabile 'state' alle query vars
$vars[] = 'state';
return $vars;
}
// Aggiunge una regola di riscrittura per gli URL tipo /stores/nome-stato/
add_rewrite_rule('^stores/([^/]+)/?$','index.php?pagename=stores&state=$matches[1]','top');
All'interno del tuo template, recupera la variabile della query usando questo codice
// Ottiene il valore della variabile 'state' dalla query
$state = get_query_var('state');

Ecco un esempio funzionante per gestire uno slug dinamico e assegnare un template ad esso:
Gestisci il tuo endpoint o slug personalizzato in modo dinamico o definiscilo nel file
/** imposta la regola di riscrittura per la tabella userlist personalizzata */
$customendpoint = get_option('dynamic_slug_custom_endpoint');
add_action('init', 'setRewriteRule');
function setRewriterule() {
add_rewrite_rule($customendpoint . '/?', 'index.php?' . $customendpoint . '=parent-xml-page', 'top');
}
/** Inserisci nella whitelist uno specifico parametro query * */
add_filter('query_vars', 'getQueryvar');
public function getQueryvar($query_vars) {
$query_vars[] = $customendpoint;
return $query_vars;
}
Includi il tuo template personalizzato per quello slug:
/** Controlla il parametro query e reindirizzalo al file template * */
add_action('template_include', 'redirectTemplate');
function redirectTemplate($template) {
if (get_query_var($customendpoint == false || get_query_var($customendpoint == '') {
return $template;
}
return 'your-template.php';
}
