如何将ACF字段的逗号分隔字符串用于str_ireplace?WordPress过滤器问题
问题分析&解决方案
嘿,我一眼就发现问题所在啦!你代码里的核心问题出在对数组类型的误解上:
- 你用
explode(",", $censored)把逗号分隔的字符串转成数组后,得到的是索引数组(比如["脏话1", "脏话2"]),而不是关联数组。 - 这时候调用
array_keys($censored)拿到的是[0, 1]这类数字键,根本不是你要过滤的违禁词,自然没办法正确替换啦!
修正后的代码
下面是调整后的完整代码,还顺便处理了可能的空格问题(比如字段里的"脏话1, 脏话2"带空格的情况):
function customforumcontent($content) { // 获取逗号分隔的违禁词字符串 $censored_str = get_field('banned_words_list', 'option'); // 先判断字段是否为空,避免后续出错 if (empty($censored_str)) { return $content; } // 分割成数组,并去除每个词前后的空格 $censored_words = array_map('trim', explode(",", $censored_str)); // 替换内容 $replace = '<b>[censored]</b>'; $content = str_ireplace($censored_words, $replace, $content); return $content; } add_filter('asgarosforum_filter_post_content', 'customforumcontent');
关键改进点
- 去掉了错误的
array_keys调用,直接把清洗后的违禁词数组传给str_ireplace,因为这个函数支持直接用数组作为查找目标。 - 用
array_map('trim', ...)处理每个违禁词,避免因为逗号后带空格导致匹配失败(比如用户输入"傻X, 笨蛋"时,不会出现匹配不到"笨蛋"的情况)。 - 增加了空值判断,当后台没设置违禁词时直接返回原内容,避免不必要的数组操作。
内容的提问来源于stack exchange,提问作者TripsLeft
相关产品推荐
相关产品推荐

