Sort users by meta_value_num

时间:2014-06-11 作者:andy

我在使用WP_User_Query 要按元数值对用户进行排序,我认为这很简单,因为它只按字母降序显示结果。

 <?php
$args = array(
    \'orderby\' => \'meta_value_num\',
    \'meta_key \' => \'epicredvote\',
    \'order\' => \'DESC\',
);

// The Query
$user_query = new WP_User_Query( $args );

// User Loop
if ( ! empty( $user_query->results ) ) {
    foreach ( $user_query->results as $user ) {
        echo \'<p>\' . $user->display_name . \'</p>\';
    }
} else {
    echo \'No users found.\';
}
?>
我可以很容易地获得每个作者的元值,但我无法让用户按相同的元值排序。

编辑birgire的答案。

这仍然会输出“未找到用户”。

在函数中。php

function wpse_149342_pre_user_query( $query )
{
    remove_action( current_action(), __FUNCTION__ );

    $query->query_orderby = str_replace( 
        \'meta_value\', 
        \'meta_value+0\', 
        $query->query_orderby 
    );
}
回路:-

   <?php
$args = array(
    \'meta_key\' => \'epicredvote\',
    \'orderby\'  => \'meta_value\',
    \'order\'    => \'DESC\',
);
add_action( \'pre_user_query\', \'wpse_149342_pre_user_query\' );

// The Query
$user_query = new WP_User_Query( $args );

// User Loop
if ( ! empty( $user_query->results ) ) {
    foreach ( $user_query->results as $user ) {
        echo \'<p>\' . $user->display_name . \'</p>\';
    }
} else {
    echo \'No users found.\';
}
?>
wordpress的版本是3.9.1。

我看了一下皮特的答案,我无法理解。

让我解释一下,在这种情况下,meta\\u键是什么。

epicredvote是一个数字值,每个帖子都有一个投票系统,John发了2个帖子,每个帖子都有10票,然后John对他的两个帖子总共有20票。

关于作者。php我使用它来提取用户对其所有帖子的投票总数。

function author_rating_total() {
   $user_id = get_the_author_meta( \'ID\' );
   $query = array (
       \'author\' => $user_id,
       \'suppress_filters\' => \'true\', //lets skip some unnessecery sql queries
       \'posts_per_page\' => -1
   );
   $queryObject = new WP_Query($query); while($queryObject->have_posts()) : $queryObject->the_post();

   $post_ratings_data = get_post_custom(get_the_id());
   $post_ratings_score = intval($post_ratings_data[\'epicredvote\'][0]);

   $ratings_array[] = $post_ratings_score;

   endwhile; 

   $ratings_sum = 0;
   if (is_array($ratings_array)){
    $ratings_sum = array_sum($ratings_array);
    }

   echo $ratings_sum;   

   wp_reset_query();
}
那我就可以了echo author_rating_total(); 显示用户为其所有帖子收到的投票总数。

可以很容易地使用WP\\u user\\u查询来提取相同的元值,然后在给定的日期范围内对作者进行相应的排名,显然不是那么多!

一定有办法的!

4 个回复
SO网友:shyammakwana.me

将此代码添加到functions.php. 使用orderby 具有meta_value_num 并定义meta_key 在参数数组中。

add_action( \'pre_user_query\', \'wps_pre_user_query\' );

function wps_pre_user_query( &$query ) {
    global $wpdb;

    if ( isset( $query->query_vars[\'orderby\'] ) && \'meta_value_num\' == $query->query_vars[\'orderby\'] )
        $query->query_orderby = str_replace( \'user_login\', "$wpdb->usermeta.meta_value+0", $query->query_orderby );
}

SO网友:vancoder

虽然meta_value_num 有效期为WP_Query, 我看不到在WP_User_Query.

相反,请尝试

\'orderby\' => \'meta_value\'

SO网友:birgire

您可以尝试通过pre_user_query 挂钩:

$args = array(
    \'meta_key\' => \'epicredvote\',
    \'orderby\'  => \'meta_value\',
    \'order\'    => \'DESC\',
);

add_action( \'pre_user_query\', \'wpse_149342_pre_user_query\' );

$user_query = new WP_User_Query( $args );
其中:

/**
 * Change \'meta_value\' to \'meta_value_num\'
 *
 * @param WP_User_Query $query
 * @return void
 */

function wpse_149342_pre_user_query( $query )
{
    remove_action( current_action(), __FUNCTION__ );

    $query->query_orderby = str_replace( 
        \'meta_value\', 
        \'meta_value+0\', 
        $query->query_orderby 
    );
}
下面是一个修改后的SQL查询示例:

SELECT SQL_CALC_FOUND_ROWS wp_users.* 
    FROM wp_users 
    INNER JOIN wp_usermeta ON (wp_users.ID = wp_usermeta.user_id) 
    WHERE 1=1 
        AND (wp_usermeta.meta_key = \'epicredvote\' ) 
    ORDER BY wp_usermeta.meta_value+0 DESC
我希望这有帮助。

SO网友:calvin

尝试以下操作:

查询前:

    $wp_user_query = new WP_User_Query($query);
您可以使用“pre\\u user\\u query”挂钩修改SQL查询字符串。

此挂钩允许您修改已准备好但尚未发送到db的sql查询。

创建一个函数来替换sql的ORDER BY部分。在下面的“按强制转换排序”和“作为十进制”中添加,以强制返回的结果在排序之前为数字。

    add_action( \'pre_user_query\', \'score_sort_pre_user_query\' );

    function score_sort_pre_user_query( $query )
    {
        remove_action( current_action(), __FUNCTION__ );

        $query->query_orderby = str_replace( 
            \'ORDER BY wp_usermeta.meta_value\', 
            \'ORDER BY CAST(wp_usermeta.meta_value as DECIMAL)\', 
            $query->query_orderby 
        );
    }

结束

相关推荐

使用新的WP-Query()从循环中过滤后期格式;

嗨,我目前正在为我的博客构建一个主题。下面的代码指向最新的帖子(特色帖子)。因为这将有一个不同的风格比所有其他职位。然而我想过滤掉帖子格式:链接使用我在循环中定义的WP查询,因为它给我带来了更多的灵活性。我该怎么做呢? <?php $featured = new WP_Query(); $featured->query(\'showposts=1\'); ?> <?php while ($featured->have_post