Cum pot crea rute URL personalizate?

20 aug. 2011, 01:24:08
Vizualizări: 123K
Voturi: 70

Am o cerință foarte specifică, dar sper că o pot explica fără a fi prea confuz. Am creat un șablon de pagină unde listez proprietăți pe care le obțin dintr-un fișier XML extern. Până acum fără probleme, și să zicem că URL-ul arată așa:

http://www.example.com/properties/

Fiecare proprietate are un link care ar trebui să redirecționeze utilizatorul către o pagină "Proprietate Individuală" care afișează mai multe informații despre aceasta. Mă întrebam dacă există o modalitate de a face link-ul să arate așa:

http://www.example.com/properties/123

Unde 123 ar fi id-ul proprietății. Deci dacă am URL-ul de forma properties/some_id vreau să pot încărca un fișier de vizualizare (precum fișierele single.php sau page.php), dar specific pentru această condiție URL.

Este posibil acest lucru?

0
Toate răspunsurile la întrebare 2
10
86

Adăugați acest cod în functions.php al temei dumneavoastră, sau includeți-l într-un plugin.

add_action( 'init', 'wpse26388_rewrites_init' );
function wpse26388_rewrites_init(){
    add_rewrite_rule(
        'properties/([0-9]+)/?$',
        'index.php?pagename=properties&property_id=$matches[1]',
        'top' );
}

add_filter( 'query_vars', 'wpse26388_query_vars' );
function wpse26388_query_vars( $query_vars ){
    $query_vars[] = 'property_id';
    return $query_vars;
}

Acest cod adaugă o regulă de rescriere care direcționează cererile către /properties/ urmate de orice combinație de numere către pagina cu numele properties, cu variabila de interogare property_id setată. Asigurați-vă că vizitați pagina de setări a legăturilor permanente și salvați pentru a reîncărca regulile de rescriere, astfel încât această nouă regulă să fie inclusă.

În șablonul page-properties.php, get_query_var('property_id') va returna ID-ul proprietății dacă acesta a fost setat; dacă nu, va afișa pagina implicită de proprietăți.

20 aug. 2011 02:44:23
Comentarii

Aceasta a fost APROAPE funcțională pentru mine, dar a trebuit să adaug: add_filter('init','flushRules');
function flushRules(){ global $wp_rewrite; $wp_rewrite->flush_rules(); }

tooshel tooshel
13 nov. 2012 19:52:34

@tooshel cu siguranță nu dorești să resetezi regulile la fiecare cerere, este o operațiune costisitoare și va încetini considerabil site-ul. trebuie să resetezi regulile doar o singură dată, la activarea plugin-ului sau pur și simplu vizitând pagina de setări pentru legături permanente.

Milo Milo
13 nov. 2012 22:17:06

Da, înțeleg asta... dar când testezi este util să o ai acolo!

tooshel tooshel
14 nov. 2012 22:32:02

O expresie regex mai inteligentă pentru rescrierea URL-ului ar putea fi ^properties/([0-9]+)/?. Altfel, ar putea potrivi ceva de genul example/properties/1

Ryan Taylor Ryan Taylor
12 dec. 2014 19:34:52

@RyanTaylor ești sigur de asta? nu capturează example/properties/1 când îl testez.

Milo Milo
12 dec. 2014 20:14:15

Care este locația fișierului page-properties.php? L-am pus în directorul pluginului. Este corect?

Farid Movsumov Farid Movsumov
30 iun. 2016 09:09:56

@FeridMovsumov fișierele de temă sunt întotdeauna încărcate din directorul temei active curente, decât dacă adăugați un filtru pentru a le încărca din altă parte.

Milo Milo
30 iun. 2016 18:52:36

Salut @Milo, acesta este un cod frumos. Știi cum să faci ca acesta să nu intre în conflict când folosești $paged = (get_query_var('paged')) ? get_query_var('paged') : 1; ? Funcția capturează $page (și îl lasă gol) și nu pot continua paginarea.

Jaypee Jaypee
8 aug. 2017 20:27:05

@Milo ce înțelegi prin pune-l într-un plugin. ? unde mai exact? Oriunde în plugin este posibil? sau în wp-content/plugins/myPlugin/myPlugin.php ?

SL5net SL5net
17 mai 2021 14:54:39

Filtrul query_vars pare să nu funcționeze (WP 5.7), aruncă o eroare: Warning: Invalid argument supplied for foreach() in wp/wp-includes/class-wp.php on line 296

jnaklaas jnaklaas
4 iul. 2021 19:13:44
Arată celelalte 5 comentarii
5
11

Un alt mod de a face acest lucru:

add_action('init', function() {
    add_rewrite_rule( '^proprietati/([0-9]+)/?',
                      'index.php?pagename=proprietati&property_id=$matches[1]',
                      'top' );
}, 10, 0);

add_action('init', function() {
    add_rewrite_tag( '%property_id%', '([^&]+)' );
}, 10, 0);

Codex API pentru Rescriere/adaugă regulă de rescriere

Codex API pentru Rescriere/adaugă etichetă de rescriere

21 mai 2017 12:24:24
Comentarii

Răspunsul acceptat funcționează cu 4.7 (și 4.8), nu sunt sigur de ce crezi că nu. Codul tău face în esență același lucru, add_rewrite_tag adaugă variabila de interogare în aceeași matrice ca și filtrul query_vars.

Milo Milo
7 iul. 2017 20:45:11

@Milo probabil nu a funcționat pentru mine, dar nu mai am o versiune 4.7 la îndemână, așa că nu pot verifica. Voi edita răspunsul meu.

Christian Lescuyer Christian Lescuyer
8 iul. 2017 10:28:30

@Milo Deși personal prefer eticheta de rescriere, tot am testat răspunsul acceptat și funcționează. Doar niște preferințe personale, totuși.

Johansson Johansson
8 iul. 2017 18:36:11

@JackJohansson rewrite tags sunt necesare atunci când le folosești într-un permastruct. Este doar un pic de date în plus pe care WordPress nu le folosește în acest caz.

Milo Milo
8 iul. 2017 18:47:38

ambele reguli pot fi adăugate în aceeași metodă, rezultând o funcție mai curată și mai utilă la care să te întorci și să înțelegi când lucrezi la mentenanță

eballeste eballeste
14 iul. 2018 18:51:40