WordPressin ulkopuolisten rewrite-sääntöjen lisääminen .htaccessiin

käyttäjältä Mikko Saari - 16.3.2010

Tarvitaan muutama koodinpätkä, jotta WordPressiin saa lisättyä omia rewrite-sääntöjä. Homma käy WordPressin WP_Rewrite-luokalla varsin sutjakkaasti ja nuo Codexin ohjeet ovat varsin kattavat, mutta lopussa oleva Non-WordPress rewrite rules jättää yksityiskohdissa toivomisen varaa. Tarkemmalla setvimisellä kävi ilmi, ettei homma ihan helposti käykään, matkassa on jokunen mutka. Tämä onkin juuri sensorttinen juttu, joita varten oikeastaan blogin perustin, eli kirjataanpa prosessi tähän sitä varten, jos ohjeita joskus itse tarvitsen ja siinä toivossa, että joku muukin näistä hyötyy.

Näitä virityksiä on testattu versioilla 2.9.1 ja 2.9.2.

Sijoita tässä esitelty koodi vaikkapa teeman functions.php-tiedostoon tai kääräise ne omaksi pluginikseen.

function oma_register_rewrites($wp_rewrite) {
    $pattern = $pattern . "omaavainsana";
    $non_wp_rules = array($pattern => "link");
    $wp_rewrite->non_wp_rules = $non_wp_rules + $wp_rewrite->non_wp_rules;
}

Tämä funktio luo korvaussäännöt. Funktion toiminta riippuu siitä, millä tavalla uudelleenohjauksia tuotat. Omassa käytössäni haen tietokannasta dataa, jota pyöritän foreach-silmukalla läpi ja lisäilen yksi kerrallaan $non_wp_rules-taulukkoon. $pattern on polku, jonka haluat ohjata muualle ja “link” on osoite, johon ohjataan. Siis esimerkiksi array(“mene/googleen” => “http://www.google.fi/”) ohjaisi osoitteen /mene/googleen Googlen sivuille.

Tässä tärkeää on, että jokaisen polun perään liitetään tuo “omaavainsana”-tunniste, eli ylläoleva esimerkki rekisteröisi tässä vaiheessa polun “mene/googleenomaavainsana”.

Nämä omat ohjaukset toimivat, koska WordPress kirjoittaa ne .htaccess-tiedostoon omien ohjauksiensa lisäksi. Jotta muutokset kirjoitetaan tiedostoon, tarvitaanflush_rules()-komentoa. Tehdään siis sitä varten oma funktio:

function oma_flush_rewrites() {
	global $wp_rewrite;
	$wp_rewrite->flush_rules();
}

Lopuksi tarvitaan hieman lisäpotkua:

function oma_mod($rules) {
	$rules = preg_replace('/^(RewriteRule \^.*)omaavainsana (\/)(.*) (\[QSA,L\])$/im', '\1 \3 [R=301,L]', $rules);
	return $rules;
}

Tämä on se viimeinen niksi, jota varten se omaavainsana sinne lisättiin. Oletuksena WordPressin rewritet kun eivät toimi mitenkään erityisen fiksusti. Ne olettavat, että ohjauksen kohde on blogin sisäinen osoite, joten alkuun heitetään turha kauttaviiva ja ohjaus on [QSA]-tyyppiä, eikä siisti 301-ohjaus. Tämä regex on Adding mod_rewrite rules to .htaccess in Wordpress -blogimerkinnästä bongattu ja paikkaa tilanteen. Omaavainsana-koodisanaa tarvitaan, jotta koodi ei muokkaa sellaisia edelleenohjauksia, joita ei ole tarpeen muokata.

add_filter('generate_rewrite_rules', 'oma_register_rewrites');
add_action('admin_init', 'oma_flush_rewrites');
add_filter('mod_rewrite_rules', 'oma_mod');

Jotta oheiset funktiot tekisivät jotain, niitä pitää kutsua. Lisää siis vielä nämä toiminnot, niin jo alkaa potkia. Näillä asetuksilla .htaccess päivittyy joka kerta, kun avaat jonkun sivun ylläpitopuolella. Jos jätät tuon add_action-rivin pois, .htaccess ei päivity itsestään vaan ainoastaan silloin, kun käyt tallentamassa permalinkkiasetukset. Tämä voi olla ihan hyvä vaihtoehto, jos edelleenohjauksia ei ole tarpeen muuttaa kovin tiuhaan.

Jätä kommentti

Edellinen merkintä:

Seuraava merkintä:

Uusimmat jutut