wordpress查询数据库,用于一个查询中的每个用户的帖子计数

时间:2013-10-10 21:38:01

标签: php mysql sql wordpress

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

我想要获得的是一个页面,每页显示20个用户(将有分页),其中包含以下信息(仅显示发布了2个以上帖子的用户):
1)该用户发布的cpt帖子总数
2)该用户发布的第1类和第2类的帖子总数

我尝试使用WordPress get_users函数来获取所有以“user-role”作为角色的作者,然后循环抛出这个找到的用户使用count_many_users_posts()得到每个用户的帖子总数,然后用一个新的WP_Query获取所有具有初始作者ID并在指定类别中发布的帖子。有一个新的foreach throw这个持续的帖子我在计算每个用户发现的帖子数量。

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

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

我在想的是使用自定义查询,其中我应该将选择用户表内连接到usermeta表用于指定的用户角色,以仅获取所需角色的用户ID,并且所有此查询内部再次与post表,从中只发布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-&gt; term_relationships之外,不需要在此计算中获取其他表格)

所以在从上面得到$ ids和count(*)之后,我认为结果应该再次与$ wpdb-&gt; 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函数在这一点上是否涵盖了这么大的数据集?

1 个答案:

答案 0 :(得分:0)

您可以在下面查询自定义帖子类型

中具有用户级别= 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`

对于虚拟类别no.s我使用termid 3和4来计算你需要添加适当的termid来计算指定类别中作者的帖子