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


72

我在尝试将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']);
}

有任何想法吗?


Answers:



112

要在“前端”(在的上下文中不起作用)进行“ WordPress方式”往返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'] : "";

或其某些变体。


1
另外你需要使用esc_urladd_query_arg developer.wordpress.org/reference/functions/add_query_arg
electroid

这是一个很好的答案,一直在寻找像这样的简单示例的年龄,谢谢
Sam Skirrow

很棒的描述!wordpress是否会删除未注册的查询参数(这似乎适合我,但我不确定是怎么回事)?最好这样说,以减轻混乱:)
Damon

它不会使它们脱离$ _GET,但是它们对您的重写规则不可用,也无法在您的重写规则中使用$query_vars
Tom Auger

1
@electroid修改了我的答案以反映您的最佳实践。
汤姆·俄格

15

在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;
}

那么您将能够使用$ _GET ['var1']


15

由于这是一个经常访问的帖子,因此我想发布我的解决方案以防万一。在WordPress中以及使用查询变量,您也可以像这样更改永久链接

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

为此,您必须将这些代码行添加到functions.php或您的插件基础文件中。

山汗的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;
}

此外,它还添加了自定义重写规则。

function custom_rewrite_basic() 
{
    add_rewrite_rule('^c/([0-9]+)/?', '?c=$1', 'top');
}
add_action('init', 'custom_rewrite_basic');

对于需要为特定页面添加重写规则的情况,可以使用该页面插件为该特定页面编写重写规则。就像OP询问的问题一样

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

我们可以通过对以前的功能进行一些修改来将其更改为所需的行为。

function custom_rewrite_basic() 
{
    add_rewrite_rule('^news/([0-9]+)/?', 'news?c=$1', 'top');
}
add_action('init', 'custom_rewrite_basic');

希望它对某人有用。


谢谢。非常有用
tousif

谢谢,真的有帮助。
维克多

是否可以以通用的方式添加重写规则,而不管以前是哪个页面,归档文件或类似文件,例如/ c / 123?
Firsh-LetsWP.io

是的,这就是这段代码的作用。“ For the Case”行之前的功能
shazyriver

不适用于WordPress 5.5.3版本。你有什么建议吗?
Dipen Patel

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

?>

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

您可以在“新闻”的任何位置添加页面。


3

is_home()当主URL中存在已注册的query_var时,您可能会遇到的一个问题是返回true。例如,如果http://example.com显示静态页面而不是博客,http://example.com/?c=123则将返回博客。

有关更多信息,请参阅https://core.trac.wordpress.org/ticket/25143https://wordpress.org/support/topic/adding-query-var-makes-front-page-missing/

您可以执行的操作(如果您不想影响查询)是use add_rewrite_endpoint()。它应在init操作期间运行,因为它会影响重写规则。例如。

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 );
}

$_GET['c']当网址包含更多信息(例如)时,这应该可以让您访问www.example.com/news?c=123

记住在添加/修改后刷新刷新规则。


3

参数添加到发布网址(以博链接),我用这个:

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);
}

输出:

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


2
@mwebber答案的目的不是给出答案“如何检测url中的#”,而是显示一个钩子来修改url。但是,如您所愿,我已更新答案以符合您的评论。
T.Todua

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.