WordPress - 将查询字符串作为基于斜杠的 URL 传递

11
我正在尝试将参数传递给WordPress页面。我不想将其作为查询字符串传递。我希望将其作为基于斜杠的URL传递。
示例:
http://localhost/mysite/pagename?user=myname
into
http://localhost/mysite/pagename/myname

如何在wordpress自定义主题中使用functions.php文件实现这一目标?

2个回答

20

查看rewrite_rules_array似乎是不必要的 - 它更适用于重写规则的删除而不是添加规则...

使用functions.php

使用WordPress主题函数(functions.php),在任何重写规则更改后,将基于斜杠的URL作为GET参数传递给页面,需要2个步骤: 刷新重写规则 == 在管理中重新保存固定链接设置!

第1步 - add_rewrite_rule(...)

当尝试让它工作时,这可能有点令人困惑,因为add_rewrite_rule(...)的文档在何处定位重写以及如何通过slug定位页面并不太清楚...而且有一个重要的提示,即您每次更改此类内容时都需要刷新重写规则...

这对我很管用(WP 4.3.3)

add_action('init', function(){
   add_rewrite_rule( 
      '^yourPageSlug/([^/]+)([/]?)(.*)', 
      //!IMPORTANT! THIS MUST BE IN SINGLE QUOTES!:
      'index.php?pagename=yourPageSlug&user=$matches[1]', 
      'top'
   );   
});

参数:

  1. 用于匹配特定url结构的正则表达式
  2. 重写模板中,您应该针对 index.php 进行目标设置(如果它不是外部链接),因为WordPress中的所有url重写都通过它来完成
    • 使用 pagename GET 参数,将其设置为 您的页面slug
    • 使用占位符 $matches[indexStartingFrom1] 用于正则表达式匹配 - 它实际上只是一个占位符! ==> 请使用单引号将此字符串括起来!
  3. 'top' 或 'bottom'。'top' 将优先于WordPress现有规则,而 'bottom' 将首先检查所有其他规则是否匹配。默认值:"bottom"

步骤2 - 添加 query_vars

上面的步骤仅仅是一个目标,而不是传递变量本身...

由于WordPress将清除$_GET参数,只是将它们抛弃掉(因为它找不到任何合适的内容),所以我们需要通过添加我们的自定义query_vars 来告诉WordPress我们想使用它们。

尽管我们仍然无法通过 $_GET 超全局变量来检索它们,但是,
我们将能够使用 get_query_var(...) 来获取它们

我们通过添加一个query_vars 过滤器来告诉WordPress我们想要使用这些 GET 参数。

add_filter('query_vars', function( $vars ){
    $vars[] = 'pagename'; 
    $vars[] = 'user'; 
    return $vars;
});

最后一步:
刷新重写规则 == 重新保存永久链接设置!

用法

要获取GET参数"user"的值,请使用以下方法:

get_query_var( 'user' ) 

使用 .htaccess

如果可以的话,你还可以使用.htaccess规则(假设你的重写基础为/mysite/

RewriteRule ^pagename/([^/]+)$  pagename?user=$1

非常感谢这个;我已经试图弄清楚一段时间了。 - Sumeet Gohil

1

这里有一份详细的教程,可以帮助你接近目标:http://www.rlmseo.com/blog/passing-get-query-string-parameters-in-wordpress-url/

简单来说,你需要定义一些新的重写规则,然后通过add_filter('rewrite_rules_array', 'my_rewrite_rules');将它们挂载到WordPress上。

然而,按照该链接的示例,你得到的URL将是http://localhost/mysite/pagename/user/myname - 请注意/user/(你的查询变量名称)仍然包含在内。


你好,感谢您的回复。我尝试了网址中提到的方法。通过打印get_option('rewrite_rules'),我可以看到重写规则已经添加到WordPress中。但是,当我输入网址http://localhost/mysite/pagename/user/myname时,出现404页面未找到的错误。请帮忙解决。 - Jack Ant
更新:代码似乎对我的页面有一些影响。然而,重写规则没有正确地重定向。这是我所拥有的 add_rewrite_rule('(.*(mypage/user/(.*)?))' , 'index.php?pagename=mypage&user=$matches[1]','top'); 但是它将我重定向到[http://example.com/mypage]。 - Jack Ant
和我一样,@Jack Ant - Umair Hamid

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接