php - WordPress 查询数据库,用于一次查询中每个用户的帖子计数

标签 php mysql sql wordpress

我有一个自定义用户角色,我们将其称为“用户角色”,它只能创建自定义帖子类型,我们在许多类别下将其称为 cpt。

我想要得到的是一个页面,每页显示 20 个用户(将有分页),并包含以下信息(它应该只显示发布超过 2 个帖子的用户):
1)该用户发表的cpt帖子总数
2)该用户发布的类别1和类别2下的帖子总数

我尝试使用 WordPress get_users 函数来获取所有以“用户角色”为角色的作者,然后循环抛出这个发现用户使用 count_many_users_posts() 获取每个用户的帖子总数,然后使用新的 WP_Query 获取具有初始作者 ID 且属于指定类别的所有帖子。使用新的 foreach 抛出这个最后的帖子,我正在计算每个用户找到的帖子数量。

将解决方案限制为 2 个用户,逻辑似乎有效。

问题:脚本运行速度太慢,并且用户数量非常大(大约 3k),因此在另一个循环内运行 2 个循环对于此工作来说太慢了。

我的想法是使用自定义查询,我应该将选择的用户表内部连接与指定用户角色的用户元表结合起来,以仅获取所需角色的用户ID,并且所有这些查询再次内部连接posts 表,从中仅获取 post_type = cpt 的发布帖子,并对返回的行进行计数。

如果可能的话,将上面的内容与一个查询结合起来,该查询将根据 term_relationships 表再次过滤结果,以仅计算类别 1,2 的帖子(这应该返回到帖子总数)

我尝试过但没有成功(我没有得到任何结果,但我真的不认为我正确使用了联接和 where 子句)是:

SELECT $wpdb->users.id, count(*) FROM $wpdb->users 
INNER JOIN $wpdb->usermeta on $wpdb->users.id = $wpdb->usermeta.user_id 
    WHERE $wpdb->usermeta.meta_key = 'wp_capabilities' 
    AND meta_value RLIKE '[[:<:]]user-role[[:>:]]' 
INNER JOIN $wpdb->posts on $wpdb->users.id = $wpdb->posts.post_author 
    WHERE $wpdb->posts.post_type = "cpt" AND $wpdb->posts.post_status = "publish"
    having count(*)>2

我不知道我与上述内容有多接近,但这是我可以构建的内容,仅在一个查询中计算特定角色用户的所有帖子,然后我想为此添加计数上述类别中的帖子(我可以对类别的术语 ID 进行硬编码,因此无需获取此计算中除 $wpdb->term_relationships 之外的其他表)

因此,从上面获取 $ids 和 count(*) 后,我认为结果应该再次与 $wpdb->term_relationships 进行内部连接,如下所示:

INNER JOIN $wpdb->term_relationships on $wpdb->term_relationships.object_id = $wpdb->posts.id 
    WHERE term_taxonomy_id IN (1,2)

这是我想出来的,有标准的解决方案吗?或者,对于如此大的数据集,Wordpress 数据库和 WordPress 功能目前还没有涵盖这一点吗?

最佳答案

您可以尝试以下查询,了解自定义帖子类型中用户级别 = 10 的每位作者的帖子数量

SELECT COUNT(u.`ID`) AS post_count,p.`ID`,u.`user_nicename`   FROM
`wp_posts` p 
LEFT JOIN  `wp_users` u ON( p.`post_author`=u.`ID`) 
INNER JOIN `wp_usermeta`  um ON (u.`ID` = um.`user_id` AND um.`meta_key`='wp_user_level')    
WHERE p.`post_type`='cpt' AND p.`post_status`='publish' AND um.`meta_value`='10'
GROUP BY u.`ID`
HAVING post_count>2

此查询用于计算特定类别中作者的帖子数量

SELECT COUNT(CASE WHEN wtt.`term_id`='3' THEN u.`ID` END) AS cat1_count,
COUNT(CASE WHEN wtt.`term_id`='4' THEN u.`ID` END) AS cat2_count,
p.`ID`,u.`user_nicename`   FROM
 `wp_users` u 
INNER JOIN `wp_usermeta`  um ON (u.`ID` = um.`user_id` AND um.`meta_key`='wp_user_level')
LEFT JOIN `wp_posts` p ON(u.`ID`= p.`post_author`)
LEFT JOIN `wp_term_relationships` wtr ON (p.`ID` = wtr.`object_id`) 
LEFT JOIN `wp_term_taxonomy` wtt ON (wtr.`term_taxonomy_id`=wtt.`term_taxonomy_id`)
WHERE p.`post_type`='cpt' AND p.`post_status`='publish' AND um.`meta_value`='10'
GROUP BY u.`ID`

对于虚拟类别编号,我使用 termid 3 和 4 来计数,您需要添加适当的 termid 才能计算指定类别中作者的帖子

关于php - WordPress 查询数据库,用于一次查询中每个用户的帖子计数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19306690/

相关文章:

php - Importbuddy 内部 500 服务器错误步骤 3

PHP/MySQLI : strange readings for affected_rows

mysql - 多个 LAG 总计为 LEAD

mysql - 从多个查询创建 View

sql - 你使用了哪些编码技巧来避免编写更多的 sql?

c# - 使用 SqlReader 从存储过程中取回多个表

PHP foreach循环使用PDO将数据插入mysql仅插入第一行

php - Laravel 多次上传仅将 20 插入数据库

mysql - SQL 案例语句

c# - 如何只获取日期的年份和月份部分进行比较?