Trying to sort custom columns on the user.php screen, but can't seem to get it to work correctly. Hoping someone sees my error
Code:
function modify_user_table( $column ) {
$column['status'] = 'Status';
return $column;
}
add_filter( 'manage_users_columns', 'modify_user_table' );
function modify_user_table_row( $val, $column_name, $user_id ) {
$user = get_userdata( $user_id );
switch ($column_name) {
case 'status' :
$status = $user->status;
if ($status == 'Current'){
return '<div class="special2">'.$status.'</div>';
}else if ($status == 'Past Due'){
return '<div class="special1">'.$status.'</div>';
}else{ return '<div class="special">'.$status.'</div>'; }
break;
default:
}
switch ($column_name) {
case 'status' :
return $user->status;
break;
default:
}
return $return;
}
add_filter( 'manage_users_custom_column', 'modify_user_table_row', 10, 3 );
function status_column_sortable($columns) {
$custom = array(
'status' => 'status',
);
return wp_parse_args($custom, $columns);
}
add_filter( 'manage_users_sortable_columns', 'status_column_sortable' );
function status_column_orderby( $vars ) {
if ( isset( $vars['orderby'] ) && 'status' == $vars['orderby'] ) {
$vars = array_merge( $vars, array(
'meta_key' => 'status',
'orderby' => 'meta_value'
) );
}
return $vars;
}
add_filter( 'request', 'status_column_orderby' );
EDIT------------------------------------------
To clarify:
The column is 'appearing' as sortable, and the column is properly being filled with the right information
However, it is ordering by username (the default sort) and not by the actual content of the column
Navjot Singh answers:
Try changing
function status_column_sortable($columns) {
$custom = array(
'status' => 'status',
);
return wp_parse_args($custom, $columns);
}
to
function status_column_sortable( $columns ) {
$columns['status'] = 'status';
return $columns;
}
Kyle comments:
Hello, thanks for the reply. I tried this but it didn't work. I added some additional info up top.
Navjot Singh comments:
Try replacing
function status_column_orderby( $vars ) {
if ( isset( $vars['orderby'] ) && 'status' == $vars['orderby'] ) {
$vars = array_merge( $vars, array(
'meta_key' => 'status',
'orderby' => 'meta_value'
) );
}
return $vars;
}
add_filter( 'request', 'status_column_orderby' );
by
add_action('pre_user_query', 'status_column_orderby');
function status_column_orderby($userquery){
if('status'==$userquery->query_vars['orderby']) {//check if church is the column being sorted
global $wpdb;
$userquery->query_from .= " LEFT OUTER JOIN $wpdb->usermeta AS alias ON ($wpdb->users.ID = alias.user_id) ";//note use of alias
$userquery->query_where .= " AND alias.meta_key = 'status' ";//which meta are we sorting with?
$userquery->query_orderby = " ORDER BY alias.meta_value ".($userquery->query_vars["order"] == "ASC" ? "asc " : "desc ");//set sort order
}
}
Kyle comments:
THis almost works, but it doesn't display users with empty meta values
Kyle comments:
Is there someway to correct it so it doesn't drop off users with empty values?
Navjot Singh comments:
Drop users with empty meta values? From my testing, the users with empty meta values are still shown at the end or starting depending on the sort. Where's the issue?
Kyle comments:
Well, for example on the test site I have 7 users with example values for Status, but when I click to orderby status, it is only displaying 5 users (the 2 users with empty values are not visible).
Navjot Singh comments:
Can you PM me your login?
Kyle comments:
Unfortunately no, this is a client's site
Navjot Singh comments:
I created 3 users and added the same meta value using the plugin you mentioned but can't reproduce. Can you show me the screenshot of the user page after you click sort? What happens? And which WP version you using?
Kyle comments:
Here is a clean screenshot, notice only 5/7 users are displayed when sorting by Status
http://imgur.com/y61dQlB
Navjot Singh comments:
No idea. Can't reproduce it here. Try deactivating your plugins 1 by 1 except the User meta one and see if that helps in identifying the problem.
Kyle comments:
I set a default value of ' ' for the meta field and that solved it. Thanks for your help!
Daniel Yoen answers:
try to use 'pre_get_posts' instead 'request'.
add_action( 'pre_get_posts', 'status_column_orderby' );
hope this help :-)
Kyle comments:
Thanks for the reply, no luck though
Daniel Yoen comments:
complete code :-)
add_action( 'pre_get_posts', 'event_column_orderby' );
function event_column_orderby($query)
{
$orderby = $query->get('orderby');
if('status' == $orderby)
{
$query->set('meta_key','status');
$query->set('orderby','meta_value');
}
}
hope this help :-)
Kyle comments:
Still no luck
asok answers:
I'm looking to see if there is a simpler/efficient way.
but isn't the column name user_status. Tried to edit your code to use 'user_status' as the column name, instead. See if it works.
function modify_user_table( $column ) {
$column['user_status'] = 'Status';
return $column;
}
add_filter( 'manage_users_columns', 'modify_user_table' );
function modify_user_table_row( $val, $column_name, $user_id ) {
$user = get_userdata( $user_id );
switch ($column_name) {
case 'user_status' :
$status = $user->user_status;
if ($status == 'Current'){
return '<div class="special2">'.$status.'</div>';
}else if ($status == 'Past Due'){
return '<div class="special1">'.$status.'</div>';
}else{ return '<div class="special">'.$status.'</div>'; }
break;
default:
}
switch ($column_name) {
case 'user_status' :
return $user->user_status;
break;
default:
}
return $return;
}
add_filter( 'manage_users_custom_column', 'modify_user_table_row', 10, 3 );
function status_column_sortable($columns) {
$custom = array(
'user_status' => 'user_status',
);
return wp_parse_args($custom, $columns);
}
add_filter( 'manage_users_sortable_columns', 'status_column_sortable' );
function status_column_orderby( $vars ) {
if ( isset( $vars['orderby'] ) && 'status' == $vars['orderby'] ) {
$vars = array_merge( $vars, array(
'meta_key' => 'user_status',
'orderby' => 'meta_value'
) );
}
return $vars;
}
add_filter( 'request', 'status_column_orderby' );
Kyle comments:
Interesting... technically this worked, but it does not display users with empty meta_values for the column
Arnav Joy answers:
try this
function modify_user_table( $column ) {
$column['status'] = 'status';
return $column;
}
add_filter( 'manage_users_columns', 'modify_user_table' );
function modify_user_table_row( $val, $column_name, $user_id ) {
$user = get_userdata( $user_id );
switch ($column_name) {
case 'status' :
$status = $user->status;
if ($status == 'Current'){
return '<div class="special2">'.$status.'</div>';
}else if ($status == 'Past Due'){
return '<div class="special1">'.$status.'</div>';
}else{ return '<div class="special">'.$status.'</div>'; }
break;
default:
}
switch ($column_name) {
case 'status' :
return $user->status;
break;
default:
}
return $return;
}
add_filter( 'manage_users_custom_column', 'modify_user_table_row', 10, 3 );
function status_column_sortable($columns) {
$custom = array(
'status' => 'status',
);
return wp_parse_args($custom, $columns);
}
add_filter( 'manage_users_sortable_columns', 'status_column_sortable' );
function status_column_orderby( $vars ) {
if ( isset( $vars['orderby'] ) && 'status' == $vars['orderby'] ) {
$vars = array_merge( $vars, array(
'meta_key' => 'status',
'orderby' => 'meta_value'
) );
}
return $vars;
}
add_filter( 'request', 'status_column_orderby' );
Kyle comments:
Can you please specify what changes you made
Arnav Joy comments:
i changed this line
$column['status'] = 'Status';
to
$column['status'] = 'status';
Kyle comments:
Oh okay, no luck there
Thanks for the reply btw
Dbranes answers:
Hi, I just wanted to join the sorting club here ;-)
Here is another way to sort the custom column:
[[LINK href="http://j3webworks.com/blog/wordpress-add-and-sort-custom-column-in-users-admin-page"]]http://j3webworks.com/blog/wordpress-add-and-sort-custom-column-in-users-admin-page[[/LINK]]
By using the above info, with some modifications, I can get your code to work, if I add this part:
add_action('pre_user_query', 'status_order_in_user_query');
function status_order_in_user_query($query){
// print_r($query); // for debugging
if('status'==$query->query_vars['orderby']) {
$query->query_orderby = " ORDER BY user_status ".($query->query_vars["order"] == "ASC" ? "asc " : "desc ");//set sort order
}
}
I just order by the <strong>user_status</strong> field in the <strong>wp_users</strong> table (not doing any meta_value ordering)
Hope this helps ;-)
<strong>PS:</strong> I just had to replace <strong>$user->status</strong> with <strong>$user->user_status,</strong>, in your code, to get the status values on my single WP install.
Kyle comments:
Thanks for the reply
No accurate result though
Dbranes comments:
ok, looks like your setup is different ;-)
ps: just curious, did you add a new <strong>status</strong> column in the wp_users table?
$user = get_userdata( $user_id );
print_r($user);
does not give me any <strong>status</strong> value.
Kyle comments:
Yes I did, should have said that explicitly
Did so with this: http://wordpress.org/extend/plugins/user-meta-manager/
Pretty well made plugin, nice ajax actions
Dbranes comments:
ok, that explains it ;-)
'
so you actually need user meta sorting instead of my user_status field sortering
You can check out the link I provided above, it has the original code used by myself and @Navjot.
... thanks for the info