核心概念:URL 参数的类型
我们需要区分 URL 中常见的两种参数:

-
查询字符串参数:通过 分隔,多个参数用
&连接。- 示例:
https://example.com/blog?category=tech&author=john - 在这个例子中,
category和author就是查询字符串参数。
- 示例:
-
URL 片段/路径参数:是 URL 路径的一部分,通常用于自定义文章类型、分类法或页面结构。
- 示例:
https://example.com/profile/user-123 - 在这个例子中,
user-123是一个路径参数,它表示要查看 ID 为 123 的用户资料。
- 示例:
使用 get_query_var() (最推荐)
这是 WordPress 官方推荐且最安全的方法,专门用于获取 查询字符串参数,它不仅会直接从 URL 中获取,还会考虑 WordPress 的 Rewrite 规则,能正确处理被重写的 URL。
适用场景:获取 URL 中的 ?key=value 参数,或者通过 add_rewrite_rule() 自定义的 Rewrite 规则中的参数。

示例 1:获取标准查询参数
假设你的 URL 是 https://example.com/?s=wordpress&year=2025。
// 在主题的 functions.php 文件或自定义插件中
// 获取搜索关键词 's'
$search_query = get_query_var('s');
echo "搜索关键词: " . $search_query; // 输出: 搜索关键词: wordpress
// 获取自定义参数 'year'
$year = get_query_var('year');
echo "年份: " . $year; // 输出: 年份: 2025
示例 2:获取自定义查询参数
假设你想创建一个按作者筛选文章的页面,URL 是 https://example.com/blog?author_name=john。
// 在主题的 functions.php 文件或自定义插件中
// 获取自定义参数 'author_name'
$author_slug = get_query_var('author_name');
if ($author_slug) {
// 根据 slug 获取作者对象
$author = get_user_by('slug', $author_slug);
if ($author) {
echo "正在查看作者: " . $author->display_name;
} else {
echo "未找到该作者。";
}
}
示例 3:获取分页参数
分页参数(如 ?paged=2)是 WordPress 内置的,get_query_var() 也能完美处理。
$paged = get_query_var('paged');
if ($paged > 1) {
echo "当前是第 " . $paged . " 页。";
} else {
echo "这是首页。";
}
使用 $_GET 超全局变量
这是一种直接的 PHP 方法,可以获取所有通过 传递的查询字符串参数。但请注意,这种方法不经过 WordPress 的过滤和转义,直接使用有安全风险。

适用场景:当你确定参数是纯数据,并且需要进行严格的过滤和转义时,对于 WordPress 开发,get_query_var() 通常是更好的选择。
示例
// 获取参数 'id' $id = isset($_GET['id']) ? intval($_GET['id']) : 0; // 使用 intval() 确保是整数 // 获取参数 'name' $name = isset($_GET['name']) ? sanitize_text_field($_GET['name']) : ''; // 使用 sanitize_text_field() 清理文本 echo "ID: " . $id . ", Name: " . $name;
重要提示:如果你直接输出 $_GET 的值,一定要记得使用 esc_html() 或 esc_attr() 等函数进行转义,以防止 XSS 攻击。
// 错误示范 (有安全风险) echo $_GET['user_input']; // 正确示范 (安全) echo esc_html($_GET['user_input']);
获取 URL 片段/路径参数 (高级)
对于像 https://example.com/profile/user-123 这样的 URL,WordPress 的 Rewrite 规则会将 profile/user-123 映射到某个页面模板,你需要先注册这个规则,然后在模板文件中解析。
这个过程比查询字符串要复杂一些。
步骤 1:注册 Rewrite 规则
在 functions.php 中,你需要告诉 WordPress 如何处理这个新的 URL 结构。
// 在 functions.php 中
add_action('init', 'my_custom_rewrite_rule');
function my_custom_rewrite_rule() {
// 添加重写规则
// 正则表达式 'profile/([^/]+)/?$' 匹配 profile/ 后面跟任意非斜杠字符,直到 URL
// 'index.php?profile_page=$matches[1]' 将匹配到的部分(用户ID)作为参数 'profile_page' 传递给 index.php
add_rewrite_rule('^profile/([^/]+)/?$', 'index.php?profile_page=$matches[1]', 'top');
// 因为这是一个新的查询变量,WordPress 需要知道它的存在
add_filter('query_vars', 'my_custom_query_vars');
// (可选) 但为了确保它能正常工作,最好也刷新一下规则。
// 注意:这个函数只在需要时运行一次,例如在主题激活时。
// flush_rewrite_rules();
}
function my_custom_query_vars($vars) {
// 将 'profile_page' 添加到 WordPress 识别的查询变量列表中
$vars[] = 'profile_page';
return $vars;
}
重要:添加或修改了 Rewrite 规则后,你需要 刷新固定链接,只需进入 WordPress 后台 -> 设置 -> 固定链接,点击“保存更改”即可,这会自动调用 flush_rewrite_rules()。
步骤 2:创建页面模板
- 在 WordPress 后台创建一个普通的页面(标题为“Profile”,可以留空内容)。
- 在主题根目录下创建一个文件,命名为
page-profile.php,WordPress 会自动将这个模板应用于所有标题为“Profile”的页面。
步骤 3:在模板文件中获取参数
在 page-profile.php 文件中,使用 get_query_var() 来获取我们注册的参数。
// 在 page-profile.php 文件中
// 获取 'profile_page' 参数
$user_id = get_query_var('profile_page');
if ($user_id) {
// 现在你可以使用 $user_id 来查询数据库或调用函数
$user = get_user_by('id', $user_id);
if ($user) {
echo "<h1>" . esc_html($user->display_name) . " 的资料</h1>";
echo "<p>用户名: " . esc_html($user->user_login) . "</p>";
} else {
echo "<p>未找到该用户。</p>";
}
} else {
echo "<p>请提供一个有效的用户 ID。</p>";
}
当你访问 https://yoursite.com/profile/123 时,page-profile.php 模板就会被加载,$user_id 的值会是 123。
总结与最佳实践
| 方法 | 适用场景 | 优点 | 缺点 | 推荐度 |
|---|---|---|---|---|
get_query_var() |
获取查询字符串参数 (包括自定义的) | 官方推荐,安全,考虑 Rewrite 规则 | 不能直接获取原始 URL 片段 | ⭐⭐⭐⭐⭐ |
$_GET |
获取原始查询字符串 | 直接,简单 | 不安全,不处理 Rewrite 规则,需要手动过滤 | ⭐⭐ |
Rewrite + get_query_var() |
获取 URL 片段/路径参数 | 创建干净、SEO 友好的 URL | 设置复杂,需要刷新固定链接 | ⭐⭐⭐⭐ |
核心建议:
- 优先使用
get_query_var(),对于 95% 的获取 URL 参数的需求,这都是正确且安全的选择。 - 永远不要直接输出
$_GET的值,如果必须使用,请务必配合intval(),sanitize_text_field(),esc_html()等函数进行数据处理和转义。 - 对于复杂的 URL 结构(如
/profile/123),请使用 Rewrite 规则 +get_query_var()的组合,这是构建自定义 URL 的标准 WordPress 方式。
