Comment passer des variables supplémentaires dans L'URL avec Wordpress
J'ai du mal à essayer de 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 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 mes fonctions.fichier 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?
8 réponses
Il y a assez peu de solutions pour s'attaquer à ce problème. Vous pouvez d'abord opter pour un plugin si vous voulez:
Ou code manuellement, consultez ce post:
Consultez Également:
Pour faire l'aller-retour "the WordPress Way" sur le "front-end" (ne fonctionne pas dans le contexte de wp-admin
), vous devez utiliser 3 fonctions WordPress:
- add_query_arg() - pour créer l'URL avec votre nouvelle variable de requête ('c' dans votre exemple)
- lequery_vars filtre-pour modifier la liste des variables de requête publique que WordPress connaît (cela ne fonctionne que sur le front-end, car la requête WP n'est pas utilisée sur le back-end -
wp-admin
- donc cela ne sera pas non plus disponible dansadmin-ajax
) - get_query_var () - pour récupérer la valeur de votre variable de requête personnalisée passée dans votre URL.
Note: il n'est même pas nécessaire de 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:
si c'est un lien vers cette page, il suffit d'ajouter la requête la variable
<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 vos fonctions.php, ou 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 travailler avec la VaR de requête définie dans votre URL:
$my_c = get_query_var( 'c' );
À L'arrière (wp-admin
)
À l'arrière, nous n'exécutons jamais wp()
, donc la requête WP principale ne s'exécute pas. En tant que résultat, il n'y a pas de query vars
et le crochet query_vars
n'est pas exécuté.
Dans ce cas, vous devrez revenir à l'approche plus standard de l'examen de votre $_GET
superglobal. La meilleure façon de le faire est probablement:
$my_c = filter_input( INPUT_GET, "c", FILTER_SANITIZE_STRING );
Bien que dans un pincement, vous pourriez faire le essayé et vrai
$my_c = isset( $_GET['c'] ? $_GET['c'] : "";
Ou une variante de celui-ci.
Ajouter le code suivant dans la fonction.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;
}
Alors vous pourrez utiliser $_GET ['var1']
Comme il s'agit d'un poste fréquemment visité, j'ai pensé poster ma solution au cas où cela aiderait quelqu'un. dans WordPress avec l'utilisation de Vars de requête, vous pouvez également 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 des fonctions.php ou votre fichier de base de plugin.
De shankhan de anwer
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 outre cela snipped 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');
Pour le cas où vous devez ajouter une réécriture règles pour une page spécifique vous pouvez utiliser ce limace de page pour écrire une règle de réécriture pour cette page spécifique. Comme dans la question que OP a posée sur
www.example.com/news?c=123 to www.example.com/news/123
Nous pouvons le changer au comportement désiré 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 danslieu de "nouvelles".
Un problème que vous pourriez rencontrer est is_home()
renvoie true lorsqu'un query_var enregistré est présent dans L'URL d'accueil. Par exemple, si http://example.com
affiche une page statique au lieu du blog, http://example.com/?c=123
renvoie 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'infos sur cette.
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 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 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 avoir ajouté / modifié ceci.
C'était le seul moyen pour que cela fonctionne
add_action('init','add_query_args');
function add_query_args()
{
add_query_arg( 'var1', 'val1' );
}
Pour Ajouter un paramètre à l'url de publication (vers le lien perma), j'utilise ceci:
add_filter( 'post_type_link', 'append_query_string', 10, 2 );
function append_query_string( $url, $post )
{
return $url.'?my_pid='.$post->ID;
}
Sortie:
http://yoursite.com/pagename?my_pid=12345678