81 votes

Comment passer des variables supplémentaires dans l'URL avec WordPress

J'ai des difficultés à passer une variable supplémentaire dans l'url de mon installation WordPress.

Par exemple /news?c=123

Pour une raison quelconque, cela ne fonctionne que sur le site web Root. www.example.com?c=123 mais cela ne fonctionne pas si l'url contient d'autres informations www.example.com/news?c=123 . J'ai le code suivant dans mon fichier functions.php dans le répertoire du thème.

if (isset($_GET['c'])) 
{
  setcookie("cCookie", $_GET['c']); 
}

if (isset($_SERVER['HTTP_REFERER']))
{
  setcookie("rCookie", $_SERVER['HTTP_REFERER']);
}

Des idées ?

127voto

Tom Auger Points 4246

Pour faire l'aller-retour "à la manière de WordPress" sur le "front-end" (cela ne fonctionne pas dans le contexte de l'application wp-admin ), vous devez utiliser 3 fonctions de WordPress :

  • add_query_arg() - pour créer l'URL avec votre nouvelle variable de requête ('c' dans votre exemple)
  • le site paramètres d'interrogation filtre - pour modifier la liste des variables de requête publiques que WordPress connaît (cela ne fonctionne que sur le front-end, car la WP Query n'est pas utilisée sur le back-end). wp-admin - Il ne sera donc pas non plus disponible en admin-ajax )
  • get_query_var() - pour récupérer la valeur de votre variable de requête personnalisée passée dans votre URL.

Remarque : il n'est même pas nécessaire de toucher aux superglobales ( $_GET ) si vous procédez de cette manière.

Exemple

Sur la page où vous devez créer le lien / définir la variable de requête :

si c'est un lien de retour à cette page, il suffit d'ajouter la variable de requête

<a href="<?php echo esc_url( add_query_arg( 'c', $my_value_for_c ) )?>">

s'il s'agit d'un lien vers une autre page

<a href="<?php echo esc_url( add_query_arg( 'c', $my_value_for_c, site_url( '/some_other_page/' ) ) )?>">

Dans votre functions.php, ou dans un fichier de plugin ou une classe personnalisée (en frontal uniquement) :

function add_custom_query_var( $vars ){
  $vars[] = "c";
  return $vars;
}
add_filter( 'query_vars', 'add_custom_query_var' );

Sur la page / fonction où vous souhaitez récupérer et travailler avec la requête var définie dans votre URL :

$my_c = get_query_var( 'c' );

Sur la partie arrière ( wp-admin )

A l'arrière, nous n'avons jamais exécuté wp() Ainsi, la requête WP principale n'est pas exécutée. En conséquence, il n'y a pas de query vars et le query_vars Le crochet n'est pas exécuté.

Dans ce cas, vous devrez revenir à l'approche plus standard qui consiste à examiner votre carte de crédit. $_GET superglobal. La meilleure façon de le faire est probablement :

$my_c = filter_input( INPUT_GET, "c", FILTER_SANITIZE_STRING );

mais en cas de besoin, vous pouvez utiliser la méthode éprouvée

$my_c = isset( $_GET['c'] ? $_GET['c'] : "";

ou une de ses variantes.

1 votes

Vous devez également utiliser esc_url con add_query_arg developer.wordpress.org/reference/functions/add_query_arg

0 votes

C'est une excellente réponse, je cherchais depuis longtemps un exemple simple comme celui-ci, merci.

0 votes

Grande description ! Est-ce que wordpress supprime les arguments de requête non enregistrés (il semble que ce soit le cas pour moi, mais je ne suis pas totalement sûr de ce qui se passe) ? Ce serait bien de le préciser si c'est le cas, pour éviter toute confusion :)

39voto

Sarfraz Points 168484

Il existe plusieurs solutions pour résoudre ce problème. Tout d'abord, vous pouvez opter pour un plugin si vous le souhaitez :

Ou coder manuellement, consultez ce post :

Vérifiez également :

18voto

shazyriver Points 1108

Comme il s'agit d'un poste fréquemment visité, j'ai pensé poster ma solution au cas où elle aiderait quelqu'un. Dans WordPress, en plus d'utiliser les variables de requête, vous pouvez aussi modifier les permaliens comme ceci

www.example.com?c=123 to www.example.com/c/123

Pour cela, vous devez ajouter ces lignes de code dans functions.php ou dans le fichier de base de votre plugin.

De de shankhan réponse

add_filter( 'query_vars', 'addnew_query_vars', 10, 1 );
function addnew_query_vars($vars)
{   
    $vars[] = 'c'; // c is the name of variable you want to add       
    return $vars;
}

Et en plus ce bout de phrase pour ajouter des règles de réécriture personnalisées.

function custom_rewrite_basic() 
{
    add_rewrite_rule('^c/([0-9]+)/?', '?c=$1', 'top');
}
add_action('init', 'custom_rewrite_basic');

Dans le cas où vous devez ajouter des règles de réécriture pour une page spécifique, vous pouvez utiliser le slug de cette page pour écrire une règle de réécriture pour cette page spécifique. Comme dans la question posée par l'OP

www.example.com/news?c=123 to www.example.com/news/123

Nous pouvons le changer pour obtenir le comportement souhaité en ajoutant une petite modification à notre fonction précédente.

function custom_rewrite_basic() 
{
    add_rewrite_rule('^news/([0-9]+)/?', 'news?c=$1', 'top');
}
add_action('init', 'custom_rewrite_basic');

En espérant qu'il sera utile à quelqu'un.

0 votes

Merci. Très utile

0 votes

Merci, ça aide vraiment.

0 votes

Est-il possible d'ajouter la règle de réécriture de manière à ce qu'elle soit universelle, quelle que soit la page, l'archive ou autre qui se trouve avant, disons /c/123 ?

15voto

shankhan Points 3047

Ajoutez le code suivant dans function.php

add_filter( 'query_vars', 'addnew_query_vars', 10, 1 );
function addnew_query_vars($vars)
{   
    $vars[] = 'var1'; // var1 is the name of variable you want to add       
    return $vars;
}

vous pourrez alors utiliser $_GET['var1'].

4voto

niall.campbell Points 81

Un problème que vous pourriez rencontrer est is_home() renvoie un résultat positif lorsqu'une query_var enregistrée est présente dans l'URL d'origine. Par exemple, si http://example.com affiche une page statique à la place du blog, http://example.com/?c=123 retournera le blog.

Voir https://core.trac.wordpress.org/ticket/25143 et https://wordpress.org/support/topic/adding-query-var-makes-front-page-missing/ pour plus d'informations à ce sujet.

Ce que vous pouvez faire (si vous n'essayez pas d'affecter la requête) est d'utiliser add_rewrite_endpoint() . Il doit être exécuté pendant le init car elle affecte les règles de réécriture. Par exemple.

add_action( 'init', 'add_custom_setcookie_rewrite_endpoints' );

function add_custom_setcookie_rewrite_endpoints() {
    //add ?c=123 endpoint with
    //EP_ALL so endpoint is present across all places
    //no effect on the query vars
    add_rewrite_endpoint( 'c', EP_ALL, $query_vars = false );
}

Cela devrait vous permettre d'accéder à $_GET['c'] lorsque l'url contient plus d'informations comme www.example.com/news?c=123 .

N'oubliez pas de vider vos règles de réécriture après avoir ajouté/modifié ceci.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X