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

yrefmtwq  于 2022-11-28  发布在  PHP
关注(0)|答案(9)|浏览(154)

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

有什么想法吗?

svdrlsy4

svdrlsy41#

为了在“前端”上进行“WordPress之路”的往返(在wp-admin的上下文中不起作用),你需要使用3个WordPress函数:

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

注意:如果你这样做,甚至不需要接触超全局变量($_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 varsquery_vars钩子也不会运行。
在这种情况下,您需要恢复到检查$_GET超全局的更标准的方法。

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

虽然在紧要关头你可以做尝试和真实

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

或其一些变体。

mv1qrgav

mv1qrgav2#

有相当多的解决方案来解决这个问题。首先,你可以去一个插件,如果你想:

或者手动编码,看看这个帖子:

还可以查看:

6uxekuva

6uxekuva3#

由于这是一个经常访问的职位,我想张贴我的解决方案,以防它帮助任何人。在WordPress中沿着随着使用查询变量,你可以改变permalinks太像这样

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

为此,您必须在functions.php或插件基本文件中添加这些代码行。
发件人**shankhan's答复**

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

希望它能对某人有用。

ua4mk5z4

ua4mk5z44#

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

那么您B好使用$_GET ['var 1']

fruv7luv

fruv7luv5#

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

?>

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

你可以添加任何页面来代替“news”。

oyjwcjzk

oyjwcjzk6#

您可能会遇到的一个问题是,当注册的query_var出现在home URL中时,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']
添加/修改后,请记住刷新重写规则。

mm5n2pyu

mm5n2pyu7#

添加参数到post url(到永久链接),我使用以下命令:

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

7lrncoxx

7lrncoxx8#

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

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

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

3ks5zfa0

3ks5zfa09#

在您的情况下,只需在url后添加/,然后放置查询参数。
www.example.com/news/?c=123news/?c=123
代替
www.example.com/news?c=123news?c=123

相关问题