web-dev-qa-db-fra.com

Règle de réécriture personnalisée ignorée

Ce dont j'ai besoin

Dans le but de tester les variations de page de produit, j'essaie de réécrire l'URL de la page de produit en quelque chose comme:

www.website.com/products/product-x/variation/1/

Ce que j'ai fait

J'ai ajouté la requête var comme suit:

/**
 * Adds variation query var
 */
function gtp_add_variation_query_vars( $vars ) {
   $vars[] = 'variation';
   return $vars;
}
add_filter( 'query_vars', 'gtp_add_variation_query_vars');

Je me suis connecté au generate_rewrite_rules pour ajouter une nouvelle règle de réécriture, comme suit:

/**
 * Adds rewrite rule for template variation paramater
 */
function gtp_add_variation_rewrite_rules() {

   global $wp_rewrite;

   // Rewrite rule with (v)ariation parameter
   $new_rules['products/(.+?)/variation/([0-9]*)/?$'] = 'index.php?post_type=products&products=' . $wp_rewrite->preg_index( 1 ) . '&variation=' . $wp_rewrite->preg_index( 2 );

   // Add new rewrite rules to rewrite rules array
   $wp_rewrite->rules = $wp_rewrite->rules + $new_rules;

   return $wp_rewrite->rules;

}
add_action( 'generate_rewrite_rules', 'gtp_add_variation_rewrite_rules' );

Lorsque je vide mes règles de réécriture, la règle suivante s'affiche au bas de la sortie du tableau $wp_rewrite->rules:

[products/(.+?)/variation/([0-9]*)/?$] => index.php?post_type=products&products=$matches[1]&variation=$matches[2]

Le problème

Mais quand je visite la page: www.website.com/products/product-x/variation/1/ je reçois un 404.

La chose étrange est que cela fonctionne sur ma copie XAMPP localhost du site actif, mais pas sur le site actif lui-même. Cela pourrait-il être un problème lié au serveur? Ou une autre règle de réécriture (mais cela ne devrait pas être un problème à mon avis, car la règle est au bas du tableau des règles de réécriture)

Informations supplémentaires:

J'ai défini ma structure de permalien (sous paramètres -> permaliens) sur la structure personnalisée "/%category%/%postname%/".

Mon fichier .htaccess ressemble à 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]
</IfModule>
# END WordPress
1
Robbert

Les règles de réécriture sont correctes, mais comme vous modifiez directement le $wp_rewrite, vous ne bénéficiez pas de l'avantage de pouvoir ajouter la règle au sommet de la pile à l'aide de add_rewrite_rules.

Vous êtes sur la bonne voie avec l'emplacement de la règle dans le tableau, mais les règles en haut sont vérifiées en premier et la première règle à faire correspondre est utilisée.

Remplacer vos deux fonctions par le code ci-dessous devrait gérer la requête_var et la règle de réécriture + le positionnement.

/**
 * Adds rewrite rule for template variation paramater
 */
function gtp_add_variation_rewrite_rules() {
    add_rewrite_tag( '%variation%', '([0-9]*)' );
    add_rewrite_rule( 'products/(.+?)/variation/([0-9]*)/?$', 'index.php?post_type=products&products=$matches[1]&variation=$matches[2]', 'top' );
}

add_action( 'init', 'gtp_add_variation_rewrite_rules' );
0
bswatson