Cum pot crea rute URL personalizate?
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?

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.

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

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

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

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

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

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.

@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
?

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);

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

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

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