我正在为WordPress编写一个计数器插件,它将跟踪每日和总视图。
通常,您会使用post元字段来存储此类信息。但我不能:
我不能使用元字段,因为元字段不能更新,否则会丢失以前的值(没有锁定)。例如:
元字段“dviews”的值为10。请求#1传入时,它将获取字段并使用$oldValue+1(=11)调用update\\u meta。这将在一个只能发生一个请求的世界中起作用。但在现实世界中,存在多个并发请求。因此,当来自请求#1的工作者正在保存“11个dviews”时,其他请求可能已经将该值增加到17。结果:来自请求#1的工作者将把统计信息设置回11-我将丢失7个视图。在一个安静繁忙的网站上,这可能是一个真正的问题。
解决方案:我创建了另一个表“视图”,其中包含两个字段:post\\u id和dviews。
我现在可以运行“INSERT…ON DUPLICATED KEY UPDATE…*”语句。这非常强大,我保存了一个查询。
问题:我现在想在管理仪表板中显示视图(作为edit.php中的列)。我可以通过*pre_get_posts*、*posts_fields*和*posts_joins*这样的钩子连接我的表视图,因此我的字段在循环中可用。
但是当我想获取一个post对象(我使用的是*get\\u post*)时,我的字段就会丢失,因为函数不使用循环中的post。
我能做什么?
写我自己的“get\\u post”函数是否还有其他“get\\u post”功能可以使用依赖将显示的全局$post变量安全吗将我的列添加到WordPress的帖子表我想避免只针对统计数据的额外查询。当在仪表板表中显示100条帖子时,我会得到额外的100条查询,仅用于统计数据。不太好。是否有可靠的方法从循环访问已经填充的帖子?我真的不明白为什么“get\\u post”不使用这些数据。也许有人能解释一下?
我还希望避免操纵核心表。但我不确定是否有更好的方法,因为
function &get_post(&$post, $output = OBJECT, $filter = \'raw\') {
// [...]
if ( ! $_post = wp_cache_get($post_id, \'posts\') ) {
$_post = $wpdb->get_row($wpdb->prepare("SELECT * FROM $wpdb->posts WHERE ID = %d LIMIT 1", $post_id));
// [...]
}
// (from wp-includes\\post.php)
将询问缓存并至少运行其自己的不可挂接查询。