web-dev-qa-db-fra.com

Comment passer des variables supplémentaires dans une URL avec WordPress

Je n'arrive pas à essayer de transmettre une variable supplémentaire dans l'URL à mon WordPress installation.

Par exemple /news?c=123

Pour une raison quelconque, cela fonctionne uniquement à la racine du site Web www.example.com?c=123 mais cela ne fonctionne pas si l’URL contient plus d’informations www.example.com/news?c=123. J'ai le code suivant dans mon fichier functions.php dans le répertoire theme.

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

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

Des idées?

65
Chuck D

Il existe assez peu de solutions pour s'attaquer à ce problème. D'abord, vous pouvez opter pour un plugin si vous voulez:

Ou coder manuellement, consultez ce post:

Également vérifier:

31
Sarfraz

Pour effectuer l'aller-retour "Le WordPress Way" sur le "front-end" (ne fonctionne pas dans le contexte de wp-admin), Vous devez utiliser 3 WordPress les fonctions:

  • add_query_arg () - pour créer l'URL avec votre nouvelle variable de requête ('c' dans votre exemple)
  • le filtre query_vars - pour modifier la liste des variables de requête publiques que WordPress connaît (cela ne fonctionne que sur le serveur frontal, car le WP La requête n'est pas utilisée sur le back-end - wp-admin - elle ne sera donc pas disponible dans admin-ajax)
  • get_query_var () - pour récupérer la valeur de votre variable de requête personnalisée transmise dans votre URL.

Remarque: vous ne devez même pas toucher les superglobales ($_GET) Si vous le faites de cette façon.

Exemple

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

s'il s'agit d'un lien vers 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 ) )?>">

si c'est 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 (front-end 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 utiliser la requête définie dans votre URL:

$my_c = get_query_var( 'c' );

À l'arrière (wp-admin)

En bout de ligne, nous n'exécutons jamais wp(), de sorte que la requête principale WP ne soit pas exécutée. En conséquence, il n'y a pas de query vars Et le hook query_vars N'est pas exécuté.

Dans ce cas, vous devrez revenir à l'approche plus standard consistant à examiner votre superglobal $_GET. La meilleure façon de faire est probablement:

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

bien que dans un pincement, vous pouvez faire le essayé et vrai

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

ou une variante de celui-ci.

104
Tom Auger

ajouter 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']

15
shankhan

Comme il s’agit d’un message fréquemment consulté, j’ai pensé poster ma solution au cas où cela aiderait quelqu'un. Dans WordPress ainsi que l'utilisation de vars de requête, vous pouvez modifier les liens permanents de cette façon

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 Shankhan's 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, cela a été ajouté 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 ce slug de page pour écrire une règle de réécriture pour cette page spécifique. Comme dans la question posée par OP à propos de

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

Nous pouvons modifier 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 que cela devienne utile pour quelqu'un.

9
shazyriver
<?php
$edit_post = add_query_arg('c', '123', 'news' );

?>

<a href="<?php echo $edit_post; ?>">Go to New page</a>

Vous pouvez ajouter n'importe quelle page à la place de "nouvelles".

3
user3777827

Un problème que vous pouvez rencontrer est is_home() renvoie true lorsqu'un query_var enregistré est présent dans l'URL de la maison. Par exemple, si http://example.com Affiche une page statique à la place du blog, http://example.com/?c=123 Renverra le blog.

Voir https://core.trac.wordpress.org/ticket/2514 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 devrait être exécuté pendant l'action init car il 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 donner accès à $_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 l'ajout/la modification.

2
niall.campbell

C'était la seule façon pour moi de faire en sorte que cela fonctionne

add_action('init','add_query_args');
function add_query_args()
{ 
    add_query_arg( 'var1', 'val1' );
}

http://codex.wordpress.org/Function_Reference/add_query_arg

1
brenjt

to ajouter un paramètre pour poster des URL (to perma-links), j'utilise ceci:

add_filter( 'post_type_link', 'append_query_string', 10, 2 );
function append_query_string( $url, $post ) 
{
    return add_query_arg('my_pid',$post->ID, $url);
}

sortie:

http://yoursite.com/pagename?my_pid=12345678

1
T.Todua