web-dev-qa-db-fra.com

Les règles de réécriture redirigent et ne transmettent pas les VAR

J'ai le code suivant dans mon fichier functions.php.

<?php
add_action('init', 'flush_rewrite_rules');

function custom_add_rewrite_rules( $wp_rewrite ) {
    $new_rules = array( 
        'insurance-leads-types/auto-insurance-leads/([^/\.]+)/?$' => 'index.php?pagename=auto-insurance-leads&state=' . $wp_rewrite->preg_index(1),
        'insurance-leads-types/home-insurance-leads/([^/\.]+)/?$' => 'index.php?pagename=home-insurance-leads&state=' . $wp_rewrite->preg_index(1)
    );
    $wp_rewrite->rules = $new_rules + $wp_rewrite->rules;
}
add_action('generate_rewrite_rules', 'custom_add_rewrite_rules');

function add_query_vars( $query_vars ) {
  $query_vars[] = 'state';
  return $query_vars;
}
add_filter( 'query_vars', 'add_query_vars' ); 

Quand je vais à la page/assurances-leads-types/auto-assurance-leads/STATENAME/l'URL est redirigé vers/assurance-leads-types/auto-assurance-leads/sans le STATENAME final/et la variable n'est pas transmise à $ query_vars.

J'ai utilisé l'analyseur de réécriture de Monkeyman et tout va bien:

pagename: auto-assurance-leads

état: (. [^ /] +)

Des idées pour lesquelles l'URL redirige?

1
Christopher Harden

Je voudrais aborder cela en utilisant la fonction add_rewrite_endpoint().

Il prend en charge l'ajout de vars de requête et est beaucoup plus simple à configurer, sans que vous ayez à vous soucier du changement de page, etc.

Le code serait:

// in functions.php
add_action( 'init', 'wpse42604_add_endpoints' );
function wpse42604_add_endpoints() {
   add_rewrite_endpoint( 'state', EP_PAGES );
}

// in template file eg. page.php   
if ( '' != get_query_var( 'state' ) ) {
    // ... do stuff with the state query var
}

L'inconvénient (en fonction de votre point de vue) est que vous n'obtiendrez pas les URL exactes que vous spécifiez ci-dessus, elles se présenteront ainsi:

insurance-leads-types/auto-insurance-leads/state/tx/

Mais il s’agit d’une solution plus robuste et plus flexible, et cette URL est toujours lisible et agréable à regarder.

Le problème que vous voyez est un problème que j'ai déjà rencontré avec le traitement par WordPress des règles de réécriture effectuant une redirection canonique avant d'examiner les réécritures. Malheureusement, cela fait un moment que je ne l'ai pas parcourue, donc je ne me souviens pas des détails, mais c'est la fonction redirect_canonical() dans wp-includes/canonical.php qui me causait un problème similaire.

1
sanchothefat

Vous devriez probablement utiliser les fonctions intégrées réécrire api plutôt que d'utiliser le filtre generate_rewrite_rules. Il y a quelques problèmes avec votre regex regex. Vous devez commencer par chacun avec une carotte ^, pour indiquer à WP de correspondre à partir du début de l'URL.

Je ne suis pas vraiment sûr de ce que vous essayez d'accomplir avec le ([^/\.]+). Quelque chose qui n'est pas une barre oblique ou une période? Si tel est le cas, cela ne fonctionnera probablement pas comme prévu. Quelqu'un pourrait entrer insurance-leads-types/auto-insurance-leads/tx.state/ et il ne correspondrait pas, car votre expression rationnelle ne prend pas en compte les éléments qui suivent le point.

Voici une version de travail qui correspondra à tout ce qui n’est pas une barre oblique dans le groupe final.

<?php
add_action( 'init', 'wpse42604_add_rewrite' );
function wpse42604_add_rewrite()
{
    add_rewrite_rule(
        '^insurance-leads-types/auto-insurance-leads/([^/]+)/?$',
        'index.php?pagename=auto-insurance-leads&state=$matches[1]',
        'top'
    );
    add_rewrite_rule(
        '^insurance-leads-types/home-insurance-leads/([^/]+)/?$',
        'index.php?pagename=home-insurance-leads&state=$matches[1]',
        'top'
    );
}

Tout le code en tant que plugin . J'ai écrit un très grand tutoriel sur la réécriture d'api ça vaut le coup d'oeil.

Edit: De plus, vous pourriez avoir un comportement imprévisible qui efface les règles de réécriture une page même comme le fait votre code.

1
chrisguitarguy