You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何阻止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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.15 10:19:31