当我更新帖子时阻止特定插件自定义字段更新 - WordPress

问题描述 投票:0回答:1

我正在使用特定的插件来计算我的帖子浏览量。

它将值存储在名为“hits”的 postmeta 自定义字段中,并且该值会实时更新。

我刚刚注意到,当我作为管理员编辑帖子时,“点击量”值在我编辑帖子时不会增加。

当我想到这似乎很合乎逻辑,因为如果当我进入帖子版本时“点击”值是 15,那么当我完成我的帖子版本时它仍然是 15,因为当我更新帖子时所有帖子元都会更新。所以,即使有 10 多个人访问了我的帖子,我的帖子计数器在应该显示 25 时仍然显示 15 的值。

所以现在我正在非常努力地用我的低 PHP 技能来阻止这个字段在我更新我的帖子时被更新。

我尝试了不同的方法,但没有一个有效:

  1. 在使用以下代码保存我的帖子之前,我尝试阻止更新此元数据:
function exclude_hits_from_update($null, $object_id, $meta_key, $meta_value) {
        if ('hits' === $meta_key) {
            return true; 
        }
            return $null;
    }
    add_filter('pre_update_post_meta', 'exclude_hits_from_update', 10, 4);
  1. 我还尝试了此代码,以便在更新帖子之前尝试获取元数据的值,但它也不起作用(似乎这只是创建更多名为“hits”的自定义字段):
function prevent_hits_field_update( $post_id, $post, $update ) {

    if ( defined('DOING_AUTOSAVE') && DOING_AUTOSAVE ) {
        return;
    }
    if ( isset($_POST['hits']) ) {
        $current_hits = get_post_meta($post_id, 'hits', true);
        update_post_meta($post_id, 'hits', $current_hits);
    }
}
add_action('save_post', 'prevent_hits_field_update', 10, 3);
  1. 我还尝试直接修改插件本身中的 save_post 函数(通过注释“update_post_meta”行,但我知道这还不够:
public function adminSave( $post_id )
    {
        // skip for autosave
        if( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE ) 
        {
            return;
        }

        // 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;
    }

有人可以帮我吗?不幸的是,我还不能更改插件,因为它链接到我网站上的几个块,并且他使用了一些有效的缓存方法。

预先感谢您的帮助! 乔纳森

php wordpress metadata custom-fields
1个回答
0
投票

Jonathan,问题在于防止在保存后过程中命中字段被覆盖。以下是有效解决此问题的方法:

解决方案

我们需要确保保存帖子时

hits
值不会更新,同时仍然允许其他帖子元字段照常更新。

您可以使用

save_post
操作来处理此问题。具体来说,我们将在保存帖子之前从
hits
数组中删除
$_POST
值。方法如下:

function prevent_hits_update_during_save($post_id) {
    // Skip for autosave
    if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) {
        return;
    }

    // Skip if it's not a post type we care about
    $post_type = get_post_type($post_id);
    if (!in_array($post_type, array('post', 'page'))) {
        return;
    }

    // Skip for REST API (to ensure compatibility with Gutenberg editor)
    if (defined('REST_REQUEST') && REST_REQUEST) {
        return;
    }

    // Remove 'hits' from the $_POST array to prevent update
    if (isset($_POST['hits'])) {
        unset($_POST['hits']);
    }
}
add_action('save_post', 'prevent_hits_update_during_save', 10);

此解决方案不涉及修改插件代码,保持其更新安全。 如果插件正在标准 save_post 之外或通过 JavaScript 处理点击更新,则需要进一步调试。

让我知道这是否适合您!

© www.soinside.com 2019 - 2024. All rights reserved.