Vous n'êtes pas identifié.
Annonce
Mettez-vous à jour ! WordPress 3.5.1 est disponible en français.
Annonce 1 : Le Codex en français a besoin de vous pour avancer !
Annonce 2 : Avant de poster, n'oubliez pas de faire une petite recherche et de lire les règles de ce forum.
Annonce 3 : Lisez notre blog, il regorge de bonnes informations.
Annonce 4 : Rejoignez-nous sur Facebook, Google + et sur Twitter
#1 26-06-2012 11:08:25
- Theo_wp
- Membre WP
- Date d'inscription: 26-06-2012
- Messages: 8
url rewriting - parametres get
Bonjour,
Ma configuration WP actuelle
- Version de WordPress :
3.4
- Version de PHP/MySQL :
5
- Thème utilisé :
personnalisé
- Extensions en place :
Contact Form 7 - NextGEN Gallery - Really Simple CAPTCHA - TinyMCE Advanced - Ultimate Taxonomy Manager - wpml
- Nom de l'hebergeur :
ovh
Problème(s) rencontré(s) :
Bonjour,
J'ai une page wordpress que j'ai nommé 'animations' à laquelle je rajoute un paramètre id
Je me retrouve donc avec des url de types www.example.com/animations/?id=4
Je souhaiterai obtenir des url sous la forme www.example.com/animations/animation-4.hmtl
J'ai donc rajouté une règle dans mon htaccess mais cela ne fonctionne pas :
RewriteRule ^/animations/animation-([0-9]+).html /animations/?id=$1 [L]
Merci d'avance!
Hors ligne
#2 26-06-2012 12:04:15
- neopac
- Membre WP
- Date d'inscription: 10-11-2011
- Messages: 8
Re: url rewriting - parametres get
Bonjour,
Tout d'abord, il me semble qu'il est déconseillé de modifier le .htaccess pour ce genre de chose.
La team wordpress à mise en place un système de réécriture d'URL via des functions.
Voici quelques lien autre que le codex : http://wp.tutsplus.com/tutorials/creati … he-basics/
http://wp.tutsplus.com/tutorials/creati … axonomies/
Codex "add rewrite rule" > http://codex.wordpress.org/Rewrite_API/add_rewrite_rule
Un exemple pour être plus concret :
Code: html
add_action( 'init', 'my_rewrite_rule' );
function my_rewrite_rule()
{
global
$wp,$wp_rewrite;
// Remember to flush the rules once manually after you added this code!
add_rewrite_rule(
// The regex to match the incoming URL
'[a-z0-9-]+/([a-z0-9-]+)/?',
// The resulting internal URL: `index.php` because we still use WordPress
// `pagename` because we use this WordPress page
// `designer_slug` because we assign the first captured regex part to this variable
'index.php?pagename=animations&ton_param=$matches[1]',
// This is a rather specific URL, so we add it to the top of the list
// Otherwise, the "catch-all" rules at the bottom (for pages and attachments) will "win"
'top' );
//Fonction à commenter une fois que les régles on étaient mise en cache ;)
$wp_rewrite->flush_rules();
}
add_filter( 'query_vars', 'my_query_vars' );
function my_query_vars( $query_vars )
{
$query_vars['mon_param'] = 'ton_param'; //FIRST name on param
return $query_vars;
}
Dans pagename tu peux fixer le nom ou rechercher le nom de la page via la fonciton get_page($id)
pour plus de fléxibilité !
Pour la regex, à toi de faire quelques choses qui va te permettre de retrouver à coup sur ta page animation.
'animations/?id([0-9]+)/? devrais marcher que dans le cas de la page animation !
Ensuite dans ta loop ou ta page que où tu veux utiliser ton param GET/POST ...
Tu fais :
Code: html
global $wp;
//Tu peux faire un echo $wp->query_vars pour voir ce qu'il contient ;)
$id_animation = $wp->query_vars['mon_param'];
Hors ligne
#3 26-06-2012 15:01:34
- Theo_wp
- Membre WP
- Date d'inscription: 26-06-2012
- Messages: 8
Re: url rewriting - parametres get
Bonjour,
Merci pour ces pistes de réflexion, ça a l'air bien plus propre que d'attaquer le .htaccess
L'exemple de regex correspond à ce que je recherche, cette règle ne s'appliquera que sur la page animations.
Pourtant quand je rajoute ce code à mon fichier function.php, l'url reste la même :
add_action( 'init', 'my_rewrite_rule' );
function my_rewrite_rule()
{
global
$wp,$wp_rewrite;
// Remember to flush the rules once manually after you added this code!
add_rewrite_rule(
// The regex to match the incoming URL
'animations/([0-9]+)/?$',
// The resulting internal URL: `index.php` because we still use WordPress
// `pagename` because we use this WordPress page
// `designer_slug` because we assign the first captured regex part to this variable
'index.php?pagename=animations&evt=$matches[1]',
// This is a rather specific URL, so we add it to the top of the list
// Otherwise, the "catch-all" rules at the bottom (for pages and attachments) will "win"
'top' );
//Fonction à commenter une fois que les régles on étaient mise en cache 
$wp_rewrite->flush_rules();
}
Voilà ce que je trouve en utilisant un outil comme Rewrite analyzer :
animations/([0-9]+)/?$
pagename: animations
evt: ([0-9]+)
Hors ligne
#4 26-06-2012 17:03:31
- Theo_wp
- Membre WP
- Date d'inscription: 26-06-2012
- Messages: 8
Re: url rewriting - parametres get
Petite précision :
Je ne retrouve ma règle dans Rewrite analyzer que si je ne commente pas "$wp_rewrite->flush_rules();"
Merci d'avance,
Hors ligne
#5 27-06-2012 10:36:09
- Theo_wp
- Membre WP
- Date d'inscription: 26-06-2012
- Messages: 8
Re: url rewriting - parametres get
Bonjour,
petite question afin de vérifier que 'add_rewrite_rule' fonctionne réellement :
Si je souhaite modifier ma page http://www.example.com/animations/ sans gérer les variables pour le moment, je devrais retrouver une page http://www.example.com/mapagedetest/ avec la fonction suivante?
Code: html
add_rewrite_rule('mapagedetest/', 'index.php?pagename=animations', 'top');
Pourtant rien se passe alors que http://www.cgr.myartgomedia.com/?pagename=animations m'affiche bien la page animations
Merci!
Hors ligne
#6 27-06-2012 11:38:52
- Theo_wp
- Membre WP
- Date d'inscription: 26-06-2012
- Messages: 8
Re: url rewriting - parametres get
En fait la solution de neopac est correcte :-) je me débrouillais mal dans mes tests!
J'ai donc dans mon fichier functions.php :
Code: html
add_action( 'init', 'my_rewrite_rule' );
function my_rewrite_rule()
{
global
$wp,$wp_rewrite;
add_rewrite_rule('animations/([0-9]+)/?', 'index.php?pagename=animations&evt=$matches[1]', 'top');
$wp_rewrite->flush_rules();
}
add_filter( 'query_vars', 'my_query_vars' );
function my_query_vars( $query_vars )
{
$query_vars['mon_param'] = 'evt'; //FIRST name on param
return $query_vars;
}
Un dernier souci, cela ne fonctionne que si je laisse '$wp_rewrite->flush_rules();' à chaque fois!
Hors ligne
#7 27-06-2012 11:55:42
- neopac
- Membre WP
- Date d'inscription: 10-11-2011
- Messages: 8
Re: url rewriting - parametres get
Bonjour,
Il te manquait le filtre query_var ?
J'avoue que je suis pas trop expert, j'ai testé les rewrites rules il y à une semaine à peine... ^^ !
Pour le flush_rules, en faite, si j'ai bien compris cela stocke en cache les règles. Tu dois juste visiter ton site (en gros faire fonctionner les règles et ensuite elles doivent se mettre en cache.. tu peux commenter la ligne)
ça devrait fonctionner (j'avoue que sur le site en prod. j'ai laissé le flush_rewrite)
J'ai vu dans la DB que wordpress, stocke dans la table options les règles mais je ne sais pas ce qu'il en fait exactement... !
Hors ligne
#8 27-06-2012 12:04:02
- Guy
- Blogueur
- Date d'inscription: 07-04-2011
- Messages: 14206
Re: url rewriting - parametres get
Etant donné que tu réécris tes règles à chaque init, cela me parait normal de les réenregistrer, tu devrais peut être ne créer ta règle (et le flush qui va avec) qu'à l’activation du thème ou du plugin.
En ligne
#9 27-06-2012 15:50:18
- Theo_wp
- Membre WP
- Date d'inscription: 26-06-2012
- Messages: 8
Re: url rewriting - parametres get
@neopac : je faisais mes tests en utilisant un mauvais nom d'identifiant......
@Guy : Ok, je commence à mieux comprendre le principe des init
Et oui réécrire la règle ne pose pas de soucis mais ce n'est pas très propre!
Je me lance donc pour détecter l'activation du thème mais cela n'a pas l'air de fonctionner
Code: html
function flush_rules_on_activation() {
global $wp,$wp_rewrite;
$is_installed = get_option('theme_installed');
if(!$is_installed) {
add_rewrite_rule('animations/([0-9]+)/?', 'index.php?pagename=animations&evt=$matches[1]', 'top');
$wp_rewrite->flush_rules();
add_option('theme_installed', true);
}
}
add_action( 'init', 'flush_rules_on_activation' );
Hors ligne
#10 27-06-2012 16:17:28
- Guy
- Blogueur
- Date d'inscription: 07-04-2011
- Messages: 14206
Re: url rewriting - parametres get
Dans le codex, pour détecter l'activation du thème, ils mettent cela comme exemple : http://codex.wordpress.org/Function_Ref … rite_rules
Code: html
<?php
add_action( 'load-themes.php', 'frosty_flush_rewrite_rules' );
/* Flush your rewrite rules */
function frosty_flush_rewrite_rules() {
global $pagenow, $wp_rewrite;
if ( 'themes.php' == $pagenow && isset( $_GET['activated'] ) )
$wp_rewrite->flush_rules();
}
?>
Je n'ai jamais eu besoin de tester l'activation d'un thème, donc je ne sais pas, je crains que cela ne couvre pas tous les cas, mais c'est juste une crainte sans fondements réels et argumentés.
En ligne
#11 28-06-2012 10:02:50
- neopac
- Membre WP
- Date d'inscription: 10-11-2011
- Messages: 8
Re: url rewriting - parametres get
Perso, pour avor un hook à l'activation/désactivation de mon thème j'utilise se code là :
(Que je mets dans un fichier php que j'inclus dans functions.php)
Code: html
<?php
/**
* Provides activation/deactivation hook for wordpress theme.
*
* Usage:
* ----------------------------------------------
* Include this file before this line.
* ----------------------------------------------
* function my_theme_activate() {
* // code to execute on theme activation
* }
* wp_register_theme_activation_hook('mytheme', 'my_theme_activate');
*
* function my_theme_deactivate() {
* // code to execute on theme deactivation
* }
* wp_register_theme_deactivation_hook('mytheme', 'my_theme_deactivate');
* ----------------------------------------------
*
* @author Krishna Kant Sharma (http://www.krishnakantsharma.com)
*/
/**
*
* @desc registers a theme activation hook
* @param string $code : Code of the theme. This can be the base folder of your theme. Eg if your theme is in folder 'mytheme' then code will be 'mytheme'
* @param callback $function : Function to call when theme gets activated.
*/
function wp_register_theme_activation_hook($code, $function) {
$optionKey="theme_is_activated_" . $code;
if(!get_option($optionKey)) {
call_user_func($function);
update_option($optionKey , 1);
}
}
/**
* @desc registers deactivation hook
* @param string $code : Code of the theme. This must match the value you provided in wp_register_theme_activation_hook function as $code
* @param callback $function : Function to call when theme gets deactivated.
*/
function wp_register_theme_deactivation_hook($code, $function) {
// store function in code specific global
$GLOBALS["wp_register_theme_deactivation_hook_function" . $code]=$function;
// create a runtime function which will delete the option set while activation of this theme and will call deactivation function provided in $function
$fn=create_function('$theme', ' call_user_func($GLOBALS["wp_register_theme_deactivation_hook_function' . $code . '"]); delete_option("theme_is_activated_' . $code. '");');
// add above created function to switch_theme action hook. This hook gets called when admin changes the theme.
// Due to wordpress core implementation this hook can only be received by currently active theme (which is going to be deactivated as admin has chosen another one.
// Your theme can perceive this hook as a deactivation hook.)
add_action("switch_theme", $fn);
}
?>
Et que j'appel comme ça :
Code: html
wp_register_theme_activation_hook('NOM_DU_THEME', 'my_theme_activate'); // Hooks pour l'activation du thème
function my_theme_activate() {
// code to execute on theme activation
}
Hors ligne
#12 28-06-2012 10:41:41
- Theo_wp
- Membre WP
- Date d'inscription: 26-06-2012
- Messages: 8
Re: url rewriting - parametres get
Bon je ne réussi pas à détecter l'activation du thème...
Je tente donc de passer par un plugin, mais j'ai une question : est ce que le code des plugins est lu à chaque fois, c'est a dire dois je détecter l'activation du plugin avant de donner ma règle?
ci dessous le code du plugin (qui fonctionne)
Code: html
<?php
/*
Plugin Name: Rewrite url
Description: Réécriture des urls
Version: 1.0
*/
add_action( 'init', 'my_rewrite_rule' );
function my_rewrite_rule()
{
global
$wp,$wp_rewrite;
add_rewrite_rule('animations/([0-9]+)/?', 'index.php?pagename=animations&evt=$matches[1]', 'top');
$wp_rewrite->flush_rules();
}
?>
Hors ligne
#13 02-07-2012 15:25:01
- neopac
- Membre WP
- Date d'inscription: 10-11-2011
- Messages: 8
Re: url rewriting - parametres get
Theo_wp as tu regardé du côté de mon wp-activate ?
Hors ligne
#14 02-07-2012 15:55:29
- Theo_wp
- Membre WP
- Date d'inscription: 26-06-2012
- Messages: 8
Re: url rewriting - parametres get
Je viens de re regarder et je me suis interressé à la ligne "theme_is_activated_" et j'ai découvert "after_setup_theme" à la place du "init"
J'ai donc ceci qui fonctionne :
Code: html
add_action( 'after_setup_theme', 'my_rewrite_rule' );
function my_rewrite_rule()
{
global
$wp,$wp_rewrite;
add_rewrite_rule('animations/([0-9]+)/?', 'index.php?pagename=animations&evt=$matches[1]', 'top');
$wp_rewrite->flush_rules();
}
Hors ligne