我找到了一段很棒的代码here 它按角色返回用户的ID。我想做的是修改它,以便它只返回至少有一篇帖子的用户的ID。我已经试过了INNER JOIN
这个$wpdb->posts
我觉得我做得对,但不确定。以下是我目前掌握的情况:
function getUsersByRole( $roles ) {
global $wpdb;
if ( ! is_array( $roles ) ) {
$roles = explode( ",", $roles );
array_walk( $roles, \'trim\' );
}
$sql = \'
SELECT ID, display_name
FROM \' . $wpdb->users . \' INNER JOIN \' . $wpdb->usermeta . \' ON \' . $wpdb->users . \'.ID=\' . $wpdb->usermeta . \'.user_id
AND INNER JOIN \'. $wpdb->posts .\' ON \' .$wpdb->users . \'.ID=\' . $wpdb->posts . \'.post_author
WHERE \' . $wpdb->usermeta . \'.meta_key = \\\'\' . $wpdb->prefix . \'capabilities\\\'
AND (
\';
$i = 1;
foreach ( $roles as $role ) {
$sql .= \' \' . $wpdb->usermeta . \'.meta_value LIKE \\\'%"\' . $role . \'"%\\\' \';
if ( $i < count( $roles ) ) $sql .= \' OR \';
$i++;
}
$sql .= \' ) \';
$sql .= \' ORDER BY display_name \';
$userIDs = $wpdb->get_col( $sql );
return $userIDs;
}
SQL查询输出的
选择ID,在wp\\U用户上显示wp\\U用户名内部加入wp\\U usermeta。ID=ba\\U usermeta。user\\u id和INNER JOIN wp\\u在wp\\u用户上发布的帖子。ID=ba\\U立柱。post\\u author WHERE wp\\u usermeta。meta\\u键=\'wp\\u功能\'和(wp\\u usermeta.meta\\u值,如“%”author“%”或wp\\u usermeta.meta\\u值,如“%”editor“%”),按display\\u名称排序
我从来没用过INNER JOIN
(或JOIN
) 所以我可能做错了。我还认为我需要做一个计数或其他事情来确保我得到一个结果。
任何帮助都会很棒
EDIT: 下面是PHP的完整工作函数,供以后找到它的人使用
function getUsersByRole( $roles ) {
global $wpdb;
if ( ! is_array( $roles ) ) {
$roles = explode( ",", $roles );
array_walk( $roles, \'trim\' );
}
$sql = \'SELECT ID, display_name
FROM \'. $wpdb->users .\'
JOIN \'. $wpdb->usermeta.\' ON (\'.$wpdb->users.\'.ID = \'.$wpdb->usermeta.\'.user_id AND \'.$wpdb->usermeta.\'.meta_key = \\\'\'.$wpdb->prefix.\'capabilities\\\')
WHERE ID IN (SELECT post_author FROM \' .$wpdb->posts.\')
AND(\';
$i = 1;
foreach ( $roles as $role ) {
$sql .= \' \' . $wpdb->usermeta . \'.meta_value LIKE \\\'%"\' . $role . \'"%\\\' \';
if ( $i < count( $roles ) ) $sql .= \' OR \';
$i++;
}
$sql .= \' ) \';
$sql .= \' ORDER BY display_name \';
$userIDs = $wpdb->get_col( $sql );
return $userIDs;
}
最合适的回答,由SO网友:Jan Fabry 整理而成
而不是JOIN
, 您可以使用IN
对于子查询,要防止由于联接而导致重复结果,请执行以下操作:
SELECT ID, display_name
FROM wp_users
WHERE ID IN (SELECT post_author FROM wp_posts)
这将不考虑功能。如果还需要,可以像加入一样添加它们,但移动
meta_key
子句,还可以防止重复结果:
SELECT ID, display_name
FROM wp_users
JOIN wp_usermeta ON (wp_users.ID = wp_usermeta.user_id AND wp_usermeta.meta_key = \'wp_capabilities\')
WHERE ID IN (SELECT post_author FROM wp_posts)
AND (wp_usermeta.meta_value LIKE \'%"author"%\'
OR wp_usermeta.meta_value LIKE \'%"editor"%\' )
由您决定是否将其转换回PHP!旁注:是
wp_
在里面
wp_capabilities
取决于数据库前缀,还是始终如此
wp_
, 即使您的表名以另一个前缀开头?