Utilizarea unui "slug" personalizat/dinamic pentru o pagină

23 aug. 2012, 22:25:29
Vizualizări: 32.3K
Voturi: 10

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?

0
Toate răspunsurile la întrebare 4
4
17

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

23 aug. 2012 23:09:13
Comentarii

Î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ă").

Radley Sustaire Radley Sustaire
3 sept. 2012 12:22:20

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.

Radley Sustaire Radley Sustaire
3 sept. 2012 12:42:28

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.

Kevin Kevin
7 iun. 2017 12:36:09

Dacă facem modificări în structura permalink-urilor, nu va afecta toate URL-urile, inclusiv alte tipuri de postări personalizate și pagini care pot să nu aibă acel câmp specific?

Dinesh Patil Dinesh Patil
6 mai 2019 12:47:53
0

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

17 apr. 2015 23:33:52
0

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');
3 nov. 2013 10:04:34
0

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';
}
11 nov. 2021 13:26:42