Înțelegerea funcției add_rewrite_rule

31 dec. 2016, 01:34:12
Vizualizări: 52.3K
Voturi: 21

Încerc să fac funcția add_rewrite_rule să funcționeze pentru a extrage un parametru din URL și a-l transmite către cerere. Am văzut mai multe postări despre acest subiect, dar nu reușesc să-l fac să funcționeze.

Dacă un URL începe cu un anumit șir de caractere, aș dori să-l elimin din URL și să-l transmit ca parametru de interogare.

Exemplu de URL pentru cerere:

http://domain.com/foo/my_page

Acesta ar fi transformat în

http://domain.com/my_page?param=foo

Dacă 'foo' nu este prezent, ar trebui să treacă ca o cerere normală. Această logică ar trebui să se aplice oricărui URL de pagină sau URL de tip de postare personalizat de pe site-ul meu (practic foo/*). Mă gândesc că ar trebui să acționeze ca un intermediar, dacă URL-ul conține 'foo' să-l elimine și apoi să-l transmită către WordPress pentru a-și face treaba normală.

Am deja 'param' inclus în query_vars permise.

În total, ar trebui să funcționeze pentru următoarele:

  • /foo/my_page (Pagină)
  • /foo/my_folder/my_page (Sub-Pagină)
  • /foo/example_type (Arhivă Postare Personalizată)
  • /foo/example_type/example_post (Postare Personalizată Individuală)
2
Comentarii

orice URL, adică articole, categorii, etichete etc., nu doar tipul de postare page, sau orice pagină? ce zici de paginile părinte/copil în ierarhie?

Milo Milo
31 dec. 2016 02:05:08

@Milo Am clarificat acest lucru pentru tine. Folosesc doar pagini și tipuri de postări personalizate (pagini de arhivă și pagini individuale).

Louis W Louis W
31 dec. 2016 02:07:00
Toate răspunsurile la întrebare 2
8
17

O regulă de bază care ar funcționa pentru exemplul tău:

function wpd_foo_rewrite_rule() {
    add_rewrite_rule(
        '^foo/([^/]*)/?',
        'index.php?pagename=$matches[1]&param=foo',
        'top'
    );
}
add_action( 'init', 'wpd_foo_rewrite_rule' );

Aceasta preia orice vine după foo/ și setează acel lucru ca pagename pentru interogare, iar apoi param primește valoarea statică foo. Dacă ai nevoie de modele diferite de URL-uri, vei avea nevoie de reguli suplimentare pentru fiecare model unic. Consultă WP_Query docs pentru variabilele de interogare diverse care pot fi setate în regulile de rescriere. Nu uita să resetezi regulile de rescriere după ce adaugi unele noi. Acest lucru se poate face vizitând pagina de setări Permalinks.

Acum, accesând URL-ul din exemplul tău:

http://domain.com/foo/my_page

va încărca pagina corectă, dar nu se va comporta exact ca accesarea:

http://domain.com/my_page?param=foo

deoarece atunci când folosești rescrieri interne, param este setat în obiectul de interogare $wp_query, nu în superglobalul $_GET. Dacă ai nevoie să lucrezi cu un cod care caută o valoare în $_GET, vei avea nevoie de un pas suplimentar pentru a seta acea valoare:

function wpd_foo_get_param() {
    if( false !== get_query_var( 'param' ) ){
        $_GET['param'] = get_query_var( 'param' );
    }
}
add_action( 'parse_query', 'wpd_foo_get_param' );

O altă metodă de luat în considerare este utilizarea endpoint-urilor, astfel încât /foo/ să fie la sfârșitul URL-urilor și nu ca prefix. Avantajul acestei metode este că API-ul add_rewrite_endpoint simplifică adăugarea tuturor regulilor de care ai nevoie, inclusiv activarea paginării.

2 ian. 2017 05:15:52
Comentarii

Mulțumesc pentru explicația detaliată. Pare aproape, funcționează pentru pagini, dar îmi dă o eroare 404 pentru URL-urile arhivelor posturilor personalizate și pentru cele individuale.

Louis W Louis W
2 ian. 2017 06:51:46

păi da, cum am spus, trebuie să adaugi reguli suplimentare care să se potrivească cu fiecare dintre aceste modele. Nu știu cum arată acele URL-uri în configurația ta.

Milo Milo
2 ian. 2017 09:00:13

Am un tip de pagină personalizată numit 'proiecte' care are arhive și pagini individuale. Poți să dai un exemplu pentru asta, iar eu pot face toate celelalte.

Louis W Louis W
2 ian. 2017 18:50:49

De asemenea, nu pare să funcționeze pentru subpagini.

Louis W Louis W
2 ian. 2017 20:59:03

Corect, funcționează doar pentru exemplul specific menționat mai sus, motiv pentru care la final sugerez utilizarea unui endpoint în schimb. Dacă dorești diverse niveluri de subpagini, arhive cu paginare, postări individuale etc., vei ajunge să adaugi multe reguli. Acest plugin de analiză a rescrierii vă va ajuta să vedeți cum sunt analizate regulile în variabilele de interogare și vă poate oferi indicii despre cum să construiți reguli suplimentare.

Milo Milo
3 ian. 2017 00:08:39

Scuze, endpoint-ul nu va funcționa. Am nevoie ca variabila să fie la începutul URL-ului. Nu încerc să fiu dificil, dar nu pot accepta aceasta ca o soluție până când nu îndeplinește cerințele prezentate în postarea originală, care include arhive de postări personalizate/pagini individuale și (deși nu este explicit menționat) ar trebui să funcționeze pentru subpagini (foo/*).

Louis W Louis W
3 ian. 2017 00:25:18

Editează întrebarea ta pentru a adăuga un exemplu pentru fiecare model de URL care necesită o regulă. Nu mă preocupă prea mult ca răspunsul meu să fie acceptat, uneori pot să-i determin pe oameni să-și răspundă singuri la întrebări oferindu-le ceva de la care să pornească.

Milo Milo
3 ian. 2017 02:15:12

Au fost adăugate exemple.

Louis W Louis W
3 ian. 2017 04:09:42
Arată celelalte 3 comentarii
1

Bine, am reușit să obțin exemple funcționale pentru toate cele 3 tipuri de cereri. A fost nevoie de multă experimentare și încercări pentru a le face să funcționeze. Presupun că Milo este bun în a îndruma oamenii să își răspundă singuri la întrebări.

După nenumărate modificări și reîmprospătări ale permalink-urilor, am realizat că a fost mult mai ușor să descifrez URL-urile în afara funcției add_rewrite_url și, odată ce au funcționat, să definesc regula de rescriere. De exemplu index.php?param=foo&post_type=example_type.

Alt lucru evident, dar îl adaug aici pentru a putea ajuta pe altcineva. Trebuie să definiți regulile add_rewrite_rule pentru tipurile personalizate de postări ÎNAINTE de a defini regulile cu wildcard pentru pagini/sub-pagini. Am pierdut destul de mult timp cu asta și cred că acesta a fost principalul motiv pentru care nu înțelegeam de ce regulile nu funcționau.

Iată cele 3 reguli care funcționează pentru toate nevoile mele. Regula pentru Pagini/Sub-Pagini a fost combinată într-una singură.

// Arhivă Postări Personalizate
add_rewrite_rule(
    '^foo/example_type/?$',
    'index.php?param=foo&post_type=example_type',
    'top'
    );

// Postare Individuală Personalizată
add_rewrite_rule(
    '^foo/example_type/([^/]*)/?$',
    'index.php?param=foo&example_type=$matches[1]',
    'top'
    );

// Pagini, de Nivel Superior și Sub-Pagini
// Aceasta TREBUIE plasată în cod DUPĂ add_rewrite_rule pentru postări personalizate
add_rewrite_rule(
    '^foo/(.+)/?$',    
    'index.php?param=foo&pagename=$matches[1]',
    'top'
    );

În plus, am configurat o buclă pentru a adăuga mai multe reguli pentru tipuri de postări personalizate. Amintiți-vă, trebuie să definiți regulile add_rewrite_rule pentru tipurile de postări personalizate ÎNAINTE de a defini regulile cu wildcard pentru pagini/sub-pagini.

$custom_types = array('example_type', 'projects', 'people');

foreach($custom_types as $type) {

    // Arhivă Postări Personalizate
    add_rewrite_rule(
        '^foo/'.$type.'/?$',
        'index.php?param=foo&post_type='.$type,
        'top'
        );

    // Postare Individuală Personalizată
    add_rewrite_rule(
        '^foo/'.$type.'/([^/]*)/?$',
        'index.php?param=foo&'.$type.'=$matches[1]',
        'top'
        );

}

Rewrite Analyzer, pe care Milo l-a menționat, a fost destul de util atunci când am încercat să înțeleg mai bine cum WordPress interoghează paginile/postările.

5 ian. 2017 17:51:59
Comentarii

Am întârziat la spectacol, dar te pot contacta pentru un alt exemplu? Te rog să ții cont că nu înțeleg deloc parametrul $tag al funcției add_rewrite_rule. Nu am nici cea mai mică idee ce înseamnă. De asemenea, nu înțeleg exemplul care folosește pagename=$matches[1]'. HUH??? Am o adresă URL de genul domain.com/detail?id=2&it=3. Vreau ca pagina să fie domain.com/detail/2-3/. Ești dispus să mă ajuți?

Debbie Kurth Debbie Kurth
10 nov. 2019 10:52:42