Effizienz beim Anzeigen zufälliger Autoren basierend auf einer großen database

Ich versuche, eine Liste von 5 Autoren nach dem Zufallsprinzip anzuzeigen. Hier sind einige Lösungen, die ich gefunden habe:

https://stackoverflow.com/questions/5502609/get-authors-randomly https://wordpress.stackexchange.com/a/91326/1044

Ich verwende derzeit die vorherige Lösung, außer dass ich WP_User_Query wie WP_User_Query :

 $args = array( 'role' => 'subscriber' ); $wp_user_query = new WP_User_Query($args); $authors = $wp_user_query->get_results(); // Shuffle list to get random results shuffle($authors); 

Nach meinem amateurhaften Verständnis wird dies jedoch die gesamte Benutzerliste abrufen . Ich frage mich nur, ob ich ungefähr 2000-5000 Benutzer (oder mehr) hatte , wird dies die Seitenbelastung drastisch beeinflussen? Wie kann ich das effizienter machen?

AKTUALISIEREN:

Würde array_rand() auch eine effizientere Methode im Vergleich zu shuffle() ?

Solutions Collecting From Web of "Effizienz beim Anzeigen zufälliger Autoren basierend auf einer großen database"

Wenn Sie Bedenken hinsichtlich der Effizienz haben, sollten Sie die Transienten-API zum Speichern der Abfrage verwenden. Wenn Sie etwas speichern, das Sie zufällig anordnen möchten, erscheint es möglicherweise kontraproduktiv. Wenn Sie jedoch die gesamte Abfrage speichern, können Sie das resultierende Array immer zufällig anordnen und bearbeiten, um die gewünschten Ergebnisse zu erzielen.

Hier erfahren Sie, wie Sie alle Abonnenten erhalten und in einem Transient speichern, mit einem einfachen PHP am Ende, um das Ergebnis zu mischen / randomisieren und dann die ersten 5 Ergebnisse mit array_slice()

 if ( false === ( $users = get_transient( 'get_all_subscribers' ) ) ) { // this code runs when there is no valid transient set $args = array( 'role' => 'subscriber' ); $wp_user_query = new WP_User_Query( $args ); $users = $wp_user_query->get_results(); set_transient( 'get_all_subscribers', $users ); } // proceed with data normally // randomize the stored result shuffle( $users ); $rand_users = array_slice( $users, 0, 5 ); var_dump( $rand_users ); 

Und um sicherzustellen, dass der Transient aktuell ist, löschen wir ihn, wenn ein Benutzer aktualisiert oder hinzugefügt wird:

 // Create a simple function to delete our transient function delete_all_subscribers_transient() { delete_transient( 'get_all_subscribers' ); } // Add the function to the profile_update and user_registration hooks add_action( 'profile_update', 'delete_all_subscribers_transient' ); add_action( 'user_register', 'delete_all_subscribers_transient' ); 

Sie möchten nicht alle Benutzer abrufen, wenn Sie nur 5 benötigen.

Wenn Sie WP_User_Query() verwenden WP_User_Query() , um 5 Benutzer nach dem Zufallsprinzip abzurufen, können Sie versuchen, den pre_user_query Hook zu verwenden, um die pre_user_query zu überschreiben:

 $args = array( 'role' => 'subscriber', 'number' => 5, ); add_action( 'pre_user_query', 'my_pre_user_query' ); $wp_user_query = new WP_User_Query( $args ); 

woher

 function my_pre_user_query( $q ){ $q->query_orderby = ' ORDER BY RAND() '; // remove the hook remove_action( current_filter(), __FUNCTION__ ); } 

Aktualisieren:

Dieser Artikel enthält einen Trick, um die Anzahl der Zeilen mit einer speziellen WHERE Bedingung zu reduzieren, bevor ORDER BY RAND() … soweit ich es verstehe.

Die WHERE Bedingung in Ihrem Fall könnte sein

 WHERE RAND()< (SELECT ((5/COUNT(*))*10) FROM wp_users) 

Wenn Sie also sehr viele Benutzer haben, können Sie diesen Callback für modifizierte Aktionen ausprobieren:

 function my_pre_user_query( $q ){ $q->query_where = str_replace( 'WHERE 1=1', 'WHERE RAND()< (SELECT ((5/COUNT(*))*10) FROM wp_users) ', $q->query_where ); $q->query_orderby = ' ORDER BY RAND() '; // remove hook remove_action( current_filter() , __FUNCTION__ ); } 

wenn der Trick vom obigen Artikel funktioniert!

Hier ist eine allgemeinere Version des modifizierten callbacks:

 function my_pre_user_query( $q ){ $limit = preg_replace( '/[^\d]/', '', $q->query_limit ); $from = 'WHERE 1=1'; $to = sprintf( 'WHERE RAND()< (SELECT ((%d/COUNT(*))*10) FROM %susers)', $limit, $GLOBALS['wpdb']->prefix ); $q->query_where = str_replace( $from, $to, $q->query_where ); $q->query_orderby = ' ORDER BY RAND() '; // remove the hook remove_action( current_filter() , __FUNCTION__ ); }