WordPress: De ce nu funcționează add_rewrite_rule? (Programare, WordPress, Rescriere Url)

Andy Mercer a intrebat.
a intrebat.

Obiectiv

Un URL vizibil de:

/products/building-automation/details/productSKU

Ar trebui să indice către pagina reală WordPress de:

/products/details/?SKU=productSKU

Cod

public function setup_frontend() {

    add_rewrite_rule(
        'products/(building-automation|lighting-controls)/details/([^/]*)',
        'products/details/?SKU=$matches[2]',
        'top'
    );

    // Other code logic...

}

Din câte îmi dau seama, pagina $matches indică porțiunile din regex care se află în (), , deci în exemplu, $matches[1] ar fi building-automation, , și $matches[2] ar fi productSKU.

Am încercat de mai multe ori să șterg regulile. Aceasta este apelată din interiorul unei clase, dar nu pare să fie aceasta problema. Atașez funcția la init eveniment.

Ce se întâmplă

Primesc 404 șablon. Ce fac greșit?

Editați

Se pare că a doua parte a parametrului TREBUIE să fie index.php. Din moment ce încercam să arăt către products/..., , s-a stricat. Așa că am actualizat la acest lucru:

    add_rewrite_rule(
        'products/(building-automation|lighting-controls)/details/([^/]*)',
        '?pagename=products/details&SKU=$matches[2]',
        'top'
    );

Nu funcționează și indică spre pagina și șablonul corect. Cu toate acestea, se poate vedea că $matches parte continuă să nu ajungă la destinație. De fapt, $_GET['SKU'] este de a veni prin intermediul ca '$matches[2]'.

3 răspunsuri
Benedick Sahagun

Prima problemă este că arată spre ceva ce nu începe cu index.php. Trebuie să arate spre index.php?stuff, , din păcate. Dar puteți folosi în continuare numele paginii, așa cum se arată mai jos.

add_rewrite_rule(
    'products/(building-automation|lighting-controls)/details/([^/]*)',
    'index.php?pagename=products/details&SKU=$matches[2]',
    'top'
);

În al doilea rând, trebuie să vă înregistrați șirul de interogare, care este SKU. Adăugați acest lucru:

add_filter( 'query_vars', 'product_details_rewrite_filter' );

function product_details_rewrite_filter( $query_vars ){
    $query_vars[] = 'SKU';
    return $query_vars;
} 

Veți avea în continuare o problemă. $_GET['SKU'] va fi $matches[2], , nu RIBU1C. Pentru a remedia acest lucru, schimbați $matches[2] în $2. Atunci va funcționa:

add_rewrite_rule(
    'products/(building-automation|lighting-controls)/details/([^/]*)',
    'index.php?pagename=products/details&SKU=$2',
    'top'
);

Comentarii

  • Da, încercând o parte din răspunsul tău, funcționează parțial. Se pare că al doilea parametru TREBUIE să fie index.php. Cu toate acestea, parametrul term parte a răspunsului tău nu este corectă, cred. Mi-am editat întrebarea cu noul șir parțial funcțional, ați putea să vă uitați? –  > Por Andy Mercer.
  • Da, îmi pare rău, am înlocuit partea incorectă a textului din codul de probă. De asemenea, ar trebui să aveți și acest cod pentru a putea folosi $_GET[‘SKU’] : ` add_filter( ‘query_vars’, ‘product_details_rewrite_filter’ ); function product_details_rewrite_filter( $query_vars ){ $query_vars[] = ‘SKU’; return $query_vars; } ` –  > Por Benedick Sahagun.
  • Din anumite motive, $_GET era gol pentru mine, dar get_query_var(‘SKU’) a funcționat. Doar în cazul în care cineva în viitor se confruntă cu aceeași problemă. –  > Por edank.
Oleg Butuzov

Nu funcționează în acest fel… Încercați să obțineți ceva imposibil cu acest cod. Regulile de rescriere în wordpress funcționează cu rutarea index.php, dar nu și cu căile externe. Deci,

products/(building-automation|lighting-controls)/details/([^/]*)

ar trebui să fie „traductibil” în limba „wordpress” (ceva de genul)

index.php?post_type=products&category=$matches[1]&scu=$matches[1]

notificare, scu ar trebui, de asemenea, să fie definit ca var suplimentar.

editare 1:Lucrul (cred) pe care încercați să îl realizați este într-adevăr seamănă cu un model de regulă htaccess, în acest caz puteți folosi mod_rewrite_rules filter (filtrează conținutul care merge în .htaccess) pentru a-l schimba după cum vă place.

editare 2:Advertisment – puteți utiliza, de asemenea, plugin-ul meu de bara de depanare numit debug bar rewrite rules pentru a depana practic aceste date. Observație: (în prezent nu suportă lista de reguli prin add_rewrite_rule, așa că puteți doar inspecta vizual regula, și să vedeți dacă se potrivește cu așteptările dvs.).

Comentarii

  • Da, mi-am dat seama încet-încet că trebuie să arate către index.php. Ar fi frumos dacă nu ar fi așa. De fapt, ar fi perfect dacă aș putea specifica o adresă URL către un șablon de pagină, fără a avea nevoie de o „pagină WordPress” reală în backend. Ah, bine. Marchez răspunsul lui Benedick ca fiind cel corect, pentru că a răspuns înaintea ta și am spus ceva similar, dar am dat upvoted. Mulțumesc, amice. –  > Por Andy Mercer.
Frunky

1) Încearcă să actualizezi permalink-urile.

Mergeți la Dashboard->Setting->Permalinks-> butonul „Save changes” (Salvează modificările).

2) Adăugați o acțiune la funcția dvs.

add_action('init', 'setup_frontend');
function setup_frontend() {

add_rewrite_rule(
    'products/(building-automation|lighting-controls)/details/([^/]*)',
    'products/details/?SKU=$matches[2]',
    'top'
);

// Other code logic...

}

Comentarii

  • Folosești add_action pentru funcția ta? –  > Por Frunky.