2017-06-22 2 views
0

WP_Usersテーブルに50,000人を超える登録ユーザーがいます。多くの場合、私はユーザー全体のさまざまな状態をチェックしてカウントするクエリを実行する必要があります。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

あなたは、私が「didnのこの

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

のようなテーブル をwp_usermetaするだけで2つのクエリを実行する必要がありますこのコードをチェックしてください。しかし、あなたは主なアイデアを見ることができます