J'ai ce formulaire:
<form action="<?php the permalink(); ?>" method="get" >
<input type="hidden" name="taxo" value="question" />
<select name = "cata">
<option value='unique_name-a'>xxx</option>
<option value='foo'>yyy</option>
<option value='bar'>zzz</option>
</select>
<select name ="catb">
<option value='unique_name-d'>xxx</option>
<option value='unique_name-e'>yyy</option>
<option value='unique_name-f'>zzz</option>
</select>
<!-- and more select -->
<button>send</button>
</form>
Et cette requête dans une page de modèle:
$query = new WP_Query( array(
'post_type' => 'page',
'tax_query' => array(
'relation' => 'AND',
array(
'taxonomy' => 'question', // from $_GET['taxo']
'field' => 'slug',
'terms' => array('unique_name-a','unique_name-e','more'), // from my submit form
'include_children' => false,
'operator' => 'AND'
),
)
) );
Je voudrais jouer avec la réécriture d'URL. J'ai quelque chose comme:
http://example.com/?taxo=question&cata=foo&catb=bar&catc=more
J'aimerais que l'URL réécrite pour la requête ci-dessus soit:
http://example.com/questions/cata/foo/catb/bar/catc/…/
EDIT: Pourquoi cette fonction ne fonctionne pas?
function custom_rewrite() {
add_rewrite_rule(
'question-tax/test/4/',
'index.php?tax=question&test=4',
'top'
);
}
// refresh/flush permalinks in the dashboard if this is changed in any way
add_action( 'init', 'custom_rewrite' );
Vous pouvez essayer d’utiliser la fonction add_rewrite_endpoint , ce qui vous permettrait d’éviter toute modification de htaccess (sauf si vous avez besoin de $ _GET).
Exemple:
function add_custom_rewrite_ep() {
add_rewrite_endpoint('cata', EP_PAGES);
add_rewrite_endpoint('catb', EP_PAGES);
add_rewrite_endpoint('catc', EP_PAGES);
}
add_action( 'init', 'add_custom_rewrite_ep' );
Assurez-vous de vider vos règles de réécriture.
Donc, si votre URL est /questions/cata/foo/catb/bar/catc/more/
, vous pouvez accéder aux valeurs avec get_query_var
comme suit:
$x = get_query_var('cata','default'); // equals 'foo'
$y = get_query_var('catb','default'); // equals 'bar'
$z = get_query_var('catc','default'); // equals 'more'
Il est cependant difficile de vous donner une solution exacte sans savoir comment votre URL est générée, si vous utilisez le global $ _GET et comment vous utilisez les valeurs de votre code.
Voici mon approche en utilisant la variable RewriteRule
suivante dans le .htaccess
au lieu d'utiliser la fonction add_rewrite_rule()
:
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{QUERY_STRING} ^taxo=([^&]+)&([^=]+)=([^&]+)&([^=]+)=([^&]+)&([^=]+)=(.*)$
RewriteRule ^/?$ /%1/%2/%3/%4/%5/%6/%7? [L,R=301]
</IfModule>
Cela a été testé et vérifié avec le testeur htaccess .
La différence entre Spartacus ' answer et la mienne est que cette condition est remplie si la chaîne de requête contient ?taxo=
avant de commencer la règle de réécriture. De plus, ma réécriture n'est pas liée aux seuls cata
, catb
et catc
que vous utilisez à des fins d'exemple. Cette règle couvre de manière dynamique toutes vos autres limaces, au cas où vos valeurs de taxonomie changeraient. Par exemple:
http://example.com/?taxo=question&cata=foo&catb=bar&catc=more
http://example.com/?taxo=answer&type=foo&id=123&date=123
Va devenir:
http://example.com/question/cata/foo/catb/bar/catc/more
http://example.com/answer/type/foo/id/123/date/123