一尘不染

如何使用WordPress在URL中传递额外的变量

php

我在尝试将url中的额外变量传递给我的WordPress安装时遇到了麻烦。

例如 /news?c=123

出于某种原因,它仅在网站根目录上有效,www.example.com?c=123但是如果url中包含更多信息,则它将无效www.example.com/news?c=123。我的主题目录中的functions.php文件中包含以下代码。

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

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

有任何想法吗?


阅读 367

收藏
2020-05-26

共1个答案

一尘不染

要在“前端”上进行“ The WordPress Way”(在的上下文中不起作用wp-admin),您需要使用3个WordPress函数:

  • add_query_arg() -使用新的查询变量(示例中为“ c” )创建URL
  • 在query_vars过滤器-修改的列表公众查询变量是WordPress的知道(这仅适用于前端,因为WP查询不是在后端使用- wp-admin-所以这也不会提供admin-ajax)
  • get_query_var() -检索在URL中传递的自定义查询变量的值。
    注意:$_GET如果您这样做,则甚至无需触摸superglobals()。


在需要创建链接的页面上/设置查询变量:

如果是指向此页面的链接,只需添加查询变量

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

如果是到其他页面的链接

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

在您的functions.php或某些插件文件或自定义类中(仅前端):

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

在您希望检索并使用URL中设置的查询var的页面/函数上:

$my_c = get_query_var( 'c' );

在后端(wp-admin)
在后端,我们永远不会运行wp(),因此不会运行主WP Query。其结果是,有没有query vars和query_vars勾手不运行。

在这种情况下,您需要恢复到检查$_GET超全局性的更标准方法。最好的方法可能是:

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

尽管可以在紧急情况下做

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

或其某些变体。

2020-05-26