¿Cómo establecer el orden predeterminado de administración para un tipo de entrada personalizada en una columna personalizada?
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');
}
}

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'] ); } }
