如何通过WordPress在URL中传递额外的variables

我有麻烦试图传递一个额外的variables在我的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']); } 

有任何想法吗?

解决这个问题的方法很less。 首先,如果你想要,你可以去插件:

  • WordPress Quickie:自定义查询string插件

或者手动编码,看看这个post:

  • 在WordPressurl中传递查询string参数

另外检查:

  • add_query_arg

要在“前端”(不在wp-admin的环境下)进行往返“WordPress的方式”,您需要使用3个WordPressfunction:

  • add_query_arg() – 用你的新查询variables(在你的例子中是'c' )创buildURL
  • query_varsfilter – 修改WordPress知道的公共查询variables的列表(这只适用于前端,因为后端没有使用WP查询 – wp-admin – 所以这也不能在admin-ajax
  • get_query_var() – 检索在URL中传递的自定义查询variables的值。

注意:如果你这样做的话,甚至不需要接触超全球variables( $_GET )。

在需要创build链接的页面上设置查询variables:

如果这是一个链接回到这个页面,只需添加查询variables

<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 varsquery_vars挂钩不运行。

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

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

虽然在一个捏,你可以做的尝试和真实的

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

或其一些变体。

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

由于这是一个经常访问的post,我想发布我的解决scheme,以防万一它帮助任何人。 在WordPress使用查询variables,你也可以像这样改变永久链接

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

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

shankhan的口气

 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添加一些修改来将其更改为所需的行为。

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

希望它对某人有用。

 <?php $edit_post = add_query_arg('c', '123', 'news' ); ?> <a href="<?php echo $edit_post; ?>">Go to New page</a> 

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

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

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

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

添加参数发布URL (永久链接),我使用这个:

 add_filter( 'post_type_link', 'append_query_string', 10, 2 ); function append_query_string( $url, $post ) { return $url.'?my_pid='.$post->ID; } 

输出:

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

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

有关详细信息,请参阅https://core.trac.wordpress.org/ticket/25143和https://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']

记住在添加/修改这个之后刷新你的重写规则。