You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在产品标题更新时自动更新产品的slug?

如何在产品标题更新时自动更新产品的slug?

嘿,我来帮你搞定这个问题!你之前尝试用wp_update_post却遇到不少冲突,大概率是没处理好钩子的触发逻辑,导致了无限循环或者重复更新的问题——这在WordPress的钩子回调里很常见。

下面给你一个靠谱的解决方案,专门针对产品(比如WooCommerce产品)标题更新时同步更新slug,完全避免冲突:

核心代码实现

add_action('save_post_product', 'update_product_slug_on_title_change', 10, 3);
function update_product_slug_on_title_change($post_id, $post, $update) {
    // 跳过自动保存、修订版本和首次创建(只处理更新操作)
    if (wp_is_post_autosave($post_id) || wp_is_post_revision($post_id) || !$update) {
        return;
    }

    // 验证用户编辑权限
    if (!current_user_can('edit_product', $post_id)) {
        return;
    }

    // 获取原始标题与提交的新标题,对比是否有修改
    $original_title = get_post_field('post_title', $post_id, 'raw');
    $current_submitted_title = $_POST['post_title'] ?? $original_title;

    // 只有当标题确实发生变化时,才更新slug
    if ($original_title !== $current_submitted_title) {
        // 临时移除当前钩子,防止wp_update_post触发save_post导致无限循环
        remove_action('save_post_product', 'update_product_slug_on_title_change', 10);

        // 根据新标题生成干净的slug
        $new_slug = sanitize_title($current_submitted_title);

        // 执行更新操作,只修改slug字段
        wp_update_post([
            'ID' => $post_id,
            'post_name' => $new_slug
        ]);

        // 更新完成后重新添加钩子,不影响后续操作
        add_action('save_post_product', 'update_product_slug_on_title_change', 10, 3);
    }
}

关键细节说明

  • 精准钩子触发:用save_post_product而非通用的save_post,只针对WooCommerce产品类型生效,减少不必要的触发
  • 过滤无效场景:跳过自动保存、修订版,只处理手动编辑后的更新操作
  • 避免无限循环:更新slug前临时移除钩子,更新完成后再重新添加,彻底解决wp_update_post触发重复钩子的问题
  • 权限验证:确保只有有权限编辑产品的用户操作才会触发更新,提升安全性

额外注意事项

  • 如果你使用的是自定义文章类型而非WooCommerce产品,只需把代码里的product替换成你的自定义文章类型名称即可
  • 代码建议添加到主题的functions.php文件,或者创建一个简单的自定义插件来存放,不要直接修改WordPress核心文件
  • 测试前记得备份网站数据,避免意外情况

备注:内容来源于stack exchange,提问作者Jeriss Cloud Center

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.15 14:25:28