wp_nonce_url函数用于生成带一次性验证令牌(nonce)的 url,主要用于验证通过url发起的请求(如链接点击、GET 方式的操作)的合法性,防止跨站请求伪造(CSRF攻击)。
当你需要通过url执行敏感操作(如删除数据、更新设置、提交参数等)时,直接暴露url可能被恶意利用(例如黑客伪造链接诱导用户点击,执行非预期操作)。wp_nonce_url() 会在url中附加一个随机生成的nonce令牌,确保该请求是用户在你的网站上主动发起的,而非第三方伪造。
wp_nonce_url($actionurl, $action, $name);
$actionurl(字符串,必填):需要附加nonce的原始url(如操作链接、处理脚本地址)
$action(字符串/整数,可选):nonce绑定的 “操作名称”(用于区分不同场景,如 “delete_post”),默认值为 -1
$name(字符串,可选):url中nonce参数的名称(即 query 键名),默认值为 _wpnonce
// 原始操作 URL(假设通过 admin-post.php 处理删除)$original_url = admin_url('admin-post.php?action=delete_my_post&id=123');// 生成带 nonce 的 URL(操作名称为 "delete_post_123",绑定具体文章 ID 更安全)$secure_url = wp_nonce_url($original_url,'delete_post_123', // 操作名称(建议包含唯一标识,如 ID)'post_delete_nonce' // nonce 参数名(可选,默认 _wpnonce));// 输出链接echo '<a href="' . esc_url($secure_url) . '" onclick="return confirm(\'确定删除?\')">删除文章</a>';
生成的 URL 类似:
https://yourdomain.com/wp-admin/admin-post.php?action=delete_my_post&id=123&post_delete_nonce=5f8d5a5b5c
其中 post_delete_nonce=5f8d5a5b5c 就是附加的 nonce 令牌
生成带 nonce 的 URL 后,必须在处理请求的后端逻辑中验证 nonce 有效性,否则无法发挥安全作用
// 在 functions.php 中注册处理函数(通过 admin-post.php 接收请求)add_action('admin_post_delete_my_post', 'handle_post_deletion'); // 登录用户add_action('admin_post_nopriv_delete_my_post', 'handle_post_deletion'); // 非登录用户(根据需求选择)function handle_post_deletion() {// 1. 检查 nonce 参数是否存在if (!isset($_GET['post_delete_nonce'])) {wp_die('安全验证失败:未找到验证令牌');}// 2. 验证 nonce 有效性(参数:URL 中的 nonce 值、对应的 $action 名称)$nonce_valid = wp_verify_nonce($_GET['post_delete_nonce'], 'delete_post_123');if (!$nonce_valid) {wp_die('安全验证失败:无效的令牌');}// 3. 验证通过后,执行删除逻辑(示例)$post_id = intval($_GET['id']);if (wp_delete_post($post_id)) {wp_redirect(admin_url('edit.php?message=deleted')); // 跳转成功页} else {wp_die('删除失败');}exit;}

