web-dev-qa-db-fra.com

Pourquoi mon mod_rewrite ne fonctionne-t-il pas?

Ok j'ai un site WP utilisant la structure permalien de /%category%/%postname%/

Je l'ai construit à la manière de modèles de page, en utilisant des requêtes de catégorie à l'intérieur, c'est-à-dire.

page-help.php

<?php $my_query = new WP_Query('category_name=help');
while ($my_query->have_posts()) : $my_query->the_post(); ?>
     <!--content-->
<?php endwhile; wp_reset_query(); ?>  

page-about.php

<?php $my_query = new WP_Query('category_name=about');
while ($my_query->have_posts()) : $my_query->the_post(); ?>
     <!--content-->
<?php endwhile; wp_reset_query(); ?>   

Assez simple. Le problème que j’ai, c’est que j’ai besoin d’archives par année pour la section nouvelles. J'ai fait cela en faisant juste que le fichier archive.php ait la même disposition que page-news.php et juste interroger les messages dans la catégorie nouvelles. * -ce est bien dans mon cas car les nouvelles sont et ne seront jamais que le contenu à archiver.

Ma catégorie de nouvelles (dernières nouvelles) est un enfant de la catégorie à propos de, alors quand je vais à la section nouvelles, l'URL est la suivante:

www.example.com/about/latest-news/

Sur la page de nouvelles, utilisez le code suivant pour répertorier les archives;

<!-- Gets archive for news-->   
<?php $my_query = new WP_Query('category_name=news_article');
while ($my_query->have_posts()) : $my_query->the_post(); ?>
     <?php wp_get_archives('type=yearly'); ?> 
<!--Ends archive for news-->
<?php endwhile; wp_reset_query(); ?>   

Les liens qu’elle génère me conduisent naturellement à

www.example.com/2000

www.example.com/2001

etc. Je veux que la réécriture les change en

www.example.com/about/latest-news/2000

www.example.com/about/latest-news/2001

J'ai modifié le .htaccess dans la WP route vers ceci:

# 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]    
RewriteRule  /([0-9]+/?)$  /about/latest-news/$1     [NC,L]  #Added this line
</IfModule> 

Mais je n'ai pas de chance, l'URL reste comme

www.example.com/2000

J'ai le problème de ne pas savoir si ma réécriture est erronée, si je devrais mettre cette ligne de réécriture dans un htaccess différent ailleurs, ou si WordPress l'écrase.

Toute aide sera grandement appréciée.

1
danixd

Premièrement, votre ligne supplémentaire arrive trop tard. La règle précédente intercepte tout ce que vous voulez associer. Deuxièmement, ce n’est pas ce que vous voulez. Votre …

RewriteRule  /([0-9]+/?)$  /about/latest-news/$1     [NC,L]

… Correspond aux demandes telles que example.com//0000000000000000000/ ou example.com/about/latest-news/2010/ (boucle infinie!). Le premier argument de RewriteRule omet le / de départ.

Pour correspondre aux archives de l'année, vous devez plutôt:

RewriteRule  ^(\d\d\d\d)/?$  /about/latest-news/$1     [NC,L]

Je ne sais pas si vous avez vraiment besoin de mod_rewrite pour cela. Essayez la ligne suivante au-dessus du bloc de réécriture:

RedirectMatch Permanent ^/(\d\d\d\d)/?$ /about/latest-news/$1

Vous devez informer WordPress de votre archive personnalisée , permaliens . Vous devriez trouver suffisamment de bons exemples sous la balise.

1
fuxia

Si vous utilisez Wordpress sans mod_rewrite ( docs ), toutes les URL sont comme myblog.com/index.php?p=12. Avec mod_rewrite, vous pouvez créer de jolies URL, comme myblog.com/mypost. Comment cela fonctionne-t-il, c’est qu’Apache réécrit en interne l’URL myblog.com/mypost en myblog.com/index.php?p=12, avant de transmettre la demande à Wordpress.

Donc mod_rewrite est utilisé pour créer de jolies URLs pour votre blog, mais il ne réécrira pas les liens que Wordpress génère pour vous.

Pour résoudre votre problème, vous ne devriez pas avoir à changer les règles mod_rewrite.

1
Wietse Venema