如何对WP_USER_QUERY结果进行排序,以匹配用户ID数组的顺序?

时间:2014-10-31 作者:henrywright

我正在使用WP_User_Query 从我的数据库中获取用户列表。我仅通过使用include 参数例如:

$args = array(
    \'include\' => array( 1, 3, 5, 99, 61, 24, 12 ),
    \'count_total\' => true,
    \'search\' => sanitize_text_field( $_GET[\'phrase\'] )
);

$query = new WP_User_Query( $args );
foreach( $query->results as $user ) {
    echo $user->ID . \'<br />\';
}
结果当前由排序user_login. 我的目标是按照include 参数例如,如果要返回5个用户(假设用户ID为1、5、99、61和12),那么我需要foreach循环按以下顺序输出结果:

1
5
99
61
12
Please note 我试过使用usort() 运行查询后(请参阅here), 但现在我需要对实际查询结果进行排序。我不希望在查询运行后对查询结果排序。

参考号:http://codex.wordpress.org/Class_Reference/WP_User_Query

2 个回复
最合适的回答,由SO网友:birgire 整理而成

更新日期:

这个WP_User_Query 类在WordPress 4.1+中支持:

\'orderby\' => \'include\'
自WordPress 4.7以来,还支持:

\'orderby\' => \'login__in\'
以及

\'orderby\' => \'nicename__in\'
因此,我们不再需要像下面这样通过过滤器来实现它。

上一个答案:

我想知道这是否适合您:

add_action( \'pre_user_query\', \'wpse_order_by_include_values\' )
$query = new WP_User_Query( $args );
remove_action( \'pre_user_query\', \'wpse_order_by_include_values\' )
在哪里

function wpse_order_by_include_values( $q )
{
    if( isset( $q->query_vars[\'include\'] ) )
    {
        $values = join( \',\', $q->query_vars[\'include\'] );
        $q->query_orderby = \'ORDER BY FIELD( ID,\' . $values . \' )\';         
    }
}
使用FIELD() MySQL中的函数。这里有一些用法示例here 在MySQL文档页面的注释中。

Update:

为了使其更加灵活,我们可以使用此迷你插件:

/**
 * Support the \'orderby\' => \'_include\' parameter for the WP_User_Query 
 * to order by the values in the include array.
 * 
 * @see http://wordpress.stackexchange.com/a/167095/26350
 */

add_action( \'pre_user_query\', function( $q ) {

    if( 
        isset( $q->query_vars[\'orderby\'] )
        && \'_include\' === $q->query_vars[\'orderby\']
        && isset( $q->query_vars[\'include\'] ) 
        && count( $q->query_vars[\'include\'] ) > 0 
    )
    {
        global $wpdb;
        $users_in = join( \',\', array_map( \'absint\', $q->query_vars[\'include\'] ) );
        $q->query_orderby = \'ORDER BY FIELD( {$wpdb->users}.ID,\' . $users_in . \' )\';
    }

});
使用下划线前缀的位置_include, 以防万一核心将使用include 未来的价值更新:我已对此进行了调整,因此现在它或多或少与post__in 的订购案例WP_Query

现在,您可以简单地使用:

$args = array(
    \'include\'     => array( 1, 3, 5, 99, 61, 24, 12 ),
    \'count_total\' => true,
    \'search\'      => sanitize_text_field( $_GET[\'phrase\'] )
    \'orderby\'     => \'_include\',                               //<-- our new value
);

$query = new WP_User_Query( $args );
由订购include 大堆

SO网友:iyrin

上述答案的另一种选择是添加一列(元键),其中包含可以轻松排序的元值\'orderby\' => \'meta_value\' 在args中。

下面是我编写的一个函数,用于向每个用户添加元值。我把它包括在这里是因为$my_order_ids = array( 3, 4, 6, 2, 5 ); 确定用户在查询中应按升序排序。

function my_order_column() {
// Defines the user IDs to be updated.
// Use the desired order when you define this.
$my_order_ids = array( 3, 4, 6, 2, 5 );

    // Runs only when $my_order_ids has changed by comparing  
    // it to _transient_my_order_column. 
    if (false === get_transient(\'my_order_column\') ||
        get_transient(\'my_order_column\') !== $my_order_ids) {

        // Updates _transient_my_order_column
        set_transient(\'my_order_column\', $my_order_ids);

        // The first user
        $order_id = 1;
        // Add an integer value for each user 
        foreach ($my_order_ids as $user_id) {

        // Sets/updates the value of my_user_order
        update_user_meta( $user_id, \'my_user_order\', $order_id );

        // Confirms that the new value of my_user_order matches the 
        // current value of $order_id
        if ( get_user_meta($user_id,  \'my_user_order\', true ) != $order_id )
            wp_die(\'An error occurred\');

            $order_id++;
        }
    ?><div class="updated">
        <p><?php echo var_dump($my_order_ids) . \'<br />Updated!\'; ?></p>
    </div><?php
    }
}

add_action( \'admin_notices\', \'my_order_column\' );
这将使用foreach循环向每个用户的my_user_order 键,每次递增1。您只需定义$my_order_ids 按照您希望稍后对其进行排序的顺序。

瞬态就在那里,因此只有当$my_order_ids 已更改(换句话说,仅更新用户一次)。您可能需要注释掉add_action( \'admin_notices\', \'my_order_column\' ); 防止瞬态丢失时意外运行。

现在,我们已经设置了新的自定义元键和元值,我们应该可以让查询以这种方式对它们进行排序。

function my_user_query() {

$args = array(
    \'orderby\' => \'meta_value\',     /***************************************/
    \'order\' => \'ASC\',              /***Added orderby, order and meta_key***/
    \'meta_key\' => \'my_user_order\', /***************************************/
    // Note: \'include\' does not affect how output will be ordered. 
    // array( 6, 5, 3, 2, 4 ) would still be ordered by meta_value.
    \'include\' => array( 3, 4, 6, 2, 5 ),
    \'count_total\' => true,
    \'search\' => sanitize_text_field( $_GET[\'phrase\'] )
);

$query = new WP_User_Query( $args );

    ?>
    <div class="updated">
        <p><?php foreach( $query->results as $user ) {
        echo $user->ID . \'<br />\'; } ?></p>
    </div>
    <?php  wp_reset_query();
}

add_action( \'admin_notices\', \'my_user_query\' );
在上述示例中,以下输出显示为管理通知:

3
4
6
2
5

结束

相关推荐

将unctions.php复制到子主题后获得白色空白页面

在复制函数后,我得到了白色空白页。php到我的孩子主题。如何更改“like\\u escape”?我能找到什么文件?我看到这个通知:Notice: like_escape is deprecated since version 4.0! Use wpdb::esc_like() instead. in /home7/homecre1/public_html/betasite/wp-includes/functions.php on line 3201 这里会显示通知http://goo.gl/z