我在 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);
处理这个问题的适当方法是什么?
您是否尝试过使用
type
参数?
'type' (int) 排序顺序。接受 'active', 'random', 'newest', “流行”、“在线”、“按字母顺序排列”。默认值:“活动”。
所以...
$args['type'] = 'alphabetical';
afaik,它将根据名字的第一个字母按字母顺序排列。
你真的需要这些吗?
$args['max'] = count($user_ids);
$args['include'] = $user_ids;
我找到了解决方案... 我们需要第二个钩子来使用
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;
}