web-dev-qa-db-ja.com

mysqlは2つのデータベーステーブル、usersとusermetaをクエリし、カスタムメタint値でソートします

カスタムメタ値(int)でソートされたサイトユーザーの配列を取得しようとしています。

私はユーザに問い合わせることができ、foreachで使用することができます。現在、クエリ結果はusersテーブルのdisplay_nameで並べ替えられています。カスタムのusermetaの値でソートしたい。

これを実現するためにこのクエリを変更する方法について何かアイデアはありますか?

function get_all_top_members() {
    global $wpdb;
   $gather_users = "SELECT * FROM ".$wpdb->prefix."users ORDER BY display_name ASC";
$all_users = $wpdb->get_results($gather_users);
return $all_users;
}
1
estern23

そこに格納されている値は整数値として扱われないため、meta_value列で適切な並べ替えを行うことはできませんが、並べ替えにmeta_value_numを使用していた場合はWordPressに戻って基本的にはデータの前面に数字を追加することを含みます。

function get_users_ordered_by_meta( $key = '', $d = 'ASC' ) {
    global $wpdb;
    $d = ( strtoupper( $d ) == 'DESC' ) ? 'DESC' : 'ASC';
    if( '' == $key )
        return;
    $r = $wpdb->get_results( $wpdb->prepare( "
        SELECT u.ID, u.display_name, u.user_nicename, um.meta_value 
        FROM {$wpdb->usermeta} um, {$wpdb->users} u
        WHERE um.user_id = u.ID
        AND um.meta_key = %s
        ORDER by (0 + um.meta_value) $d
    ", $key ) );
    return $r;
}

これにより、メタ値列で適切な並べ替えができます。

あなたがそれを必要とするところならどこでもそれを呼ぶことができるようにあなたがそれをユーザのためにあなたがセットアップしたメタキーを渡すことができて、そしてオプションでソート順を変えることができるようにあなたは機能を好むかもしれないと考えました。

$yourvar = get_users_ordered_by_meta('your-key');

降順に並べ替えます。

$yourvar = get_users_ordered_by_meta('your-key', 'desc');

以前と同じようにオブジェクトの配列が返されるので、そのデータをループ処理して表示などに適切に使用する方法を知っていると思います(そうでない場合は、コメントを投稿してください)。

0
t31os

試してみてください。

global $wpdb;
$gather_users = $wpdb->get_col("SELECT user_id FROM $wpdb->usermeta WHERE $wpdb->usermeta.meta_key = 'META_KEY_HERE' ORDER BY $wpdb->usermeta.meta_value ASC");
$all_users = $wpdb->get_results($gather_users);
return $all_users;

そしてMETA_KEY_HEREをあなたのメタキーに変更してください。

1
Bainternet

皆さんはやり過ぎています: https://codex.wordpress.org/Class_Reference/WP_User_Query

$args = array(
    'meta_query' => array(
        array(
            array(
                'key'     => 'YOUR_KEY',
                'value'   => 'whatever_value_you\'re_looking_for',
                'compare' => '='
            )
        )
    )
 );
$user_query = new WP_User_Query( $args );

他のWP {{Query}}型規約と同様に、並び替え、結果数の制限などができます。

https://codex.wordpress.org/Class_Reference/WP_User_Query

edit - 警告:これはあなたがwp_coreの予想されるユーザーテーブルにカスタムユーザーデータを割り当てていることを前提としています - OPではそれはあなたのように見えます。カスタムテーブルの場合は、他のユーザーによって記述された$ wpdbアプローチを使用します。

0
Brandt Solovij