web-dev-qa-db-fra.com

Réécrire l'URL pour les résultats d'un WP_Query personnalisé

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' ); 
2
benoît

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.

1
Spartacus

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
1