Avatar billede thomashoeg Novice
29. oktober 2012 - 19:54 Der er 11 kommentarer

Wordpress URL rewriting

Hej,

Jeg har en dynamisk parameter URL i Wordpress som denne: http://minside.dk/vis-side/?parameter=1
Denne URL vil jeg gerne rewrite, således at jeg i stedet ender ud med sådan: http://minside.dk/vis-side/1

Faktisk er min situation ligesom denne: http://wordpress.stackexchange.com/questions/48487/how-to-retrieve-get-variables-from-rewritten-urls

Ergo har jeg altså umiddelbart det stykke kode der skal til, men jeg kan desværre ikke finde frem til - hvilken php-fil jeg skal indsætte i.

Håber nogen kan hjælpe?
Avatar billede thomashoeg Novice
29. oktober 2012 - 20:29 #1
Lige lidt ekstra info - som måske kan relevant.

Det er en Wordpress version 3.4.2, installeret med et Woothemes tema. Siden er http://minsol.dk.
Avatar billede alphabits Nybegynder
30. oktober 2012 - 08:09 #2
Du kan tilføje koden til dit themes functions.php fil. Som nævnt i svaret på stackexchange skal du kalde add_rewrite_tag og add_rewrite_rule ved init action, så et eller andet sted i dit temas functions.php fil tilføjer du:

add_action('init', 'minsol_add_rewrite_rules');
function minsol_add_rewrite_rules() {
    add_rewrite_tag('%parameter%', '([^&]+)');
    add_rewrite_rule('^vis-side/([0-9]{1,})/',
                    'index.php?p=<vis-side-id>&meter=$matches[1]');
}

Husk at erstatte <vis-side-id> med side id'en på den side der hedder vis-side.

Note: Hvis du ikke allerede har ændret i dit Woothemes tema, er det en god idé at lave et child theme, og så tilføje ovenstående stykke kode i dit child theme. På den måde ændre du ikke direkte i dit Woothemes tema. Det er dog kun vigtigt hvis du regner med at modtage opdateringer af dit Wootheme tema... Du kan læse om child themes her: http://codex.wordpress.org/Child_Themes
Avatar billede alphabits Nybegynder
30. oktober 2012 - 08:16 #3
Ok tror jeg fik fjollet lidt rundt i htmlformateringen. I den linje hvor der står

'index.php?p=<vis-side-id>&meter=$matches[1]');

skulle der stå

'index.php?p=<vis-side-id>&parameter=$matches[1]');
Avatar billede thomashoeg Novice
30. oktober 2012 - 20:48 #4
Mange tak for hjælpen.

Jeg har forsøgt, at gengive koden som du har angivet 1:1, men jeg har stadig udfordringer med at få det til at fungere korrekt.

Jeg har hul igennem til mit child themes functions.php idet at jeg kan kalde parameteren via
get_query_var('center');      (min parameter er angivet "center")
direkte i min page template.

Koden i min functions.php ser ud som følger:
<?php
    add_action('init', 'minsol_add_rewrite_rules');
function minsol_add_rewrite_rules() {
    add_rewrite_tag('%center%', '([^&]+)');
    add_rewrite_rule('^vis-solcenter/([0-9]{1,})/','index.php?p=152¢er=$matches[1]');
}
?>

Men som du kan se - gengiver denne side det korrekt:
http://minsol.dk/vis-solcenter/?center=675

Hvorimod denne ikke gør:
http://minsol.dk/vis-solcenter/675/
Avatar billede alphabits Nybegynder
30. oktober 2012 - 22:33 #5
Prøv at flushe alle rewrite rules. Det kan du gøre ved at gå ind på siden Settings > Permalinks i admin-delen af Wordpress. Det er nok at du loader siden Permalinks, du behøver ikke at gemme. Det lyder lidt mærkeligt, men den skulle være god nok: http://codex.wordpress.org/Settings_Permalinks_Screen

Hvis ikke det virker kan du prøve at udskrive alle rewrite rules ved at indsætte noget ala:

var_dump($wp_query->rules);


i en af dine templates. I det ekstra output kan du prøve at se om du kan finde din regel. Bemærk dog at dette outputter noget grim kode til siden, så du skal kun gøre det på en testversion af dit site....
Avatar billede alphabits Nybegynder
30. oktober 2012 - 22:35 #6
Ups, det er ikke $wp_query men $wp_rewrite, så du kan skrive

var_dump($wp_rewrite->rules);


i en af dine templates
Avatar billede thomashoeg Novice
31. oktober 2012 - 08:23 #7
Tak for input.

Havde i forvejen forsøgt med et flush, og har også prøvet igen med uden held.

Ud fra den var_dump jeg kørte - viste sig følgende rewrite:
["^vis-solcenter/([0-9]{1,})/"]=> string(34) "index.php?p=152¢er=$matches[1]"

Det ser umiddelbart ud som om den har ændret i min parameter.
Avatar billede thomashoeg Novice
31. oktober 2012 - 08:30 #8
Har også forsøgt, at ændre parametrens navn til "parameter" i stedet - men det giver igen lidt knas i outputtet på rewrite:
["^vis-solcenter/([0-9]{1,})/"]=> string(37) "index.php?p=152¶meter=$matches[1]"
Avatar billede alphabits Nybegynder
31. oktober 2012 - 08:42 #9
At det ser ud som om at dine parametrer ændrer sig, tror jeg ikke du skal bekymre dig om. Det skyldes at sekvensen &cent bliver til ¢ i htmlkode og &para bliver til ¶ i htmlkode. Hvis du vil se det rigtige output kan du vælge "Vis kilde" i din browser, og så søge på "$matches"

Ang. at din rewrite ikke virker, kan du prøve at tilføj 'top' til dit add_rewrite_rule kald og fjerne ^ fra starten af din regular expression, så

add_rewrite_rule('^vis-side/([0-9]{1,})/', 
                'index.php?p=152&center=$matches[1]');

bliver til

add_rewrite_rule('vis-side/([0-9]{1,})/?', 
                'index.php?p=152&center=$matches[1]',
                'top');


Husk at flushe dine rewrite regler efter ændringen.
Avatar billede alphabits Nybegynder
31. oktober 2012 - 08:47 #10
Hvis du gerne vil udskrive dine rewrite rules uden at skulle kigge i kildekoden, kan du erstatte

var_dump($wp_rewrite->rules);

med noget i retning af

foreach ($wp_rewrite->rules as $regex => $route) {
    echo $regex . " => " . htmlentities($route) . "<br/>";
}
Avatar billede thomashoeg Novice
31. oktober 2012 - 08:53 #11
Det vil åbentbart ikke lykkes for mig.

Jeg har nu ændret til:
add_rewrite_rule('vis-solcenter/([0-9]{1,})/?',
                'index.php?p=152&center=$matches[1]',
                'top');

Men nu redirecter:
http://minsol.dk/vis-solcenter/1/
til
http://minsol.dk/vis-solcenter/

Og jeg kan stadig tilgå siden via parametren:
http://minsol.dk/vis-solcenter/?center=1

Jeg har flushet rewrites.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester