我正在使用特定的插件来计算我的帖子浏览量。
它将值存储在名为“hits”的 postmeta 自定义字段中,并且该值会实时更新。
我刚刚注意到,当我作为管理员编辑帖子时,“点击量”值在我编辑帖子时不会增加。
当我想到这似乎很合乎逻辑,因为如果当我进入帖子版本时“点击”值是 15,那么当我完成我的帖子版本时它仍然是 15,因为当我更新帖子时所有帖子元都会更新。所以,即使有 10 多个人访问了我的帖子,我的帖子计数器在应该显示 25 时仍然显示 15 的值。
所以现在我正在非常努力地用我的低 PHP 技能来阻止这个字段在我更新我的帖子时被更新。
我尝试了不同的方法,但没有一个有效:
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);
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);
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;
}
有人可以帮我吗?不幸的是,我还不能更改插件,因为它链接到我网站上的几个块,并且他使用了一些有效的缓存方法。
预先感谢您的帮助! 乔纳森
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 处理点击更新,则需要进一步调试。
让我知道这是否适合您!