如何按日期时间对自定义用户列表列进行排序?

时间:2016-02-23 作者:mike23

我正在尝试将排序选项添加到我在Wordpress admin中添加的一些自定义用户列表列中。这是我的代码:

function mmm_user_sortable_columns_query( $userquery ){

    if( \'test_date\' == $userquery -> query_vars[\'orderby\'] ) {

        global $wpdb;

        $userquery -> query_from .= " LEFT OUTER JOIN $wpdb->usermeta AS alias ON ($wpdb->users.ID = alias.user_id) ";
        $userquery -> query_where .= " AND alias.meta_key = \'test_date\' ";
        $userquery -> query_orderby = " ORDER BY alias.meta_value " . ($userquery -> query_vars["order"] == "ASC" ? "asc " : "desc ");

    }

}
add_action( \'pre_user_query\', \'mmm_user_sortable_columns_query\' );
这不能正确排序,因为我的元值不是字符串,而是日期时间。因此,我尝试将query\\u orderby替换为:

$userquery -> query_orderby = " ORDER BY CONVERT( datetime, alias.meta_value ) " . ($userquery -> query_vars["order"] == "ASC" ? "asc " : "desc ");
但这行不通。和添加

$userquery -> query_where .= " AND alias.meta_type = \'DATETIME\' ";
也不行。我错过了什么?

1 个回复
SO网友:birgire

我认为通过使用pre_get_users 钩子,而不是直接使用pre_user_query

尝试以下操作:

add_action( \'pre_get_users\', function( \\WP_User_Query $q )
{
    $qv = &$q->query_vars;
    if( isset( $qv[\'orderby\'] ) && \'test_date\' === $qv[\'orderby\'] )
    {
        // Custom meta query
        $qv[\'meta_query\'] = [
            \'custom\' => [
                \'key\'   => \'test_date\',
                \'type\'  => \'DATETIME\'
            ]
        ];

        // Order by the \'custom\' meta query
        $qv[\'orderby\'] = \'custom\';

    }
} );
我们添加了额外的\'custom\' 输入元查询,以便我们也可以按它排序。这将假定所有用户都具有test_date 用户元密钥。

希望您能对此进行相应的调整。

相关推荐

禁用WordPress主题浏览器和插件浏览器

Wordpress主题浏览器是否有名称?我查看了它的代码,没有看到任何特殊的东西,当我搜索谷歌时,我会得到其他主题。要禁用主题浏览器并保持“上载主题”按钮处于活动状态,我想添加一些代码,如:add_filter(\'theme_browser\', \'__return_false\'); 实际上,我想禁用主题浏览器和插件浏览器。有没有办法做到这一点,但保持上传主题按钮和上传插件按钮处于活动状态?