Cum să forțez programatic permalink-uri personalizate cu tema mea WordPress?
Dezvolt o temă personalizată. Este o temă foarte specializată care transformă WordPress într-o aplicație, mai degrabă decât un sistem CMS sau un blog. De exemplu, un Sistem de Programare pentru Cabinete Dentare (cu capabilități CMS și widget-uri).
Deoarece tema mea are nevoie de URL-uri frumoase pentru a funcționa corect, am nevoie ca fișierul .htaccess să fie cel implicit creat doar când cineva setează Permalink-urile la Personalizat (și apoi introduce ceva de genul %postname%). Cum pot declanșa acest lucru în WordPress, programatic, astfel încât să-l creeze? Adică, aș putea probabil să suprascriu fișierul manual în timpul activării temei, dar soluția mai bună ar fi să folosesc API-ul WordPress pentru asta.
/**
* Forțează permalink-urile personalizate la activarea temei
*/
function setup_custom_permalinks() {
global $wp_rewrite;
// Setează structura permalink-urilor la %postname%
$wp_rewrite->set_permalink_structure('/%postname%/');
// Actualizează regulile de rescriere
$wp_rewrite->flush_rules();
}
add_action('after_switch_theme', 'setup_custom_permalinks');
Acest cod ar trebui să fie plasat în fișierul functions.php al temei tale. Acțiunea 'after_switch_theme' este declanșată imediat după activarea temei.

Pentru a activa pe deplin permalink-urile, trebuie să te asiguri că fișierul .htaccess este creat. Pentru a face asta, trebuie să setezi o opțiune și să reîncarci regulile cu o valoare booleană.
global $wp_rewrite;
// Scrie regula
$wp_rewrite->set_permalink_structure('/%postname%/');
// Setează opțiunea
update_option( "rewrite_rules", FALSE );
// Reîncarcă regulile și instruiește să scrie în htaccess
$wp_rewrite->flush_rules( true );
Dacă folosești acest cod într-un plugin, acesta trebuie să fie în hook-ul init
, nu în hook-ul load
. Dacă este în hook-ul load
, va genera o eroare care spune că $wp_rewrite
este null.
Important: Ar trebui să adaugi și o condiție pentru a seta acest lucru o singură dată. (Poți crea o opțiune și să verifici dacă este setată, iar dacă nu, atunci rulezi acest cod pentru permalink și setezi acea opțiune)
De asemenea, verific de obicei dacă suntem în zona de administrare și rulez codul doar dacă este cazul.

Nu ar trebui să resetezi regulile de rescriere pe init
, niciodată. Este costisitor și încetinește semnificativ timpul de încărcare al paginii. Regulile de rescriere sunt salvate în baza de date, așa că resetarea lor pe init
înseamnă că vor fi multe interogări la baza de date pentru a resalva regulile de rescriere la fiecare încărcare de pagină

@PieterGoosen Citește restul răspunsului meu. Ceea ce fac este să verific dacă a fost setat și să îl setez o singură dată (deci când instalez prima dată plugin-ul) și nu se mai execută din nou. De asemenea, verific dacă este is_admin()
, dar acest lucru nu este necesar dacă rulează o singură dată.

Adaugă această informație în răspunsul tău. Este o informație importantă pe care răspunsul tău trebuie să o conțină pentru a fi mai acceptabil ;-)

function change_permalinks() {
global $wp_rewrite;
$wp_rewrite->set_permalink_structure('/%postname%/');
$wp_rewrite->flush_rules();
}
add_action('init', 'change_permalinks');
Poate nu vei avea nevoie de action hook dacă plasezi acest cod în funcția de activare a temei tale.
De asemenea, am descoperit că acest lucru funcționează doar parțial. Tot trebuie să accesezi pagina de setări Permalinks pentru ca fișierul .htaccess să fie creat. Deci, ce poți face? Am descoperit că pot folosi un IFRAME care încarcă automat acea pagină din panoul de opțiuni al temei mele, iar apoi va crea fișierul .htaccess pentru mine.
<iframe style="position:absolute;top:-5000px" src="<?= site_url() ?>/wp-admin/options-permalink.php"></iframe>

Apelarea funcției flush_rules în cadrul acțiunii init este o idee foarte proastă. Ar putea fi acceptabilă într-o funcție de activare sau instalare, dar nu în init.

Știu că acest lucru este vechi, dar poți obține rescrierea fișierului ".htaccess" prin modificarea regulilor de flush în acest fel: update_option( "rewrite_rules", FALSE ); $wp_rewrite->flush_rules( true );
Acest lucru va rescrie fișierul ".htaccess".

@DonRhummy te rog postează-l ca răspuns și îl voi marca drept noul răspuns corect.

Așa folosesc acest lucru, astfel încât să se întâmple doar atunci când tema mea este activată și numai dacă nu există o setare preexistentă salvată (pentru a nu strica ceva făcut înainte ca tema mea să fie folosită).
/*
* Setează structura de permalinkuri la activarea temei
*/
function set_custom_permalinks() {
$current_setting = get_option('permalink_structure');
// Întrerupe dacă există deja o setare salvată
if($current_setting) {
return;
}
// Salvează permalinkurile cu o structură personalizată, forțează crearea fișierului de reguli
global $wp_rewrite;
update_option("rewrite_rules", FALSE);
$wp_rewrite->set_permalink_structure('/stiri/%postname%/');
$wp_rewrite->flush_rules(true);
}
add_action('after_switch_theme', 'set_custom_permalinks');
Avantajul acestei metode este că va rula o singură dată la activarea temei, nu de fiecare dată când WordPress este încărcat la vizitarea site-ului.
