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?
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:
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:
wp-admin
- elle ne sera donc pas disponible dans admin-ajax
)Remarque: vous ne devez même pas toucher les superglobales ($_GET
) Si vous le faites de cette façon.
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' );
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.
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']
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.
<?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".
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.
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' );
}
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