J'essaie d'ajouter des paramètres de requête d'URL à tous les liens internes d'un blog WordPress. Par exemple, le client atterrit sur le blog avec ce lien:
www.example.com/?p1=test&p2=test
Je souhaite que les liens à l'intérieur du blog, par exemple un lien vers un article, aient toujours les chaînes de la requête:
www.example.com/post1/?p1=test&p2=test
Y a-t-il un moyen de le faire?
Ce qui suit est la solution not a complète (c'est-à-dire, comme @cjbj l'a mentionné, les liens ne seront pas gérés dans le contenu du message), mais vous obtiendrez ce que vous voulez pour tout lien dont l'URL est obtenu (dans WP Core, un thème ou un plugin) via get_permalink () (y compris le résultat de wp_page_menu () et kin).
$filters = array (
'post_link', // when post_type == 'post'
'page_link', // when post_type == 'page'
'attachment_link', // when post_type == 'attachment'
'post_type_link', // when post_type is not one of the above
) ;
foreach ($filters as $filter) {
add_filter ($filter, 'wpse_add_current_requests_query_args', 10, 3) ;
}
function
wpse_add_current_requests_query_args ($permalink, $post, $leavename)
{
if (!is_admin ()) {
// we only want to modify the permalink URL on the front-end
return ;
}
// for the purposes of this answer, we ignore the $post & $leavename
// params, but they are there in case you want to do conditional
// processing based on their value
return (esc_url (add_query_arg ($_GET, $permalink))) ;
}
Avant de renvoyer son résultat, get_permalink()
applique l'un des 4 filtres (nommés dans le tableau $filters
ci-dessus) sur le lien permanent qu'il a généré. Donc, nous accrochons dans chacun de ces filtres.
La fonction que nous associons à ces filtres appelle add_query_arg () pour ajouter les arguments de requête présents dans la requête en cours (à savoir, $_GET
).
Comme mentionné dans add_query_arg () :
Important: La valeur de retour de add_query_arg () n'est pas échappée par défaut. La sortie doit être échappée tardivement avec esc_url () ou similaire pour aider à prévenir la vulnérabilité aux attaques de script intersite (XSS).
L'appel de esc_url () dans wpse_add_current_requests_query_args()
n'est pas ce que j'appellerais "échappé tardif" dans tous les cas. Mais malheureusement, un certain nombre de WP Core Funcs (par exemple, Walker_Page :: start_el () , qui est appelé en dernier lieu par wp_page_menu()
), n’appelez pas esc_url()
sur la valeur renvoyée de get_permalink()
. avoir à l'appeler dans notre crochet de filtre pour être en sécurité.
Vous pouvez accéder à la chaîne de requête avec la variable globale $_SERVER
, avec $_SERVER['QUERY_STRING']
. L'étape suivante consiste à l'ajouter à tous les liens internes de votre blog. C'est un peu plus difficile, car les liens peuvent se cacher n'importe où.
Les liens qui se cachent dans le contenu d'un article peuvent être recherchés et adaptés avec the_content
filter. Here est un exemple d'utilisation légèrement différente de ce filtre uniquement sur les liens internes.
Les liens permanents dans les thèmes et les plugins doivent transmettre le filtre post_link
, que vous pouvez également utiliser pour ajouter la chaîne.
Donc, vous voulez "garder" la valeur de la variable? Peut-être préférez-vous créer un cookie? Cela rendrait probablement les choses beaucoup plus faciles et plus propres. Regardez cet article, il semble avoir tout ce dont vous avez besoin pour créer un cookie: https://premium.wpmudev.org/blog/set-get-delete-cookies/ et vous devriez pouvoir utiliser get_query_var pour obtenir la variable à partir de l'URL: https://codex.wordpress.org/Function_Reference/get_query_var