¿Cómo establecer el orden predeterminado de administración para un tipo de entrada personalizada en una columna personalizada?

15 jul 2015, 13:52:11
Vistas: 20K
Votos: 16

SOLUCIÓN DISPONIBLE AQUÍ

He configurado un tipo de entrada personalizada llamado clientarea, y he establecido varias columnas personalizadas en el área de administración - las columnas personalizadas son todos campos meta personalizados, como pueden ver en mi código. Me gustaría ordenar por 'Fecha de Cita' de forma descendente por defecto.

Todas las columnas funcionan bien y se pueden ordenar manualmente como se espera, pero no puedo hacer que funcione el orden predeterminado.

Si cambio el campo de ordenación predeterminado a un campo estándar (por ejemplo, 'título') funciona como se espera; solo parece no funcionar cuando intento establecer una columna personalizada como orden predeterminado. El orden funciona (es decir, puedo cambiar entre asc y desc por defecto incluso con una columna personalizada), pero no está detectando el orderby por lo que vuelve a ordenar por la fecha en que se publicó la entrada personalizada.

¿Qué me estoy perdiendo?

Mi código es el siguiente:

add_action( 'manage_posts_custom_column' , 'custom_columns', 10, 2 );

function custom_columns( $column, $post_id ) {
    global $wpdb;
    switch ( $column ) {
        case 'extranet_case_office':
            $get_office_ID = get_post_meta( $post_id, 'extranet_case_office', true );
            $get_office_name = $wpdb->get_results('SELECT post_title FROM `cn_bf_posts` WHERE `ID` = '.$get_office_ID);
            echo $get_office_name[0]->post_title;
            break;
        case 'extranet_appointment_date':
            echo date('d/m/Y',strtotime(get_post_meta( $post_id, 'extranet_appointment_date', true ))); 
            break;
        case 'extranet_appointment_type':
            echo get_post_meta( $post_id, 'extranet_appointment_type', true ); 
            break;
        case 'extranet_insolvency_practioner':
            $get_person_ID = get_post_meta( $post_id, 'extranet_insolvency_practioner', true );
            $get_person_name = $wpdb->get_results('SELECT post_title FROM `cn_bf_posts` WHERE `ID` = '.$get_person_ID);
            echo $get_person_name[0]->post_title;
            break;
        default:
            break;
    }
}

add_filter( 'manage_edit-clientarea_sortable_columns', 'my_sortable_clientarea_columns' );

function my_sortable_clientarea_columns( $columns ) {
    $columns['extranet_case_office'] = 'extranet_sort_office';
    $columns['extranet_appointment_date'] = 'extranet_sort_date';
    $columns['extranet_appointment_type'] = 'extranet_sort_type';
    $columns['extranet_insolvency_practioner'] = 'extranet_sort_IP';
    return $columns;
}

add_action( 'pre_get_posts', 'extranet_orderby' );

function extranet_orderby( $query ) {
    if( ! is_admin() )
        return;

    $orderby = $query->get( 'orderby');

    switch ( $orderby ) {
        case 'extranet_sort_office':
            $query->set('meta_key','extranet_case_office');
            $query->set('orderby','meta_value_num');
            break;
        case 'extranet_sort_date':
            $query->set('meta_key','extranet_appointment_date');
            $query->set('orderby','meta_value');
            break;
        case 'extranet_sort_type':
            $query->set('meta_key','extranet_appointment_type');
            $query->set('orderby','meta_value');
            break;
        case 'extranet_sort_IP':
            $query->set('meta_key','extranet_insolvency_practioner');
            $query->set('orderby','meta_value_num');
            break;
        default:
            break;
    }
}

add_action('pre_get_posts','clientarea_default_order');
function clientarea_default_order( $query ){
    if( $query->get('post_type')=='clientarea' ){
        if( $query->get('orderby') == '' )
            $query->set('orderby','extranet_sort_date');

        if( $query->get('order') == '' )
            $query->set('order','desc');
    }
}
8
Comentarios

Siguiendo - He intentado esto en el pasado para un cliente con resultados mixtos. Ansioso por ver una buena solución para este caso.

jdm2112 jdm2112
15 jul 2015 17:44:05

¿Lograste resolver el ordenamiento para tus columnas personalizadas?

jdm2112 jdm2112
21 jul 2015 23:44:59

@jdm2112 - sí - también publiqué esto en Stack Exchange (porque tenía suficiente reputación para establecer una recompensa allí...) - ambas respuestas proporcionadas son correctas, pero la aceptada ofrece más explicación y algunas mejoras sugeridas al código. http://stackoverflow.com/questions/31434373/in-wordpress-how-do-i-set-the-default-admin-sort-order-for-a-custom-post-type-t

SinisterBeard SinisterBeard
27 jul 2015 11:48:47

Deberías añadir una solución adecuada. Puedes copiar la solución de tu publicación en [so], o una combinación de todas las respuestas y luego simplemente publicar el enlace como forma de crédito a los autores originales. Sé que a @birgire no le importaría una republicación con crédito ;-)

Pieter Goosen Pieter Goosen
27 jul 2015 11:53:44

LO SIENTO, Sé que a @birgire no le importaría una republicación con crédito DEBERÍA SER Sé que a birgire no le importaría una republicación con crédito :-)

Pieter Goosen Pieter Goosen
27 jul 2015 12:05:04

¡Hecho! No estaba seguro sobre la etiqueta.

SinisterBeard SinisterBeard
27 jul 2015 12:13:46

Me alegra escuchar que ayudó con el problema, acabo de notar la pregunta aquí en WPSE. @PieterGoosen gracias por tus sugerencias, "importar o no importar" esa es la pregunta épica

birgire birgire
27 jul 2015 13:28:32

@birgire te conozco demasiado bien ;-)

Pieter Goosen Pieter Goosen
27 jul 2015 13:33:17
Mostrar los 3 comentarios restantes
Todas las respuestas a la pregunta 1
1
12

Solución de una publicación cruzada en StackExchange de @birgire:

El problema es que ejecutas el callback clientarea_default_order demasiado tarde.

Para solucionarlo, solo necesitas cambiar la prioridad del valor por defecto que es 10:

add_action( 'pre_get_posts','clientarea_default_order');

a una prioridad de 9:

add_action( 'pre_get_posts','clientarea_default_order', 9 );

Pero en realidad no necesitas dos callbacks pre_get_posts.

Puedes combinarlos:

Ejemplo #1

is_admin() && add_action( 'pre_get_posts', 'extranet_orderby' );    

function extranet_orderby( $query ) 
{   
    // Nada que hacer:  
    if( ! $query->is_main_query() || 'clientarea' != $query->get( 'post_type' )  )
        return;

    //-------------------------------------------  
    // Modificar las partes 'orderby' y 'meta_key'
    //-------------------------------------------  
    $orderby = $query->get( 'orderby');      

    switch ( $orderby ) 
    {
        case 'extranet_sort_office':
            $query->set( 'meta_key', 'extranet_case_office' );
            $query->set( 'orderby',  'meta_value_num' );
            break;
        case 'extranet_sort_date':
            $query->set( 'meta_key', 'extranet_appointment_date' );  
            $query->set( 'orderby',  'meta_value' );
            break;
        case '':  // <-- Caso vacío por defecto
            $query->set( 'meta_key', 'extranet_appointment_date' );  
            $query->set( 'orderby',  'meta_value' );
            break;
        case 'extranet_sort_type':
            $query->set( 'meta_key', 'extranet_appointment_type' );
            $query->set( 'orderby',  'meta_value' );
            break;
        case 'extranet_sort_IP':
            $query->set( 'meta_key', 'extranet_insolvency_practioner' );
            $query->set( 'orderby', 'meta_value_num' );
            break;
        default:
            break;
    }
}

donde añadimos una comprobación de consulta principal y un caso de vacío en el switch.

Ejemplo #2

Aquí hay otro enfoque, sin la parte del switch (PHP 5.4+):

is_admin() && add_action( 'pre_get_posts', 'extranet_orderby' );

function extranet_orderby( $query )
{
    // Nada que hacer
    if( ! $query->is_main_query() || 'clientarea' != $query->get( 'post_type' )  )
        return;

    //-------------------------------------------  
    // Modificar las partes 'orderby' y 'meta_key'
    //-------------------------------------------  
    $orderby = strtolower( $query->get( 'orderby') );  
    $mods = [
        'office' => [ 'meta_key' => 'extranet_sort_office',           'orderby' => 'meta_value_num' ],
        'date'   => [ 'meta_key' => 'extranet_appointment_date',      'orderby' => 'meta_value'     ],
        ''       => [ 'meta_key' => 'extranet_appointment_date',      'orderby' => 'meta_value'     ],
        'type'   => [ 'meta_key' => 'extranet_sort_type',             'orderby' => 'meta_value_num' ],
        'ip'     => [ 'meta_key' => 'extranet_insolvency_practioner', 'orderby' => 'meta_value_num' ],
    ];
    $key = 'extranet_sort_' . $orderby;
    if( isset( $mods[$key] ) )
    {
        $query->set( 'meta_key', $mods[$key]['meta_key'] );
        $query->set( 'orderby',  $mods[$key]['orderby']  );
    }
}
27 jul 2015 12:13:02
Comentarios

Genial, gracias por publicar una respuesta completa y con crédito. +1

Pieter Goosen Pieter Goosen
27 jul 2015 12:21:33