我们注意到 article_edit.php 中处理 slug 的逻辑与 article_add.php 不一致:当 slug 为空时,article_edit.php 只调用了 createSlug($title),而没有检查唯一性。此外,如果用户编辑时将 slug 留空,应该重新生成(并且避免与当前文章之外的 slug 冲突)。因此,需要将 article_edit.php 中生成 slug 的代码修改为与添加文章一致(包括唯一性检查,但要排除当前文章自身)。
修改 article_edit.php 中对应的处理代码(位于 if (empty($slug)) { ... } 部分),将其替换为:
if (empty($slug)) { // 如果标题也空,则使用临时标题 $tempTitle = $title ?: '未命名文章'; $slug = preg_replace('/[^a-zA-Z0-9\s]/', '', $tempTitle); $slug = strtolower(trim(preg_replace('/\s+/', '-', $slug))); if (empty($slug)) $slug = 'post'; // 唯一性检查,排除当前文章自身 $original = $slug; $count = 1; while (true) { $exists = $db->fetch("SELECT id FROM article WHERE slug = ? AND id != ?", [$slug, $id]); if (!$exists) break; $slug = $original . '-' . $count++; } }
注意:需要确保 $id 已经在前面定义(当前文章 ID)。如果 $slug 不为空,还要额外检查是否与其他文章重复(除了自身),如果重复可以追加数字。但为了简化,可保持现有逻辑(因为编辑时用户可能手动输入,重复时会导致数据库错误,所以最好也做唯一性检查)。因此更完整的编辑逻辑应如下:
if (empty($slug)) { // 自动生成 $tempTitle = $title ?: '未命名文章'; $slug = preg_replace('/[^a-zA-Z0-9\s]/', '', $tempTitle); $slug = strtolower(trim(preg_replace('/\s+/', '-', $slug))); if (empty($slug)) $slug = 'post'; $original = $slug; $count = 1; while ($db->fetch("SELECT id FROM article WHERE slug = ? AND id != ?", [$slug, $id])) { $slug = $original . '-' . $count++; } } else { // 用户输入了 slug,也要检查唯一性(排除当前文章) $originalSlug = $slug; $count = 1; while ($db->fetch("SELECT id FROM article WHERE slug = ? AND id != ?", [$slug, $id])) { $slug = $originalSlug . '-' . $count++; } }
但用户输入时可能希望使用自定义 slug,如果重复自动添加后缀可能改变用户意图。更好的做法是:如果重复则给出错误提示,让用户手动修改。不过从用户体验角度,简单自动添加后缀也可以接受。根据您之前添加文章的做法(唯一性检查并添加数字后缀),建议在编辑时也采用相同策略。
因此,将 article_edit.php 中处理 slug 的整个代码段替换为:
if (empty($slug)) { // 自动生成 $tempTitle = $title ?: '未命名文章'; $slug = preg_replace('/[^a-zA-Z0-9\s]/', '', $tempTitle); $slug = strtolower(trim(preg_replace('/\s+/', '-', $slug))); if (empty($slug)) $slug = 'post'; $original = $slug; $count = 1; while ($db->fetch("SELECT id FROM article WHERE slug = ? AND id != ?", [$slug, $id])) { $slug = $original . '-' . $count++; } } else { // 用户手动输入,也需检查唯一性(排除当前文章) $originalSlug = $slug; $count = 1; while ($db->fetch("SELECT id FROM article WHERE slug = ? AND id != ?", [$slug, $id])) { $slug = $originalSlug . '-' . $count++; } }
注意:createSlug 函数已存在,但它的实现与您手动写的正则可能略有不同,为了统一,建议都使用相同的生成逻辑,直接使用 createSlug($title) 而不是重复写正则。不过您当前已经在 article_add.php 中使用了正则,为了保持一致,可以继续使用正则方法。另外,createSlug 函数可能没有唯一性检查,因此最好统一使用上述代码。
请根据您的喜好选择一致的方法。我推荐使用 createSlug($title) 生成基础 slug,再附加唯一性检查,这样代码更简洁。下面是修改后的示例:
if (empty($slug)) { $slug = createSlug($title); if (empty($slug)) $slug = 'post'; $original = $slug; $count = 1; while ($db->fetch("SELECT id FROM article WHERE slug = ? AND id != ?", [$slug, $id])) { $slug = $original . '-' . $count++; } } else { // 用户手动输入,也需检查唯一性(排除当前文章) $originalSlug = $slug; $count = 1; while ($db->fetch("SELECT id FROM article WHERE slug = ? AND id != ?", [$slug, $id])) { $slug = $originalSlug . '-' . $count++; } }
注意:createSlug 函数已在 functions.php 中定义,可直接使用。同时确保 $id 已经定义。
最终,将 article_edit.php 中的 if (empty($slug)) { ... } 部分替换为上述代码即可。
完成修改后,测试编辑文章时留空 slug 或输入重复 slug 的情况。
发表评论 (0)
留下你的足迹