自定义成员循环与自定义订单

问题描述 投票:0回答:2

我在 Buddypress 中有一个自定义成员循环,包括分页(每页最多 25 个条目),我想在其中根据预先排序的用户 ID 列表显示一些成员。这些用户 ID 来自我的自定义表,并根据一列进行排序。

代码如下所示:

add_filter( 'bp_after_has_members_parse_args', 'my_custom_users' );
function my_custom_users( $args ) {
    $per_page_setting = 25;
    $page = 1;
    if ( isset( $_REQUEST['vpage'] ) ) {
        $page = absint( $_REQUEST['vpage'] );
    }
    
    global $wpdb;
    $user_ids = $wpdb->get_col('SELECT user_id FROM some_table WHERE some_condition = ' . bp_loggedin_user_id() . ' ORDER BY column DESC');
    
    # @see bp_has_members()
    $args['page']     = $page;
    $args['per_page'] = $per_page_setting;
    $args['max']      = count($user_ids);
    $args['include']  = $user_ids;

    return $args;
}

一切都按预期工作,只是排序关闭/错误,因为

bp_has_members()
bp_core_get_users()
BP_User_Query()
不维护它,即使它只能对我使用“include”参数提供的用户列表进行分页.

我试着这样做,但这不起作用,因为它打破了 Buddypress 假设的分页,这已经是用户 ID 的完整列表:

$args['include']  = array_slice($visitor_ids, ($page-1)*$per_page_setting, $per_page_setting);

处理这个问题的适当方法是什么?

database buddypress buddyboss
2个回答
0
投票

您是否尝试过使用

type
参数?

'type' (int) 排序顺序。接受 'active', 'random', 'newest', “流行”、“在线”、“按字母顺序排列”。默认值:“活动”。

所以...

$args['type']     = 'alphabetical';
afaik,它将根据名字的第一个字母按字母顺序排列。

你真的需要这些吗?

$args['max']      = count($user_ids);
$args['include']  = $user_ids;

0
投票

我找到了解决方案... 我们需要第二个钩子来使用

bp_pre_user_query_construct
中的钩子来保持基于我的用户 ID 列表的排序。使用它,它使这个数组与定义的用户 ID 保持一致。

这是解决方案:

add_filter( 'bp_after_has_members_parse_args', 'my_custom_users' );
function my_custom_users( $args ) {
    $per_page_setting = 25;
    $page = 1;
    if ( isset( $_REQUEST['vpage'] ) ) {
        $page = absint( $_REQUEST['vpage'] );
    }
    
    global $wpdb;
    $user_ids = $wpdb->get_col('SELECT user_id FROM some_table WHERE some_condition = ' . bp_loggedin_user_id() . ' ORDER BY column DESC');
    
    # @see bp_has_members()
    $args['page']     = $page;
    $args['per_page'] = $per_page_setting;
    $args['max']      = count($user_ids);
    $args['include']  = $user_ids;

    # @see class BP_User_Query() to see how this aciton ref thing works...
    add_action( 'bp_pre_user_query_construct', function ( $obj ) use ( $user_ids ) {
        $obj->query_vars['user_ids'] = array_slice($user_ids, ($page-1)*$per_page_setting, $per_page_setting);
    }); 

    return $args;
}
© www.soinside.com 2019 - 2024. All rights reserved.