如何修改WooCommerce产品标题替换PHP脚本以支持多关键词批量替换
WooCommerce 产品标题替换脚本调整方案
问题1:保证所有匹配内容正常替换的调整方法
你现有脚本的核心问题是未限制钩子生效范围,会误替换全站所有内容的标题,调整逻辑如下:
- 加生效范围判断:通过
get_post_type判断当前内容为产品,同时加!is_admin()避免后台的产品标题也被替换,符合绝大多数场景的使用需求。 - 大小写匹配适配:原生
str_replace是大小写敏感的,如果需要兼容不同大小写的匹配(比如同时匹配Mens Watch/mens watch/MENS WATCH),把str_replace替换为str_ireplace即可。 - 动态替换/永久修改区分:你现在用的方案是前端显示时动态替换,不会修改数据库存储的原始标题,如果需要永久修改所有产品的存储标题,可使用后文给出的一次性批量更新脚本。
调整后的单关键词替换可用代码:
add_filter( 'the_title', 'change_product_title', 10, 2 ); function change_product_title( $title, $id ) { // 仅前端产品标题生效,不需要限制后台的话删掉!is_admin()判断即可 if ( ! is_admin() && get_post_type( $id ) === 'product' ) { $find = 'Mens Watch'; $replace_with = 'Herreur'; $title = str_replace( $find, $replace_with, $title ); } return $title; }
问题2:多关键词批量同步替换实现
str_replace原生支持数组参数,只需要把查找词、替换词按一一对应关系写成数组即可,代码示例如下:
add_filter( 'the_title', 'change_product_title', 10, 2 ); function change_product_title( $title, $id ) { if ( ! is_admin() && get_post_type( $id ) === 'product' ) { // 查找词数组,和下方替换词按顺序一一对应 $find = [ 'Mens Watch', 'Womens Watch', 'Kids Watch' ]; $replace_with = [ 'Herreur', 'Dameur', 'Børneur' ]; // 批量替换所有匹配项 $title = str_replace( $find, $replace_with, $title ); } return $title; }
注意事项
如果查找的关键词存在包含关系,需要把更长的关键词放在数组靠前位置,比如要同时替换Mens Watch Premium和Mens Watch,要把Mens Watch Premium放在$find数组的前面,避免短关键词先被替换后长关键词无法匹配。
可选:永久修改数据库产品标题脚本
如果需要直接修改数据库中存储的产品标题,不需要每次加载动态替换,可以使用以下一次性脚本,管理员登录后访问后台执行一次即可,执行完立刻删除脚本:
add_action('admin_init', 'batch_update_product_titles'); function batch_update_product_titles() { // 仅管理员可执行 if (!current_user_can('manage_options')) return; $products = get_posts([ 'post_type' => 'product', 'posts_per_page' => -1, 'post_status' => 'any' ]); // 按需求配置查找和替换数组 $find = [ 'Mens Watch', 'Womens Watch' ]; $replace_with = [ 'Herreur', 'Dameur' ]; foreach ($products as $product) { $updated_title = str_replace($find, $replace_with, $product->post_title); if ($updated_title !== $product->post_title) { wp_update_post([ 'ID' => $product->ID, 'post_title' => $updated_title ]); } } echo '所有产品标题批量更新完成,现在请删除该段代码'; die; }
内容的提问来源于stack exchange,提问作者Dev.Hjer.
相关产品推荐
相关产品推荐

