2017-06-22 5 views
0

Ich habe mehr als 50.000 registrierte Benutzer in meiner WP_Users Tabelle. Oft muss ich Abfragen ausführen, die die verschiedenen Zustände meiner Benutzer als Ganzes überprüfen und zählen.Scaling WordPress Benutzerabfragen

Ich schreibe oft so etwas wie das Folgende.

$users = get_users(); //This query is not limited I need to run across all my users. 
    $active_users = 0; 
    foreach ($users as $user) { 
    $last_transaction_date = strtotime(get_user_meta($user_id, 'last_trans_date', true)); 
    $next_recurring_date = strtotime(get_user_meta($user_id, 'next_recurring_date', true)); 
    $todays_date = strtotime('now'); 

    if ($todays_date >= $last_transaction_date && $todays_date <= $next_recurring_date) { 
     $active_users++; 
    } 

    } 

Das Problem dabei ist, dass es generiert 2 Datenbankaufrufe pro Benutzer so ist es unglaublich langsam und anfällig für Dinge Absturz zu machen. Hat jemand einen Vorschlag?

Antwort

0

Sie sollten nur zwei Abfragen tun Tabelle wp_usermeta wie diese

STEP1

$SQLresult1 = $wpdb->get_results(" 
    SELECT user_id, meta_value 
    FROM wp_usermeta 
    WHERE meta_key = 'last_trans_date' 
     AND $todays_date >= meta_value 
"); 


//convert it to array 
SQLarr1 = []; 

foreach ($SQLresult1 as &$item) { 
    SQLarr1[$item->user_id] = $item->meta_value 
} 

STEP2

$SQLresult2 = $wpdb->get_results(" 
    SELECT user_id, meta_value 
    FROM wp_usermeta 
    WHERE meta_key = 'next_recurring_date' 
     AND $todays_date <= meta_value 
"); 


//convert it to array 
SQLarr2 = []; 

foreach ($SQLresul2 as &$item) { 
    SQLarr2[$item->user_id] = $item->meta_value 
} 

STEP3

$active_users = 0; 

foreach ($SQLarr1 as $user_id => &$item) { 
    if (isset($SQLarr2[$user_id])) 
     $active_users++; 
} 

I didn‘ t überprüfe diesen Code. Aber Sie können die Hauptidee

sehen