web-dev-qa-db-fra.com

Détournement de l'URL pour le filtrage

Bon, voici le deal. J'ai une boucle qui affiche les articles de news, ces articles peuvent appartenir à des catégories spéciales (pas des catégories normales) et je veux pouvoir les filtrer.

Si je n'étais pas trop intéressé par l'esthétique, j'utiliserais un lien comme celui-ci:

domain.com/news?filter=cat1

Mais au lieu de cela, ce que je veux faire, c'est ceci ("réécrit):

domain.com/news/cat1 » domain.com/news/?filter=cat1

J'ai modifié le .htaccess pour transmettre la valeur cat1 en tant que variable GET:

RewriteEngine On
RewriteBase /
RewriteRule ^news/(.*)/$ /news/?filter=$1 [L,QSA]

# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>

# END WordPress

Le problème est que, même si cela passe maintenant avec succès la variable filter dans, WordPress considère le /cat1/ comme une page, il ne peut évidemment pas la trouver et lance donc un 404.

Est-il possible d'autoriser cette réécriture d'URL particulière sans que WordPress ne déclenche un 404? Il semble que cela prenne l'URL dans la barre d'adresse et l'analyse, ce que je veux vraiment, c'est qu'elle analyse l'URL réécrite.

Merci

3
Ben Everard

WordPress a également un mécanisme de réécriture, il est préférable de l’utiliser plutôt que de le faire dans le fichier .htaccess.

Vous pouvez ajouter vos propres règles de réécriture. Dans votre cas, nous voulons stocker la partie cat1 dans une variable de requête distincte. Nous devons donc également indiquer à WordPress d'autoriser cette variable de requête (elle utilise une liste blanche pour des raisons de sécurité).

La forme précise de la règle de réécriture dépend de ce que http://domain.com/news/ est: est-ce une page avec un modèle personnalisé ou autre chose? Vous devriez le découvrir (en utilisant mon plug-in d'analyse de Rewrite par exemple) et l'ajouter à la règle de réécriture.

add_action( 'init', 'wpse16819_init' );
function wpse16819_init()
{
    // Base form, will probably not work because it does nothing with the `news` part
    add_rewrite_rule( 'news/([^/]+)/?$', 'index.php?wpse16819_filter=$matches[1]', 'top' );
    // Use this instead if `news` is a page
    add_rewrite_rule( 'news/([^/]+)/?$', 'index.php?wpse16819_filter=$matches[1]&pagename=news', 'top' );
}

add_filter( 'query_vars', 'wpse16819_query_vars' );
function wpse16819_query_vars( $query_vars )
{
    $query_vars[] = 'wpse16819_filter';
    return $query_vars;
}

N'oubliez pas de flush les règles de réécriture (enregistrez-les dans la base de données) après avoir ajouté ce code. Vous pouvez le faire en consultant la page Permalinks dans la zone d'administration.

Vous pouvez maintenant accéder à la variable wpse16819_filter avec get_query_var( 'wpse16819_filter' );.

2
Jan Fabry