web-dev-qa-db-fra.com

Page personnalisée avec des variables dans l'URL. Belle URL avec add_rewrite_rule

Utiliser WP3.1

J'ai une page personnalisée avec un WP_Query et la requête obtient les variables dynamiques de l'URL. Et je veux des variables sûres et des URLs propres.

Exemple:

carpage /? carmodel = honda & location = finland

À

carpage/honda/finland /

J'ai créé add_rewrite_rule dans functions.php et cela fonctionne, mais je ne suis pas sûr que son utilisation soit sans danger.

Fonctions.php

  function fcars() {

  add_rewrite_rule('carpage/[/]?([a-zA-Z-]*)[/]?([a-zA-Z-]*)$', 'index.php?pagename=carpage&var1=$matches[1]&var2=$matches[2]');

  add_rewrite_tag('%var1%', '[a-zA-Z]+');
  add_rewrite_tag('%var2%', '[a-zA-Z]+');
}

add_action('init', 'fcars');

Et dans le modèle personnalisé je reçois les vars

Quelqu'un pourrait-il m'aider s'il vous plaît avec cela. Comment puis-je sécuriser cette utilisation et est-ce la bonne façon de fonctionner dans WP3.1

Quelle est la bonne façon de faire add_rewrite_rule dans ce cas:

carpage/honda/finland /

(uniquement des traits d'union et des petites lettres dans l'URL) carpage est la page de modèle statique.

7
ide79

Je pense que la add_rewrite_tag() n'est pas nécessaire et peut être remplacée par l'ajout direct des variables aux vars de requête publics:

// Either directly (in your init hook):
$wp->add_query_var( 'var1' );
$wp->add_query_var( 'var2' );

// Or via a filter:
add_filter( 'query_vars', 'wpse12965_query_vars' );
function wpse12965_query_vars( $query_vars )
{
    $query_vars[] = 'var1';
    $query_vars[] = 'var2';
    return $query_vars;
}

En outre, vous autorisez actuellement une ou deux barres obliques à l'avant, mais aucune à l'arrière. Je pense que vous voulez déplacer le /? à la fin de la regex. La partie [a-zA-Z-] du slug est aussi parfois écrite en tant que [^/] (tout sauf une barre oblique), mais dans ce cas, cela ne fera probablement pas de différence.

Je voudrais écrire la règle de réécriture comme ceci:

add_action( 'init', 'wpse12065_init' );
function wpse12065_init()
{
    add_rewrite_rule(
        'carpage(/([^/]+))?(/([^/]+))?/?',
        'index.php?pagename=carpage&var1=$matches[2]&var2=$matches[4]',
        'top'
    );
}

Le (/([^/]+))? rend le groupe entier facultatif, donc /carpage, /carpage/honda et /carpage/honda/finland devraient fonctionner, avec une barre oblique optionnelle à la fin. Comme nous avons besoin d'un groupe supplémentaire pour le /, les variables se trouvent dans le groupe de capture suivant. Par conséquent, $matches[1] devient $matches[2] et $matches[2] devient $matches[4].

Si vous souhaitez déboguer vos règles de réécriture, je vous recommande mon plugin d'analyseur Rewrite , il vous permet de jouer avec l'URL et de voir les variables de requête résultantes.

16
Jan Fabry