Utilizarea unui "slug" personalizat/dinamic pentru o pagină
Am o pagină personalizată care folosește un șablon numit "Stores" http://example.com/stores/
. Această pagină va avea o listă de state și/sau companii ca și categorii. Pentru acest sistem am un tip de postare personalizat "store" care poate fi atribuit unei singure categorii (fie stat sau companie),
Fiecare magazin nu este o pagină specifică, ci informații de contact care sunt afișate într-un layout tip carte de telefon pentru state/companii.
Problema pe care o am acum este, cum pot face ca șablonul meu "Stores" să accepte cereri URL de la http://example.com/stores/california/
(fără a arunca eroarea 404)?
California
în acest sens nu este o pagină, ci o interogare. De asemenea, nu vreau să creez manual o pagină pentru fiecare dintre aceste categorii (Deoarece este extras din baza de date, și automat). Aș putea folosi ?state=california
pentru acest scop, dar aș dori să învăț modalitatea corectă de a permite acest URL în WordPress.
Este corect să editez fișierul htaccess manual? Nu ar fi suprascris dacă editezi structura permalink-urilor? Cum aș formata htaccess-ul?

Creează un Șablon de Pagină
Adaugă o pagină nouă și dă-i slug-ul stores
Adaugă o Variabilă de Interogare Publică
add_filter('query_vars', 'add_state_var', 0, 1);
function add_state_var($vars){
$vars[] = 'state';
return $vars;
}
Adaugă o Regulă de Rescriere
Aceasta va direcționa cererea către pagina ta stores
.
add_rewrite_rule('^stores/([^/]*)/?','index.php?post_type=page&name=stores&state=$matches[1]','top');
În Șablonul Tău
Poți accesa variabila de stat astfel:
$state = get_query_var('state');
Resetează Legăturile Permanente
Vizitează Setări->Legături permanente pentru a reseta legăturile permanente și a adăuga regula ta de rescriere în stivă.

Îmi cer scuze pentru întârziere. Acest cod funcționează, dar există o problemă pe care nu o pot identifica cu wiki-ul. Acum, când accesez stores/alabama în loc să obțin o pagină 404, se încarcă corect pagina Store. Dar, mă redirecționează înapoi la /stores/, și nu există niciun semn al variabilei de interogare "state" (am verificat și $wp_query în șablonul meu, nimic despre alabama). De ce mă redirecționează înapoi la /state/? Am regenerat permalink-urile (de aceea URL-ul încă "funcționează").

Actualizare: Dacă elimin post_type=page&name=stores
atunci ajung pe pagina de destinație, însă variabila de interogare "state" există. Redirecționarea elimină variabila de interogare, deși încă nu sunt sigur de ce specificarea tipului de postare cauzează o redirecționare în primul rând.

Soluția cu 'post_type=page&name=stores' nu funcționează nici pentru mine. A trebuit să folosesc abordarea din soluția lui Jared cu ID-urile paginilor.

Am găsit răspunsul pe site-ul WordPress și am testat soluția: https://codex.wordpress.org/Rewrite_API/add_rewrite_rule#Using_Custom_Templates_with_custom_querystring
Crează un Șablon de Pagină
Creează un șablon de pagină pentru magazine și aplică-l pe o pagină.
$stores = get_query_var('stores');
Adaugă o Etichetă de Rescriere
În functions.php adaugă o etichetă de rescriere, care permite WordPress să știe să caute eticheta specifică
function custom_rewrite_tag() {
add_rewrite_tag('%stores%', '([^&]+)');
}
add_action('init', 'custom_rewrite_tag', 10, 0);
Adaugă o Regulă de Rescriere
Acum pentru a formata URL-ul și a-l direcționa către index.php cu variabilele, introdu următoarele în functions.php. Notă: Trebuie să actualizezi page_id cu ID-ul paginii de magazine (în acest exemplu este 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);
De aici poți naviga la /stores/south-dakota/ și variabila $stores din șablonul tău de pagină va fi "south-dakota".

Am încercat și eu să fac același lucru și în final am reușit în felul următor.
Adăugați următorul cod în fișierul functions.php din tema dumneavoastră.
add_filter('query_vars', 'add_state_var', 0, 1);
function add_state_var($vars){
$vars[] = 'state';
return $vars;
}
add_rewrite_rule('^stores/([^/]+)/?$','index.php?pagename=stores&state=$matches[1]','top');
În interiorul template-ului, obțineți variabila de interogare folosind acest cod
$state = get_query_var('state');

Iată un exemplu funcțional pentru gestionarea unui slug dinamic și alocarea unui șablon pentru acesta:
Gestionează endpoint-ul sau slug-ul personalizat dinamic sau definește-l în fișier
/** setează regula de rescriere pentru userlist-table personalizat */
$customendpoint = get_option('dynamic_slug_custom_endpoint');
add_action('init', 'setRewriteRule');
function setRewriterule() {
add_rewrite_rule($customendpoint . '/?', 'index.php?' . $customendpoint . '=parent-xml-page', 'top');
}
/** Permite un parametru de interogare specific * */
add_filter('query_vars', 'getQueryvar');
public function getQueryvar($query_vars) {
$query_vars[] = $customendpoint;
return $query_vars;
}
Include șablonul personalizat pentru acel slug:
/** Verifică parametrul de interogare și redirecționează către fișierul șablon * */
add_action('template_include', 'redirectTemplate');
function redirectTemplate($template) {
if (get_query_var($customendpoint == false || get_query_var($customendpoint == '') {
return $template;
}
return 'your-template.php';
}
