WordPress文章标题入库前修改失败求助:已尝试多个钩子但均无效
问题分析与解决方案
你遇到的问题主要是钩子选择错误和过滤器未返回处理后的数据导致的,咱们一步步理清楚:
核心错误点
content_save_pre不处理标题:这个钩子只负责过滤文章的内容(post_content字段),完全碰不到post_title,所以用它修改标题肯定没用。wp_insert_post_data过滤器没返回数据:你之前注释的这个钩子其实是正确的选择,但函数里没有return $data——过滤器的规则是必须返回处理后的变量,否则WordPress会忽略你的修改,直接用原始数据。pre_post_update动作参数不匹配:这个动作的参数是($post_ID, $postarr),但你的函数定义是($data, $postarr),参数对应不上,所以也无法正常工作。
修正后的代码
把下面的代码替换你原来的片段即可:
function filter_post_numbers( $data , $postarr ) { // 修改文章标题 $unwantedNumbers = array('8 of ','9 of ','10 of ','11 of ','12 of ','13 of ','14 of ','15 of ','16 of ','17 of ','18 of ','19 of ','20 of ','21 of ','22 of ','23 of ','24 of ','25 of ','26 of ','27 of ','28 of ','29 of ','30 of ','31 of ','32 of ','33 of ','34 of ','35 of ','36 of ','37 of ','38 of ','39 of ','40 of ','41 of ','42 of ','43 of ','44 of ','45 of ','46 of ','47 of ','48 of ','49 of ','50 of ','51 of ','52 of ','53 of ','54 of ','55 of ','56 of ','57 of ','58 of ','59 of ','8','9','10 ','11 ','12 ','13 ','14 ','15 ','16 ','17 ','18 ','19 ','20 ','21 ','22 ','23 ','24 ','25 ','26 ','27 ','28 ','29 ','30 ','31 ','32 ','33 ','34 ','35 ','36 ','37 ','38 ','39 ','40 ','41 ','42 ','43 ','44 ','45 ','46 ','47 ','48 ','49 ','50 ','51 ','52 ','53 ','54 ','55 ','56 ','57 ','58 ','59'); foreach ($unwantedNumbers as &$word) { $word = '/\b' . preg_quote($word, '/') . '\b/'; } $data['post_title'] = preg_replace($unwantedNumbers, '', $data['post_title']); // 关键:必须返回修改后的$data数组,否则修改不会生效 return $data; } // 启用正确的过滤器,优先级99确保在其他钩子之后执行,接受2个参数 add_filter( 'wp_insert_post_data' , 'filter_post_numbers' , 99, 2 );
额外说明
wp_insert_post_data是处理文章插入/更新前数据的最佳钩子,它能覆盖新增文章和编辑文章两种场景,而且可以通过$postarr参数判断当前操作的类型(比如$postarr['ID']是否存在来区分新增还是更新)。- 你的正则处理部分是没问题的,用
preg_quote避免特殊字符干扰,\b确保匹配完整的单词/短语,不会误删标题中包含这些数字的其他内容。
内容的提问来源于stack exchange,提问作者Brian Brown PhD
相关产品推荐
相关产品推荐

