0

私のワードプレスのモックアップには、ref_credit と呼ばれるユーザー用の meta_value があります。このサンドロのメタ値は次のようになります。

174 1   ref_credit  a:2:{i:0;s:1:"9";i:1;s:2:"10";}

彼が id=9,10 のユーザーを紹介したことを意味します

別のユーザーの meta_value は次のようになります。

209 9   ref_credit  a:1:{i:0;s:2:"11";}

彼は id=11 のユーザーを 1 人だけ紹介しました。

今、私は単純なリーダーボードを作成したいと思います.何かをモックアップしましたが、ロジックは完全に間違っています. これにより、コードが値と順序を比較することを理解しています。紹介されたユーザー数で並べたいです。

何か案は?

完全な機能は次のとおりです。

    //get_users calls WP_User_Query and returns an array of matching users
    $users = get_users(

        array(  'fields' => 'all_with_meta',
                'meta_query' => array( array( 'key' => 'ref_credit', // the meta field (or key) we want to target
                                              'compare' => '>='  // comparison method (optional:  =, >, <, etc)
        )))
    );

            //custom function for comparing the data we want to sort by
            function cmp($a, $b){
              if ($a->points == $b->points) {
                return 0;
              }
              return ($a->points > $b->points) ? -1 : 1;
            }

    //usort sorts our $users array with our function cmp()
    usort($users, 'cmp');

    //leaving an array of $users sorted by the value of meta 'points'
    echo '<ol>';
        foreach ($users as $user) {  
            echo '<li>' . $user->display_name . '</li>';
        }
    echo '</ol>';
4

1 に答える 1

0

いくつか問題があると思います。

1 つ目はall_with_meta、名前が意味するものにもかかわらず、メタデータを戻していないように見えることです。何をすべきかわからない -コーデックスはあまり役に立ちません。ref_creditそのため、自分で値を取得する必要があります。

第二に、あなたの比較はpointsではなくと呼ばれるものを使用しているようref_creditです。それがどこから来ているのかわからない。は配列であるためref_credit、値自体ではなく、配列の長さを比較する必要があります ( countsay を使用)。

元のクエリをそのままにしておくと、次のようなものが機能するはずです (ただしcmp、正しい方法で結果が得られたことを確認する必要がある場合があります)。

//get_users calls WP_User_Query and returns an array of matching users
$users = get_users(
    array(  'fields' => 'all_with_meta',
            'meta_query' => array(
                array( 'key' => 'ref_credit', // the meta field (or key) we want to target
                    'compare' => '>='  // comparison method (optional:  =, >, <, etc)
                )
            )
        )
);

foreach($users as $user_id => $user) {
    $user->ref_credit = get_user_meta($user_id, 'ref_credit', true);
}

//custom function for comparing the data we want to sort by
function cmp($a, $b){
    return count($b->ref_credit) - count($a->ref_credit);
}

usort($users, 'cmp');

//leaving an array of $users sorted by the value of meta 'points'
echo '<ol>';
    foreach ($users as $user) {
        echo '<li>' . $user->display_name . '</li>';
    }
echo '</ol>';
于 2012-10-27T19:16:51.180 に答える