用户管理面板中的自定义默认筛选会禁用其他可排序列

时间:2018-08-18 作者:XaWin

我的设置

我有一个关于管理面板中用户过滤器过滤的问题。我添加了显示“registration\\u date”过滤器的代码,该过滤器工作正常。I found this website to describe the process. This part works fine.

现在,我正在尝试按最近注册的用户实现默认排序。在我的功能中。php,我尝试过这种方法which I\'ve found here. This part works partially only. 这是我的代码:

add_action(\'pre_get_users\', \'change_user_order\');

function change_user_order($query) {
    $screen = get_current_screen();
    if( is_admin() && \'users\' == $screen->base) {
        if( !isset($query->query[\'orderby\']) ) {
            $query->set(\'orderby\', \'registered\');
            $query->set(\'order\', \'DESC\');
        }
    }

   // We need to remember to return the altered query.
   return $query;
}
默认情况下,此部分工作正常,因为过滤是由最新版本完成的。现在,它似乎还取消了对其他可排序列进行排序的所有其他可能性(例如asc登录)。例如,此urlwp-admin/users.php?orderby=login&order=asc 不会显示按登录名排序的用户字段。What did I do wrong?


Update - Accepted solution & final code

为完整起见,用户面板中此默认选择的可排序列和订单列的最终代码附在此处:

add_action(\'pre_get_users\', \'change_user_order\');

function change_user_order($query) {
    $screen = get_current_screen();
    if( is_admin() && \'users\' == $screen->base) {
        // Set default `orderby` to \'registered\'.
        if( empty( $_REQUEST[\'orderby\'] ) || !isset($query->query_vars[\'orderby\']) ) {
            $query->set(\'orderby\', \'registered\');
        }
        // Set default `order` to \'DESC\'.
        if( empty( $_REQUEST[\'order\'] ) || !isset($query->query_vars[\'order\']) ) {
            $query->set(\'order\', \'DESC\');
        }       
    }

   // We need to remember to return the altered query.
   return $query;
}

1 个回复
最合适的回答,由SO网友:Sally CJ 整理而成

首先,使用$query->query_vars 而不是$query->query.

其次,您应该在重写相应的查询变量之前运行此条件检查:

empty( $_REQUEST[\'{VAR}\'] ) || !isset($query->query_vars[\'{VAR}\'])
在哪里{VAR} 对应于查询变量的名称,例如orderby.

试试这个,对我来说很有用:

// Set default `orderby` to \'registered\'.
if( empty( $_REQUEST[\'orderby\'] ) || !isset($query->query_vars[\'orderby\']) ) {
    $query->set(\'orderby\', \'registered\');
}

// Set default `order` to \'DESC\'.
if( empty( $_REQUEST[\'order\'] ) || !isset($query->query_vars[\'order\']) ) {
    $query->set(\'order\', \'DESC\');
}
您将使用它来代替:

if( !isset($query->query[\'orderby\']) ) {
    $query->set(\'orderby\', \'registered\');
    $query->set(\'order\', \'DESC\');
}

结束

相关推荐

使用admin-post将表单数据提交到外部数据库

我正在WordPress中创建一个自定义表单来存储数据并将其发送到外部数据库。作为测试的一部分,我成功地创建了一个表单,通过单击submit按钮将表单引用回自身,将表单数据提交到外部数据库。我现在想利用WordPress管理帖子功能,而不是让表单引用回自身。我已经正确设置了操作挂钩,因为在提交表单后,我会使用以下方式显示$\\u POST变量:<form action=\"<?php echo esc_url( admin_url( \'admin-post.php\' ) ); ?>\