Cum să forțez programatic permalink-uri personalizate cu tema mea WordPress?

13 dec. 2011, 05:01:37
Vizualizări: 17.9K
Voturi: 6

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.

2
Comentarii

"tema mea are nevoie de URL-uri frumoase pentru a funcționa corect" de ce?

chrisguitarguy chrisguitarguy
20 dec. 2011 22:40:42

@ChristopherDavis pentru că este o temă de aplicație, nu o temă obișnuită. Am un framework MVC încărcat în interiorul unui folder de temă care funcționează intens pe rewrite-uri.

Volomike Volomike
10 ian. 2012 03:49:23
Toate răspunsurile la întrebare 3
4

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.

22 oct. 2015 05:03:29
Comentarii

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ă

Pieter Goosen Pieter Goosen
22 oct. 2015 06:00:15

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

Don Rhummy Don Rhummy
22 oct. 2015 06:01:52

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

Pieter Goosen Pieter Goosen
22 oct. 2015 06:03:16

@PieterGoosen finalizat. (Deși deja îl aveam în răspunsul meu, cu excepția părții cu "is_admin()")

Don Rhummy Don Rhummy
22 oct. 2015 06:04:08
4
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>
20 dec. 2011 22:32:57
Comentarii

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.

Otto Otto
25 aug. 2012 15:15:59

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

Don Rhummy Don Rhummy
21 oct. 2015 22:23:35

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

Volomike Volomike
22 oct. 2015 04:57:38

@Volomike am adăugat răspunsul

Don Rhummy Don Rhummy
22 oct. 2015 05:04:06
0

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.

10 iul. 2020 22:29:33