Retour-ID von Autoren, die mindestens einen Post haben

Ich habe hier einen tollen Code gefunden , der die IDs der Benutzer nach Rolle zurückgibt. Was ich tun möchte, ist, es so zu ändern, dass es nur die IDs der Benutzer zurückgibt, die mindestens einen Beitrag haben. Ich habe versucht INNER JOIN die $wpdb->posts Tabelle und fühle, dass ich das richtig gemacht habe, aber nicht sicher. Hier ist, was ich bisher habe:

 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 get_col( $sql ); return $userIDs; } 

Was die SQL-Abfrage ausgibt

SELECT ID, Anzeigename FROM wp_users INNERER JOIN wp_usermeta EIN wp_users.ID = ba_usermeta.user_id UND INNERER JOIN wp_posts ON wp_users.ID = ba_posts.post_author WHERE wp_usermeta.meta_key = ‘wp_capabilities’ UND (wp_usermeta.meta_value LIKE ‘% “author”%’ ODER wp_usermeta.meta_value LIKE ‘% “editor”%’) ORDER BY Anzeigename

Ich habe INNER JOIN (oder JOIN ) noch nie benutzt, damit ich es falsch machen konnte. Ich denke auch, dass ich zählen muss oder etwas, um sicherzustellen, dass ich ein Ergebnis bekomme.

Jede Hilfe wäre großartig

EDIT: Hier ist die voll funktionsfähige function als PHP für jeden, der das später findet

  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 get_col( $sql ); return $userIDs; } 

Solutions Collecting From Web of "Retour-ID von Autoren, die mindestens einen Post haben"

Anstelle eines JOIN können Sie ein IN mit einer Unterabfrage verwenden, um doppelte Ergebnisse aufgrund des Joins zu verhindern:

 SELECT ID, display_name FROM wp_users WHERE ID IN (SELECT post_author FROM wp_posts) 

Dies wird sich nicht auf Fähigkeiten beziehen. Wenn Sie auch möchten, dass Sie sie wie einen Join hinzufügen können, aber die meta_key Klausel in den Join verschieben, um auch doppelte Ergebnisse zu vermeiden:

 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"%' ) 

Es liegt an Ihnen, dies zurück in PHP zu konvertieren! Hinweis: Ist der wp_ in wp_capabilities abhängig vom database-Präfix, oder ist es immer wp_ , auch wenn Ihre Tabellennamen mit einem anderen Präfix beginnen?