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

时间:2011-01-03 17:44:39

标签: php wordpress url get

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

任何想法?

9 个答案:

答案 0 :(得分:101)

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

  • add_query_arg() - 使用新的查询变量创建网址(示例中为“c”)
  • query_vars过滤器 - 修改WordPress知道的public query variables列表(这只适用于前端,因为WP Query不在后端使用 - {{1 } - 所以这在wp-admin
  • 中也不可用
  • get_query_var() - 检索您在网址中传递的自定义查询变量的值。

注意:如果你这样做的话,甚至不需要触摸超全球(admin-ajax)。

实施例

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

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

$_GET

如果它是指向其他页面的链接

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

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

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

在您要检索的页面/功能上,并使用您的网址中设置的查询变量

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

在后端($my_c = get_query_var( 'c' );

在后端,我们不会运行wp-admin,因此主WP查询无法运行。因此,没有wp()并且query vars挂钩未运行。

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

$_GET

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

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

或其中的一些变体。

答案 1 :(得分:31)

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

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

同时退房:

答案 2 :(得分: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']

答案 3 :(得分:9)

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

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

为此,您必须在functions.php或插件基本文件中添加以下代码行。

来自 shankhan's 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');

对于需要为特定页面添加重写规则的情况,您可以使用该页面slug为该特定页面编写重写规则。就像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');

希望它对某人有用。

答案 4 :(得分:3)

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

?>

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

您可以在&#34; news&#34;中添加任意页面。

答案 5 :(得分:2)

当主页URL中存在已注册的query_var时,您可能遇到的一个问题是is_home()返回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/

您可以执行的操作(如果您不尝试影响查询)使用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

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

答案 6 :(得分:1)

这是我能让这个工作的唯一方法

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

http://codex.wordpress.org/Function_Reference/add_query_arg

答案 7 :(得分:1)

将参数添加到帖子网址(对于perma-links),我用这个:

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

答案 8 :(得分:0)

在您的情况下,只需在 url 后添加 / ,然后输入查询参数。喜欢

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

代替

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