如何实现WordPress从draft转publish时标题同义词替换的代码片段?
嘿,这需求我熟!用draft_to_publish钩子完全能搞定,我给你拆解清楚怎么实现,包括标题替换、slug更新,还帮你避开坑点:
核心思路&完整代码
首先,draft_to_publish钩子会自动传入当前的$post对象,你直接从这个对象里拿标题就行(本来就是字符串,不用额外转换)。然后定义替换规则,替换后更新文章的标题和slug就OK了,注意要避免无限循环哦:
function replace_title_on_publish($post) { // 可选:只处理文章类型,排除页面、自定义文章类型等 if ($post->post_type !== 'post') { return; } // 自定义你的替换规则:键=要替换的词,值=同义词 $replacements = array( '示例关键词' => '替换后的同义词', '草稿' => '正式发布', // 可以继续添加更多替换对 ); // 获取原标题(本身就是字符串,直接用) $original_title = $post->post_title; // 执行批量替换 $new_title = str_replace(array_keys($replacements), array_values($replacements), $original_title); // 如果标题没变化,直接返回,避免不必要的数据库操作 if ($new_title === $original_title) { return; } // 准备更新的数据:新标题+自动生成对应slug $update_args = array( 'ID' => $post->ID, 'post_title' => $new_title, // 用sanitize_title生成符合WordPress规范的slug 'post_name' => sanitize_title($new_title) ); // 关键:移除当前钩子,防止wp_update_post触发无限循环 remove_action('draft_to_publish', 'replace_title_on_publish'); // 更新文章 wp_update_post($update_args); // 重新添加钩子,确保后续其他文章发布时正常生效 add_action('draft_to_publish', 'replace_title_on_publish'); } add_action('draft_to_publish', 'replace_title_on_publish');
关键细节解释
标题的获取与替换
$post->post_title本身就是字符串类型,直接拿来用就行。用str_replace批量替换很方便,如果需要大小写不敏感或者正则匹配,换成preg_replace就行,比如:// 大小写不敏感替换"示例关键词" $new_title = preg_replace('/示例关键词/i', '替换后的同义词', $original_title);Slug的处理
用sanitize_title($new_title)可以自动把新标题转换成符合WordPress要求的slug(比如空格转横杠、去掉特殊字符)。如果你想保留原slug,删掉'post_name' => sanitize_title($new_title)这一行就行。避免无限循环
因为wp_update_post会触发一些文章更新的钩子,可能会再次触发draft_to_publish,所以在更新前先移除钩子,更新完再加回来,完美避免循环问题。
测试建议
你可以新建一篇草稿,标题里包含你设置的替换词,然后点击发布,看看标题和slug是不是都按预期更新了~
内容的提问来源于stack exchange,提问作者Lukas Rabon
相关产品推荐
相关产品推荐

