web-dev-qa-db-ja.com

IDではなくメタメですすべてのユーザーメタを取得する

ユーザーのメタ値を比較して最高値と最低値を見つけようとしています。 "hourly_rate"というユーザーメタ値を設定しました。すべてのユーザーの毎時料金を取得してから、これらの値に対してPHPのmin()およびmax()を実行して、すべてのユーザーの最低および最高の毎時料金を見つけます。

現在のところ、私はデータベースからすべてのユーザーを取得し、foreachループを繰り返し、各ユーザーの特定のメタキーを取得し、それを配列で隠しています。それからその配列でminとmaxを実行します。

サイトの規模が拡大するにつれて、最小値と最大値を見つけるだけでは非常に面倒になる可能性があります。 IDではなくキーでget_user_meta()のようなことができる方法はありますか?

例えば、私は現在これをします:

$users = new WP_User_Query(array(
    'order' => 'DESC',
    'fields' => 'all_with_meta'
));

$hourly_rates_array = array();

foreach($users->results as $user){
    $hourly_rate = get_user_meta($user->ID, 'hourly_rate', true);
    array_Push($hourly_rates_array, $hourly_rate);
}

//Find the necessary limits for each user

$lowest_hourly_rate = min($hourly_rates_array);
$highest_hourly_rate = max($hourly_rates_array);

私はこのようなことをすることができる方法があります:

$hourly_rates_array = get_user_meta('ALL', 'hourly_rate', true);

$lowest_hourly_rate = min($hourly_rates_array);
$highest_hourly_rate = max($hourly_rates_array);

Wp_usersを経由してからwp_usermetaを経由するのではなく、どちらがwp_usermetaテーブルに直接アクセスするのでしょうか。これは私のDBクエリを劇的に削減し、パフォーマンスの面でははるかに優れていますが、ユーザーIDではなくキーでuser_metaを取得する方法を考え出すことはできません。

2つの選択肢最初のものはカスタムSQLからあなたを遠ざけるでしょう、そしてあなたが現在持っているものよりずっと効率的であるべきです。

これは2つの照会を実行します。1つは最高の1時間当たりのレートでユーザーIDを取得するためのもので、もう1つは最低のものを取得するためのものです。ユーザーメタキャッシュを更新するにはもう1つクエリが必要です。

$query = new WP_User_Query;
$users = array(
    'min_user' => 'ASC',
    'max_user' => 'DESC',
);

foreach ( $users as $var => $order ) {
    $query->query(
        array(
            'count_total' => false, // Save SQL_CALC_FOUND_ROWS, don't need it
            'meta_key' => 'hourly_rate',
            'orderby' => 'meta_value',
            'fields' => 'ID', // Don't waste memory
            'number' => 1, // Just need the first user ID of the result
            'order' => $order,
        )
    );

    if ( $data = $query->get_results() )
        $$var = $data[0]; // User ID
    else
        $$var = 0;
}

update_meta_cache( 'users', array( $min_user, $max_user ) );

echo get_post_meta( $max_user, 'hourly_rate', true ); // Highest hourly rate
echo get_post_meta( $min_user, 'hourly_rate', true ); // Lowest hourly rate

もう1つは、カスタムSQLクエリです。

$rates = $wpdb->get_row( "SELECT MAX( CAST( meta_value AS UNSIGNED ) ) AS max_rate, MIN( CAST( meta_value AS UNSIGNED ) ) AS min_rate FROM $wpdb->usermeta WHERE meta_key = 'hourly_rate'" ); 

echo $rates->max_rate;
echo $rates->min_rate;

それよりずっとスリムになることはありません!

2
TheDeadMedic