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

我有麻烦,试图传递一个额外的变量在网址到我的 WordPress 安装。

例如 /news?c=123

由于某些原因,它只工作在网站根 www.example.com?c=123,但它不工作,如果网址包含任何更多的信息 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']);
}

有什么想法吗?

260403 次浏览

在 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’]

解决这个问题的方法很少。首先,如果你愿意,你可以使用一个插件:

或者手动编写代码,看看这篇文章:

还有:

只有这样我才能让这个起作用

add_action('init','add_query_args');
function add_query_args()
{
add_query_arg( 'var1', 'val1' );
}

Http://codex.wordpress.org/function_reference/add_query_arg

为了在前端使用“ The WordPress Way”(在 wp-admin中不起作用) ,你需要使用3个 WordPress 函数:

注意: 如果你这样做,甚至不需要触摸超全局变量($_GET)。

例子

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

如果是返回到此页面的链接,只需添加查询变量即可

<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 中设置的查询变量的页面/函数上:

$my_c = get_query_var( 'c' );

在后端(wp-admin)

在后端,我们从来不运行 wp(),所以主 WP 查询不会运行。因此,不存在 query vars,并且 query_vars挂钩不会运行。

在这种情况下,您需要使用更标准的方法来检查 $_GET superglobal。最好的办法可能是:

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

虽然在紧要关头,你可以做的经过考验和真实

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

或者其他变种。

为帖子网址添加参数(到永久链接) ,我使用这个:

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

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


?>


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

您可以添加任何页面代替“新闻”。

由于这是一个经常访问的职位,我想张贴我的解决方案,以防它帮助任何人

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

为此,您必须在 Functions.php 或您的插件基本文件中添加这些代码行。

来自 尚汉的回答

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

希望它对某人有用。

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

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

您可以使用 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 );
}

这样,当 URL 包含更多信息(如 www.example.com/news?c=123)时,您就可以访问 $_GET['c']

请记住在添加/修改这些内容之后刷新重写规则。

在这种情况下,只需在 url 后面添加/,然后放入查询参数

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

而不是

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