¿Columnas personalizables ordenables en el panel de usuario (users.php)?

8

Estoy usando el complemento Register Plus Redux para aumentar un formulario de registro con campos de metadatos personalizados. Estos campos se muestran en la parte inferior de la página de detalles de registro de cada usuario y se pueden recuperar con get_the_author_meta.

Además, puedo crear columnas en el panel Usuario (la vista de lista) y hacer que estas columnas se puedan ordenar. El problema es que, cuando hago clic en el encabezado de la columna personalizada, el valor orderby = en la URL parece ignorarse. Dicho de otra manera, parece que la consulta que genera la vista de lista de usuarios no incluye los metadatos personalizados (por ejemplo, ¿tal vez requiera una declaración de unión si los metadatos no están en el lugar habitual para los datos del usuario?). Parece que he perdido un paso.

Aquí está mi código para crear las columnas personalizadas:

//add columns to User panel list page
function add_user_columns( $defaults ) {
     $defaults['company'] = __('Company', 'user-column');
     $defaults['title'] = __('Title', 'user-column');
     return $defaults;
}
function add_custom_user_columns($value, $column_name, $id) {
      if( $column_name == 'company' ) {
        return get_the_author_meta( 'company_name', $id );
      }
      if( $column_name == 'title' ) {
        return get_the_author_meta( 'titlefunction', $id );
      }
}
add_action('manage_users_custom_column', 'add_custom_user_columns', 15, 3);
add_filter('manage_users_columns', 'add_user_columns', 15, 1);`

Y aquí está mi código para hacer que estas columnas se puedan ordenar:

function user_sortable_columns( $columns ) {
    $columns['company'] = 'Company';
    return $columns;
}
add_filter( 'manage_users_sortable_columns', 'user_sortable_columns' );

function user_column_orderby( $vars ) {
    if ( isset( $vars['orderby'] ) && 'company' == $vars['orderby'] ) {
        $vars = array_merge( $vars, array(
            'meta_key' => 'company',
            'orderby' => 'meta_value',
            'order'     => 'asc'
        ) );
    }
    return $vars;
}
add_filter( 'request', 'user_column_orderby' );`

¿Alguna idea de cómo puedo actualizar la consulta que genera la lista de usuarios para que incluya la clasificación por mis campos personalizados? O, si ese no es el problema, ¿cómo hacer que los encabezados de columna personalizados ordenen la lista de usuarios al hacer clic?

Gracias.

FredHead
fuente
Consulte el blog tekina.info/… para obtener una explicación detallada
Aniket Singh, el

Respuestas:

6

Mi primera respuesta fue completamente fuera de lugar y la estoy reescribiendo por completo ...

Pero gracias a la sugerencia de Milo, encontré la solución aquí:
http://wordpress.mcdspot.com/2011/05/24/search-admin-user-list-on-first-and-last-names/

Después de adaptarlo, esto funciona para mí con 'facebook' y 'twitter' author_meta.

add_action('pre_user_query','wpse_27518_pre_user_query');
function wpse_27518_pre_user_query($user_search) {
    global $wpdb,$current_screen;

    if ( 'users' != $current_screen->id ) 
        return;

    $vars = $user_search->query_vars;

    if('facebook' == $vars['orderby']) 
    {
        $user_search->query_from .= " INNER JOIN {$wpdb->usermeta} m1 ON {$wpdb->users}.ID=m1.user_id AND (m1.meta_key='facebook')"; 
        $user_search->query_orderby = ' ORDER BY UPPER(m1.meta_value) '. $vars['order'];
    } 

    elseif ('twitter' == $vars['orderby']) 
    {
        $user_search->query_from .= " INNER JOIN {$wpdb->usermeta} m1 ON {$wpdb->users}.ID=m1.user_id AND (m1.meta_key='twitter')"; 
        $user_search->query_orderby = ' ORDER BY UPPER(m1.meta_value) '. $vars['order'];
   }
}
brasofilo
fuente
1

No estoy seguro de que sea posible, tal vez modificando la consulta a través de pre_user_query. Aquí hay una función rápida y sucia para ver su contenido:

add_action('pre_user_query', 'my_user_query');
function my_user_query($userquery){
    print_r($userquery);
    die();
}
Milo
fuente
El resultado de pre_user_query es: WP_User_Query Object ([results] => [total_users] => 0 [query_fields] => SQL_CALC_FOUND_ROWS wp_users.ID [query_from] => FROM wp_users [query_where] => WHERE 1 = 1 [query_orderby] => WHERE 1 = 1 [query_orderby] => BY user_login ASC [query_limit] => LIMIT 20 [query_vars] => Array ([blog_id] => 1 [role] => [meta_key] => [meta_value] => [meta_compare] => [include] => Array ( ) [excluir] => Matriz () [buscar] => [pedido] => Compañía [pedido] => ASC [desplazamiento] => 0 [número] => 20 [cuenta_total] => 1 [campos] => todo_con_meta [who] =>)). ¿Cómo modificaría esta consulta, por ejemplo, unirme a una tabla db?
FredHead
@FredHead, si va a publicar una gran cantidad de código, puede considerar usar pastebin, snipplr o algo similar.
Jeremy Jared
@ FredHead: sinceramente, no lo sé. Podría intentar hackearlo más tarde, o espero que algunos usuarios más experimentados puedan arrojar algo de luz sobre ello.
Milo
Lo sentimos, intentaba responder pero recibía mensajes de error relacionados con comentarios inescrutables en Chrome, Firefox que impedían el envío el jueves / viernes.
FredHead
Intentemos esto de nuevo: Milo, tu respuesta al menos me lleva al estadio, gracias. Ahora necesito entender si / cómo adaptar la consulta del usuario. ¿Quizás alguien pueda ayudarme a entender esa parte del problema? Jeremy, encuentro que esta interfaz de comentarios es difícil de usar (presiona la tecla Intro = enviar comentario) o habría movido el código de salida a otra parte. Lo siento.
FredHead
1

La forma más sencilla de hacerlo en mi opinión:

<?php

/**
 * Sorting logic for custom columns on WP user table
 */
add_action('pre_user_query', function(WP_User_Query $query) {
  global $wpdb, $current_screen;

  // Bail if viewing anything other than user list in WP Admin
  if ( 'users' != $current_screen->id ) {
    return;
  }

  if ( 'company' === $query->query_vars['orderby'] ) {
    $query->orderby = 'meta_value';
    $query->meta_key = 'company_name';
  }

  else if ( 'title' === $query->query_vars['orderby'] ) {
    $query->orderby = 'meta_value';
    $query->meta_key = 'titlefunction';
  }

}, 10, 1);
Ahrengot
fuente
1

Si sus meta valores no están completamente poblados (tiene valores nulos), la excelente respuesta de @ brasofilo producirá una lista de usuarios que omite a los usuarios con valores faltantes de meta_valores.

Sin embargo, la solución es fácil. Solo haz una IZQUIERDA UNIRSE :

add_action('pre_user_query','wpse_27518_pre_user_query');
function wpse_27518_pre_user_query($user_search) {
    global $wpdb,$current_screen;

    if ( 'users' != $current_screen->id ) 
        return;

    $vars = $user_search->query_vars;

    if('facebook' == $vars['orderby']) 
    {
        $user_search->query_from .= " LEFT JOIN {$wpdb->usermeta} m1 ON {$wpdb->users}.ID=m1.user_id AND (m1.meta_key='facebook')"; 
        $user_search->query_orderby = ' ORDER BY UPPER(m1.meta_value) '. $vars['order'];
    } 

    elseif ('twitter' == $vars['orderby']) 
    {
        $user_search->query_from .= " LEFT JOIN {$wpdb->usermeta} m1 ON {$wpdb->users}.ID=m1.user_id AND (m1.meta_key='twitter')"; 
        $user_search->query_orderby = ' ORDER BY UPPER(m1.meta_value) '. $vars['order'];
   }
}

$user_search->query_from .= " LEFT JOIN {$wpdb->usermeta} m1 ON {$wpdb->users}.ID=m1.user_id AND (m1.meta_key='facebook')";

David Roth
fuente
-1

Pude lograr que el usuario clasifique una columna personalizada utilizando el código y los ganchos que ha publicado, excepto que no utilicé el filtro 'solicitud', ni necesité una función adicional 'ordenar por'. Wordpress ordena correctamente los datos en la columna personalizada en mi caso por el valor numérico que devuelvo en la devolución de llamada de acción 'manage_users_custom_column'.

ricosrealm
fuente
Frio. ¿Podría publicar el código actualizado para mí / todos? ¡Gracias!
FredHead