在使用WordPress MU作为CMS二次开发一个多用户多站点的网站,遇到了一个问题:在修改文章分类(category)名字的时候,这个名字对应的分类ID(cat_id)也会发生变化,这样就没有办法建立一个统一的网站分类框架,也就没办法批量操作。

为了解决这个问题,开始从后台修改分类的页面查起,逐渐找到问题所在,路径如下:

wp-admin/category.php在category.php页面查看源文件找到修改分类的表单action指向category.php,同时传递了名为action值为editedcat的隐藏表单变量;于是查看category.php源码,找到关键词editedcat,发现处理传入的POST表单变量是被wp_update_category()这个函数处理的;在wp-admin/includes/taxonomy.php文件里找到这个函数的定义,这个函数又调用了wp_insert_category()函数。函数wp_insert_category()首先判断是更新(updating)还是新增(creating),如果是update,则调用函数wp_update_term(),否则调用wp_insert_term();于是继续顺藤摸瓜在wo-includes/taxonomy.php文件里找到wp_update_term(),在函数体内部有一句引起注意:$args = apply_filters( ‘pre_update_term’, $term, $taxonomy, $args ); // MU only,同时我在单用户版本的Wordpress上测试修改分类,其分类id并没有发生变化,于是基本可以断定问题出在这段语句上,注释掉之后,再修改分类进行测试,id不再发生变化,问题解决。

在新版的WordPress MU中,pre_update_term被get_term替代了