2010-07-22 7 views
1

J'ai des liens dans mon site qui passent des requêtes aux pages qui demandent à partir d'une base de données externe. Cela fonctionne bien, par ex.Wordpress Custom URL Rewrites

mysite.com/catalog/?tl=flooring 

mais je veux réécrire cette URL pour apparaître comme

mysite.com/catalog/flooring 

Ive a essayé de modifier les règles de réécriture dans wordpress, mais il affiche toujours la page d'index

add_filter('rewrite_rules_array','wp_insertMyRewriteRules'); 
add_filter('query_vars','wp_insertMyRewriteQueryVars'); 
add_filter('init','flushRules'); 

// Remember to flush_rules() when adding rules 
function flushRules(){ 
    global $wp_rewrite; 
    $wp_rewrite->flush_rules(); 
} 

// Adding a new rule 
function wp_insertMyRewriteRules($rules) 
{ 
    $newrules = array(); 
    $newrules['(catalog)/([a-zA-Z0-9 ]+)$'] = '/catalog/?tl=$matches[2]'; 
    return $newrules + $rules; 
} 

// Adding the id var so that WP recognizes it 
function wp_insertMyRewriteQueryVars($vars) 
{ 
    array_push($vars, 'id'); 
    return $vars; 
} 

Répondre

7

règles Réécrire dans WordPress ne fonctionne pas comme la façon dont vous les attendez. Toutes les règles de réécriture correspondent à un gestionnaire de fichiers (presque toujours index.php), pas une autre URL.

Voici un exemple de code raccourci;

$rules['catalog/(.*)/?'] = 'index.php?pagename=catalog&tl=$matches[1]'; 
array_push($query_vars, 'tl'); // note query var should match your query string 

Ceci carte catalog/whatever à la page WordPress 'catalogue', et transmettre la requête var 'tl'. Vous pouvez créer un modèle de page pour 'catalogue', puis ramasser la valeur de 'tl' en utilisant get_query_var('tl').

Évitez également d'utiliser des variables de requête comme id - utilisez quelque chose de plus unique (comme 'tl') pour éviter les conflits avec WordPress.

Et ne pas vider les règles sur chaque init! C'est une mauvaise pratique, et écrira à .htaccess et appellera des mises à jour de base de données sur chaque chargement de page de! WordPress videra toujours les permaliens chaque fois que vous mettez à jour un message ou votre structure permalien (il vous suffit de mettre à jour vos permaliens lorsque vous modifiez votre code).

+0

serait-il possible de rediriger vers une page enfant? J'ai mis le nom de poste dans pagename, mais il redirige réellement la page. –

+3

S'il s'agit d'une page enfant, 'pagename' devrait être le chemin ** slug ** - par exemple' pagename = parentname/childname' – TheDeadMedic

2

This article over at Raazorlight va dans un peu plus de détails sur le processus de saisie de querystrings et de réécriture d'URL dans WP.

Vérifiez également les commentaires pour savoir pourquoi appeler flushRules() peut ne pas être nécessaire si vous réenregistrez des permaliens. En option, flushRules() peut être appelée une seule fois lors du rappel d'activation du plug-in. Creuser plus profond, commenter 'pmdci' liens vers un poste/saga instructif sur le sujet connexe passer une requête à un type de message personnalisé en utilisant une taxonomie personnalisée.