2017-06-22 48 views
0

我的WP_Users表中有超过5万注册用户。通常我需要运行查询来检查和统计用户的不同状态。缩放WordPress用户查询

我经常写下类似的东西。

$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++; 
    } 

    } 

这里的问题是,它是生成每用户2数据库调用所以它的令人难以置信的慢,容易使事情崩溃。有没有人有建议?

回答

0

你应该做的只有两次查询wp_usermeta表 这样

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++; 
} 

我没有”不要检查这段代码。但你可以看到主要想法