How to order users by a date in the meta_value array

I have an 'payments' meta_key for the users. I store the payment information (date and payment amount) receive

I have an 'payments' meta_key for the users. I store the payment information (date and payment amount) received from the user in meta_value connected to this meta_key. For example:

array(
  [0] => array(
         'date' => '2020-04-15',
         'amount' => '750'
       ),
  [1] => array(
         'date' => '2020-04-20',
         'amount' => '900'
       )
)

I want to sort users by date of last payment in this meta_value. Example:

User 1 payments:

array(
  [0] => array(
         'date' => '2020-04-15',
         'amount' => '750'
       ),
  [1] => array(
         'date' => '2020-04-20',
         'amount' => '900'
       )
)

User 2 payments:

array(
  [0] => array(
         'date' => '2020-04-10',
         'amount' => '750'
       ),
  [1] => array(
         'date' => '2020-04-15',
         'amount' => '900'
       ),
  [2] => array(
         'date' => '2020-04-25',
         'amount' => '1250'
       )
)

User 3 payments:

array(
  [0] => array(
         'date' => '2020-04-24',
         'amount' => '750'
       )
)

Users List:

1- User 2
2- User 3
3- User 1

Is it possible to do this using the get_users function? I use this right now to list users:

$args = array(
    'meta_query' => array(
        array(
            'key' => 'payments',
            'value' => '',
            'compare' => '!='
        )
    ),
    'orderby' => 'display_name',
);
$users = get_users($args);

Note: Recent payments by users are always added to end of the array.

Sorry: Sorry for my bad English.

I have an 'payments' meta_key for the users. I store the payment information (date and payment amount) received from the user in meta_value connected to this meta_key. For example:

array(
  [0] => array(
         'date' => '2020-04-15',
         'amount' => '750'
       ),
  [1] => array(
         'date' => '2020-04-20',
         'amount' => '900'
       )
)

I want to sort users by date of last payment in this meta_value. Example:

User 1 payments:

array(
  [0] => array(
         'date' => '2020-04-15',
         'amount' => '750'
       ),
  [1] => array(
         'date' => '2020-04-20',
         'amount' => '900'
       )
)

User 2 payments:

array(
  [0] => array(
         'date' => '2020-04-10',
         'amount' => '750'
       ),
  [1] => array(
         'date' => '2020-04-15',
         'amount' => '900'
       ),
  [2] => array(
         'date' => '2020-04-25',
         'amount' => '1250'
       )
)

User 3 payments:

array(
  [0] => array(
         'date' => '2020-04-24',
         'amount' => '750'
       )
)

Users List:

1- User 2
2- User 3
3- User 1

Is it possible to do this using the get_users function? I use this right now to list users:

$args = array(
    'meta_query' => array(
        array(
            'key' => 'payments',
            'value' => '',
            'compare' => '!='
        )
    ),
    'orderby' => 'display_name',
);
$users = get_users($args);

Note: Recent payments by users are always added to end of the array.

Sorry: Sorry for my bad English.

Share Improve this question asked Apr 21, 2020 at 13:50 FarukFaruk 2510 bronze badges
Add a comment  | 

1 Answer 1

Reset to default 1

No, it's not possible to do this using the get_users function the way that you've outlined it, because get_users doesn't accept a meta_query argument the same way that get_posts does.

I see two approaches to get your desired result: either 1) get the users, then sort them afterwards, or 2) use $wpdb to write a direct database call. If you went that route, you'd want to be sure to cache the results using the transients API.

Option 1 route could be something like this:


<?php
// Assume that this is the data that we get back from get_users or a similar function
$users = array(
    0 => array(
        'name' => 'Tom',
        'payments' => array(
            0 => array(
                'date' => '2020-04-15',
                'amount' => '750',
            ),
            1 => array(
                'date' => '2020-04-20',
                'amount' => '900',
            ),
        ),
    ),
    1 => array(
        'name' => 'Dick',
        'payments' => array(
            0 => array(
                'date' => '2020-04-10',
                'amount' => '750',
            ),
            1 => array(
                'date' => '2020-04-15',
                'amount' => '900',
            ),
            2 => array(
                'date' => '2020-04-25',
                'amount' => '1250',
            ),
        ),
    ),
    2 => array(
        'name' => 'Harry',
        'payments' => array(
            0 => array(
                'date' => '2020-04-24',
                'amount' => '750',
            ),
        ),
    ),
);

function sort_users_by_date( $user1, $user2 ) {
    $date1 = end($user1['payments'])['date'];
    $date2 = end($user2['payments'])['date'];

    return strtotime($date1) - strtotime($date2);
}

usort($users, 'sort_users_by_date');

var_dump($users);

Demo

Using $wpdb is tricker. It'd go along these lines:

global $wpdb;
$users = $wpdb->get_results( 'SELECT * FROM {$wpdb->prefix}users INNER JOIN {$wpdb->prefix}usermeta ON {$wpdb->prefix}users.ID = {$wpdb->prefix}usermeta.user_id WHERE {$wpdb->prefix}usermeta.meta_key = "last_payment_date" ORDER BY {$wpdb->prefix}usermeta.meta_value DESC' );

This example assumes a couple of important things:

  1. You need to add another user meta key called "last_payment_date." Update this value when you add another payment to the user payments meta item. This way, you can query and order by a singular value, rather than going through the process of parsing an array inside an SQL statement.
  2. You should probably use $wpdb->prepare along with this. You can find documentation on that here.

发布者:admin,转转请注明出处:http://www.yc00.com/questions/1744546235a4580023.html

相关推荐

  • How to order users by a date in the meta_value array

    I have an 'payments' meta_key for the users. I store the payment information (date and payment amount) receive

    1天前
    20

发表回复

评论列表(0条)

  • 暂无评论

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信