web-dev-qa-db-fra.com

Réécriture d'URL via Wordpress Rewrite ou .htaccess

SAUTEZ À EDIT8 POUR VOIR COMMENT j'ai résolu ce problème


Disons que j'ai un blog Wordpress: www.animals.com. J'ai un certain fichier PHP dans mon répertoire de thème: www.animals.com/wp-content/themes/mytheme/db.php. De plus, j'ai un modèle personnalisé pour cette page, je crée donc une nouvelle page dans le panneau d'administration Wordpress pour afficher db.php: www.animals.com/database.

Donc, si je veux lire quelque chose sur les lions, je vais juste à: www.animals.com/database/?animal=lion (parce que j’ai décidé d’écrire le PHP, en insérant la valeur de $ _GET ['animal'] dans la requête, en utilisant PDO, etc.).

Maintenant, je voudrais accéder à www.animals.com/database/?animal=lion en tant que www.animals.com/lion.

Devrais-je utiliser .htaccess ou Wordpress Rewrite? Où dois-je placer mon fichier .htaccess, à la racine du dossier Wordpress (avec wp-config.php et ces fichiers) ou dans mon répertoire de thèmes?

Celui de la racine a RewriteBase / et des éléments de Wordpress par défaut. Que devrais-je écrire pour réaliser ce que je veux? Dois-je le mettre avant ou après le code existant?

EDIT: ceci est mon public_html .htaccess et voici ce que je vraiment veux faire: J'ai un site Web: www.domain.com et lorsque vous tapez ce http://www.domain.com/dios/?dios=agni il vous montre l'info sur le dieu Agni. Je voudrais taper www.domain.com/dioses/agni pour accéder aux informations sur le dieu Agni. Le fichier PHP est en www.domain.com/wp-content/themes/smitespain/dios.php Cela ne fonctionne pas x_x

# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^dioses/(\w*)$ dios/?dios=$1 [NC,L]
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>

# END WordPress

EDIT2 : j'utilise multisite (cochez EDIT4) , et encore,/database// dios/et/dioses/sont pas les dossiers que j'ai créés, c'est le nom de la page J'ai créé dans Wordpress. Le problème est que, maintenant, le nom du dieu apparaît dans le titre de l’onglet: S, cela signifie que la variable $ _GET ['dios'] est définie, mais elle ne charge pas le fichier (dios.php) = /

EDIT3 : Je dois accéder à domain.com/dios/?dios=agni spécifiquement, car c’est l’URL qui permettra au fichier PHP (dios.php) de charger get_header () à partir de wordpress. donc je ne peux pas accéder directement au fichier

EDIT4 : J'ai décidé de supprimer le multisite

EDIT5 : ce sont les pages Wordpress que j'ai: domain.com/dioses/ pour (www.domain.com/wp-content/themes/smitespain/dioses.php)
domain.com/dios/?dios=thor pour (www.domain.com/wp-content/themes/smitespain/dios.php)

EDIT6 : Je lisais quelque chose dans le codex wordpress ... et j'ai réalisé que, si je veux aller à domain.com/dioses, je peux y accéder en allant à domain.com/index.php?pagename=dioses ou domain.com/?pagename=dioses
J'ai donc ajouté ceci entre le Rewritebase / et la règle suivante: RewriteRule example/test ?pagename=dioses et domain.com/example/test me redirigent vers domain.com/dioses, mais cela modifie également l'URL dans la barre d'adresse :(
Le problème, c’est que, si j’essaie ceci: RewriteRule example/test ?pagename=dios&dios=thor il m’enverra à la page 'dios' sans le '? Dios = thor'

EDIT7 : J'ai commencé à utiliser WordPress Rewrite, j'ai ajouté ceci au fichier functions.php de mon thème:

function my_rewrite_rules() {  
    add_rewrite_rule(  
        'blah',
        'index.php?pagename=dios&dios=agni',  
        'top'  
    );  
}  
add_action( 'init', 'my_rewrite_rules' );

et encore..il charge la page dios, sans le? dios = agni

EDIT8 : et enfin, j'ai réussi à le faire fonctionner =)
La première chose que je devais savoir, c'est que le nouveau ?dios=XXXX ne sera plus disponible pour $_GET['dios'] à la place, vous devez appeler $wp_query->query_vars['dios'] afin que je l'ajoute à functions.php de mon thème.

function add_query_vars($new_var) {
$new_var[] = "dios";
return $new_var;
}
add_filter('query_vars', 'add_query_vars');

function add_rewrite_rules($rules) {
$new_rules = array('([^/]+)' => 'index.php?pagename=dios&dios=$matches[1]');
$rules = $new_rules + $rules;
return $rules;
}
add_filter('rewrite_rules_array', 'add_rewrite_rules');

je m'assure que $wp_query->query_vars['dios'] est effectivement défini
alors j'ajoute simplement la règle normale

12
johnRivs

Il y a une autre façon de le résoudre, sans toucher à WordPress.

Ajouter à .htaccess 

RewriteRule ^lion /indexw.php?pagename=db&dios=$1 [L,E=URI:/detail/]

Créez le fichier indexw.php:

<?php $_SERVER["REQUEST_URI"] = $_SERVER["REDIRECT_URI"]; include("index.php");

Comment ça marche? mod_rewrite définit REDIRECT_URI comme spécifié dans E = URI: argument de valeur. indexw.php écrase simplement REQUEST_URI avec la valeur correcte (Merci à Ravi Thapliyal pour un aperçu de cela)

3
huksley

WordPress place une redirection globale à la racine pour tout ce qui n’est pas identifié, c’est-à-dire pas un fichier existant ni un dossier dans son /index.php. Vous voulez maintenant les rediriger vers ?animal=unidentified. Donc, à moins que la liste des mots clés relatifs aux animaux ne soit corrigée, toute solution proposée pourrait gâcher votre WordPress.

Si vous aviez environ 10 animaux, vous pouvez les ajouter comme suit à votre .htaccess (à la racine /)

RewriteEngine on
RewriteBase /

RewriteRule ^(lion|leopard|tiger|dog|cat)/?$ database/?animal=$1 [NC,L]

# WordPress rules come here

Pour une quarantaine d’animaux, je vous conseillerais d’avoir un préfixe de répertoire (n’existe pas) pour vos animaux.

RewriteRule ^a/(.+?)/?$ database/?animal=$1 [NC,L]

Cela redirigerait tout /a/critter vers database/?animal=critter et vous n'aurez plus besoin de les ajouter manuellement à votre .htaccess. Vous pouvez également faire coexister les deux règles afin que, si vous n'avez pas encore modifié .htaccess pour /panther, vous puissiez toujours y accéder à /a/panther.

EDIT:
Bien, j’ai examiné la question et il n’est pas possible d’écrire un script PHP pour intercepter cette requête et la transférer au index.php. Voici comment fonctionne le mutisite: depuis, aucune de vos réécritures ne correspond, il passe à index.php; le point d'entrée pour le code php de WordPress. Quelque part, le code vérifie l'en-tête REQUEST_URI pour voir s'il correspond à l'un de vos multisites (/dios) et, le cas échéant, transmet la demande à la page configurée (dios.php).

Lorsque nous effectuons une redirection .htaccess pour /dioses/agni, nous sommes en mesure d'appuyer sur index.php (en supprimant le [L]), mais l'en-tête REQUEST_URI reste identique (/ dioses/agni) et aucun mulisite n'est configuré pour cela. Par conséquent, la redirection échoue.

1
Ravi Thapliyal
RewriteEngine On
RewriteCond %{QUERY_STRING}  ^$
RewriteRule ^www\.animals\.com/lion$ /www.animals.com/database/?animal=lion [R=301,NE,NC,L]

Il suffit d'utiliser ce code. J'espère que ça va marcher.

1
Arafin Rubab