如何阻止WordPress中特定插件的自定义字段“hits”在更新文章时被覆盖
如何阻止WordPress中特定插件的自定义字段“hits”在更新文章时被覆盖
我完全懂你遇到的麻烦——当你在后台编辑文章时,实时更新的「hits」浏览量字段会被编辑页面加载时的旧值覆盖,这段时间里新增的访问量直接丢失了,确实挺闹心的。你已经试了三种方法都没成功,我来帮你捋捋问题出在哪,再给你靠谱的解决方案。
先说说你之前的尝试为什么没起作用:
- 第一种用
pre_update_post_meta的方法,你返回true其实不对,这个过滤器返回非null值会替换要更新的元值,但true转成整数是1,等于把hits改成1了,完全不是你要的效果。 - 第二种
save_post的方法,问题出在你又调用了update_post_meta,而且时机不对——插件本身的保存逻辑可能比你的动作优先级更高,而且表单里的旧值已经在排队更新了,你再存一遍也拦不住。 - 第三种改插件代码的方式,虽然注释了
update_post_meta,但插件的逻辑里还是会处理表单提交的hits值,而且直接改插件代码最大的问题是:下次插件一更新,你的修改就没了,太折腾。
接下来给你两个可行的方案,优先推荐第一个,不用碰插件代码:
方案一:用过滤器拦截hits字段的更新(推荐)
我们可以利用pre_update_post_meta过滤器,在WordPress准备更新hits字段时,强制它使用数据库里的最新值,而不是表单提交的旧值。代码如下:
function preserve_latest_hits_count($new_value, $object_id, $meta_key, $old_value) { // 只对hits字段做特殊处理 if ('hits' === $meta_key) { // 从数据库获取当前最新的hits值 $latest_hits = get_post_meta($object_id, 'hits', true); // 如果最新值存在就返回它,否则保留原提交值(防止字段被清空) return $latest_hits ? $latest_hits : $new_value; } // 其他字段正常处理 return $new_value; } // 把优先级设得高一点(99),确保在插件的更新逻辑之前生效 add_filter('pre_update_post_meta', 'preserve_latest_hits_count', 99, 4);
把这段代码加到你的主题functions.php或者自定义插件里就行。原理很简单:每次要更新hits字段时,我们直接拿数据库里实时更新的最新浏览量来替换表单里的旧值,这样保存文章时就不会覆盖新增的访问量了。
方案二:修改插件的保存逻辑(不推荐,除非必须)
如果你实在不想用过滤器,也可以直接修改插件里的adminSave方法,彻底跳过hits字段的更新逻辑。修改后的代码如下:
public function adminSave( $post_id ) { // skip for autosave if( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE ) { return; } // ******** 注释掉所有hits字段的更新逻辑 ******** // 原来的hits更新代码全部注释或删除,不再处理表单里的旧hits值 // update hits count // if( isset($_POST['post_type']) && in_array( $_POST['post_type'], array( 'post', 'page' ) ) ) // { // $hits = ( isset($_POST['hits']) && !empty($_POST['hits']) ? intval( preg_replace( '/[^0-9]/', '', $_POST['hits'] ) ) : 0 ); // if( $hits > 0 ) // { // $hits_exists = get_post_meta( $post_id, 'hits', true ); // if( $hits_exists===false ) // { // add_post_meta( $post_id, 'hits', $hits, true ); // } // else // { // /*update_post_meta( $post_id, 'hits', $hits );*/ /* HERE */ // } // } // } // clear Popular Posts Widget $ahc_ppw = new AJAX_Hits_Counter_Popular_Posts_Widget(); $ahc_ppw->clearCache(); return true; }
这样修改后,插件在保存文章时就完全不会碰hits字段了,自然也就不会覆盖实时更新的数值。但要注意:插件更新后你的修改会被覆盖,所以每次更新插件都要重新改一遍,或者你可以自己做个小插件来重写这个方法(步骤稍复杂,这里就不多展开了)。
最后测试一下:
找一篇文章,先让几个访问量进来(比如hits涨到20),然后打开编辑页面,再让几个访问量进来(hits变成25),保存文章后看看hits值是不是25,如果是的话就成功了!
备注:内容来源于stack exchange,提问作者Jonathan - Service Web ARYUP
相关产品推荐
相关产品推荐

