
本文介绍如何在wordpress插件中实现“每行内容仅使用一次”的功能:从文本文件随机读取一行生成分享链接后,立即将该行从原文件中永久删除,并更新文件内容。
本文介绍如何在wordpress插件中实现“每行内容仅使用一次”的功能:从文本文件随机读取一行生成分享链接后,立即将该行从原文件中永久删除,并更新文件内容。
在实际开发中,常需从预置列表(如产品名、关键词或URL路径)中随机选取一项用于动态生成社交分享链接,同时确保每项仅被使用一次——例如避免重复分享同一商品或页面。您当前的代码已能正确读取并随机选取一行,但缺少关键的持久化清理步骤:即把已使用的行从 file1.txt 中真正移除。
以下是优化后的完整逻辑(含错误处理与健壮性增强):
$fileNames = 'file1.txt';
// 1. 安全读取文件(检查是否存在且可读)
if (!file_exists($fileNames) || !is_readable($fileNames)) {
error_log("Error: Cannot read file {$fileNames}");
return;
}
$lines = file($fileNames, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);
// 2. 检查是否还有可用行
if (empty($lines)) {
error_log("Warning: No available lines left in {$fileNames}");
return;
}
// 3. 随机选取并移除该行
$randomLineKey = array_rand($lines);
$randomLine = $lines[$randomLineKey];
unset($lines[$randomLineKey]);
// 4. 构建分享链接(注意:修正原始代码中的拼写错误 & URL 格式)
$bom = "http://example.com/" . rawurlencode(trim($randomLine)); // 使用 rawurlencode 防止特殊字符出错
$get_link = wp_get_link($bom . '/' . $post_id, $post->post_content);
// 5. 【核心步骤】将剩余行写回原文件,实现“已用即删”
file_put_contents($fileNames, implode(PHP_EOL, $lines));
// 可选:记录日志便于调试
error_log("Used and removed line: '{$randomLine}' from {$fileNames}");
⚠️ 重要注意事项:
-
文件权限:确保 Web 服务器对
file1.txt具有写权限(如chmod 644或664),否则file_put_contents()将失败; - 并发安全:若网站流量高、多用户同时触发分享,可能出现竞态条件(两个请求同时读取相同文件,导致某行被重复使用或丢失)。生产环境建议改用数据库存储 + 行级锁,或引入临时锁文件机制;
-
URL 安全性:使用
rawurlencode()对$randomLine编码,防止空格、斜杠等字符破坏 URL 结构; -
空行与空白符:
FILE_SKIP_EMPTY_LINES和trim()可有效过滤文件中的空行及首尾空格,提升鲁棒性。
通过以上改造,每次成功分享后,file1.txt 将实时更新为剩余未使用的条目,真正实现“用完即删”的语义目标。










