如何在产品标题更新时自动更新产品的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
相关产品推荐
相关产品推荐

