核心概念:URL 的结构
一个标准的 URL 看起来像这样:
https://example.com/path/to/page?query_string#fragment

- (问号):后面是查询字符串,这是我们传递参数的主要区域。
&(和号):用于分隔多个不同的参数。- (井号):后面是片段标识符,通常用于页面内部定位,不会被发送到服务器,所以不能用于传递参数给 WordPress。
示例:
https://example.com/my-page?product_id=123&color=blue
这里有两个参数:
product_id,值为123color,值为blue
使用 add_query_arg() 和 remove_query_arg() (最推荐)
这是 WordPress 官方推荐的最佳实践,它有几个巨大优点:
- 安全性:自动对参数进行 URL 编码,防止 XSS(跨站脚本)攻击。
- 易用性:代码简洁,无需手动拼接 URL。
- 兼容性:自动处理 URL 中是否已存在查询字符串的情况。
在 PHP 中添加和构建 URL
如果你想在自己的主题或插件代码中生成一个带参数的链接,应该使用 add_query_arg()。
函数签名:
add_query_arg( $params, $url );

$params:一个关联数组,包含参数名和参数值。['key' => 'value']。$url(可选):要添加参数的基础 URL,如果省略,则使用当前页面的 URL。
示例代码:
假设你有一个文章链接,想在点击后添加一个来源参数。
// 1. 定义基础链接
$post_permalink = get_permalink( 123 ); // 假设文章ID是123
// 2. 定义要添加的参数
$new_params = array(
'source' => 'newsletter',
'user_id' => 456
);
// 3. 使用 add_query_arg() 生成最终的URL
$final_url = add_query_arg( $new_params, $post_permalink );
// 输出结果
echo $final_url;
// 会输出类似: https://example.com/my-awesome-post?source=newsletter&user_id=456
在 PHP 中移除参数
如果你想从一个 URL 中移除某个参数,可以使用 remove_query_arg()。
示例代码:
$url_with_params = 'https://example.com/my-page?product_id=123&color=blue'; // 只想移除 'color' 参数 $url_without_color = remove_query_arg( 'color', $url_with_params ); echo $url_without_color; // 会输出: https://example.com/my-page?product_id=123 // 想移除多个参数 $params_to_remove = array( 'product_id', 'color' ); $url_clean = remove_query_arg( $params_to_remove, $url_with_params ); echo $url_clean; // 会输出: https://example.com/my-page
在 WordPress 编辑器中手动添加 (简单直接)
如果你只是想在后台编辑文章或页面时,给某个链接手动加上参数,这是最快的方法。
操作步骤:
- 在 WordPress 后台,编辑文章或页面。
- 选中你想要添加参数的链接文字。
- 点击编辑器工具栏上的“插入/编辑链接”按钮(链接图标)。
- 在弹出的对话框中,在 URL 输入框的末尾,手动输入
?参数名=参数值。 - 如果要添加多个参数,用
&连接,?product_id=123&color=blue。 - 点击“更新”或“插入”。
优点:
- 无需代码,非常直观。
缺点:
- 不适合动态参数(比如根据用户ID变化)。
- 如果链接目标改变,需要手动修改。
在主题文件中硬编码 (不推荐,但需了解)
在某些非常特定的场景下,你可能会在主题的 functions.php 或模板文件(如 page.php)中直接输出一个硬编码的链接。
示例代码:
// 在模板文件中 echo '<a href="https://example.com/contact?form_type=support">联系我们</a>';
为什么不推荐?
- 维护性差:如果将来网站更换域名或链接结构,需要手动找到所有硬编码的地方进行修改。
- 安全性差:如果参数来自用户输入,必须手动进行
esc_url()或urlencode()处理,否则容易有安全风险。
如何在接收端获取和使用参数?
创建了带参数的链接后,最重要的就是如何在目标页面获取并处理这些参数,WordPress 提供了 $_GET 这个超全局变量来获取查询字符串。
安全警告:直接使用 $_GET 变量是不安全的!必须对其进行净化和验证,以防止 SQL 注入、XSS 等攻击。
安全地获取参数:使用 filter_input()
这是 PHP 官方推荐的安全获取输入变量的方法。
示例代码 (在目标页面的模板文件或 functions.php 中):
假设你的链接是 https://example.com/my-page?user_id=456&debug=true
// 1. 安全地获取 'user_id' 参数,并确保它是一个整数
$user_id = filter_input( INPUT_GET, 'user_id', FILTER_SANITIZE_NUMBER_INT );
// 2. 检查参数是否存在并且有效
if ( $user_id ) {
// 参数存在且是数字,可以安全地使用
echo "欢迎,用户 ID: " . esc_html( $user_id ) . "!";
// 可以在这里进行数据库查询等操作
// $user_data = get_userdata( $user_id ); // WordPress 函数,示例
} else {
// 参数不存在或无效
echo "未提供有效的用户 ID。";
}
// 3. 安全地获取 'debug' 参数,并检查它是否为 'true'
$debug_mode = filter_input( INPUT_GET, 'debug', FILTER_SANITIZE_STRING );
if ( $debug_mode === 'true' ) {
// 只在调试模式下显示一些信息
echo "<!-- 调试信息已开启 -->";
}
WordPress 推荐的辅助函数:get_query_var()
WordPress 提供了 get_query_var() 函数来获取查询变量,它比直接使用 $_GET 更“WordPress化”。
注意:默认情况下,get_query_var() 只能获取 WordPress 内置的查询变量(如 p, cat, page 等),对于自定义参数,你需要先注册它。
步骤 1:在 functions.php 中注册你的查询变量
add_filter( 'query_vars', 'my_custom_query_vars' );
function my_custom_query_vars( $vars ) {
// 添加你的自定义变量名
$vars[] = 'my_product_id';
$vars[] = 'my_source';
return $vars;
}
步骤 2:在模板文件中使用 get_query_var() 获取
// 现在你可以安全地获取自定义变量了
$product_id = get_query_var( 'my_product_id', 0 ); // 如果变量不存在,则返回 0
$source = get_query_var( 'my_source' );
if ( $product_id ) {
echo "正在查看产品 ID: " . esc_html( $product_id );
// ... 你的产品展示逻辑
}
链接如何构建?
当你注册了 my_product_id 这个变量后,你仍然应该用 add_query_arg() 来构建链接:
$url = add_query_arg( 'my_product_id', 99, get_permalink() );
WordPress 会自动识别这个变量。
总结与最佳实践
| 场景 | 推荐方法 | 优点 |
|---|---|---|
| 在 PHP 代码中生成链接 | add_query_arg() |
安全、简洁、官方推荐 |
| 在后台编辑器中添加链接 | 手动在 URL 后添加 ?key=value |
简单、快速、无需代码 |
| 在接收端获取参数 | filter_input(INPUT_GET, ...) |
PHP 官方安全方法,防止 XSS/SQL 注入 |
| 获取 WordPress 风格的自定义参数 | add_filter('query_vars', ...) + get_query_var() |
更符合 WordPress 体系,代码更清晰 |
| 绝对避免 | 直接拼接字符串或直接使用 $_GET |
有严重安全风险,维护性差 |
记住核心原则:
- 生成链接时,用
add_query_arg()。 - 接收参数时,永远不要信任用户输入,先净化后使用。
filter_input()是你的好朋友。
