SOLUTION DISPONIBLE ICI
J'ai configuré un type de publication personnalisé appelé clientarea, ainsi que plusieurs colonnes personnalisées dans la zone d'administration. Toutes les colonnes personnalisées sont des champs méta personnalisés, comme vous pouvez le constater à partir de mon code. J'aimerais trier par date de rendez-vous décroissant par défaut.
Toutes les colonnes fonctionnent correctement et peuvent être triées manuellement comme prévu, mais je ne parviens pas à obtenir l'ordre de tri par défaut.
Si je modifie le champ de tri par défaut en un champ standard (par exemple, "titre"), il fonctionne comme prévu. cela semble seulement ne pas fonctionner lorsque j'essaie de définir une colonne personnalisée comme ordre de tri par défaut. La commande fonctionne (c’est-à-dire que je peux changer par défaut entre asc et déc même avec une colonne personnalisée), mais elle ne récupère pas la commande, elle revient donc au tri par date de publication de la publication personnalisée.
Qu'est-ce que je rate?
Mon code est le suivant:
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');
}
}
Solution de cross post sur StackExchange de @birgire :
Le problème est que vous exécutez le rappel
clientarea_default_order
trop tard.Pour résoudre ce problème, il vous suffit de changer la priorité de celle par défaut qui est
10
:add_action( 'pre_get_posts','clientarea_default_order');
à la priorité de
9
:add_action( 'pre_get_posts','clientarea_default_order', 9 );
Mais vous n'avez pas réellement besoin de deux rappels
pre_get_posts
.Vous pouvez les combiner:
Exemple 1
is_admin() && add_action( 'pre_get_posts', 'extranet_orderby' ); function extranet_orderby( $query ) { // Nothing to do: if( ! $query->is_main_query() || 'clientarea' != $query->get( 'post_type' ) ) return; //------------------------------------------- // Modify the 'orderby' and 'meta_key' parts //------------------------------------------- $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 '': // <-- The default empty case $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; } }
où nous avons ajouté un requête principale check et un empty casse.
Exemple n ° 2
Voici une autre approche, sans la partie
switch
(PHP 5.4+):is_admin() && add_action( 'pre_get_posts', 'extranet_orderby' ); function extranet_orderby( $query ) { // Nothing to do if( ! $query->is_main_query() || 'clientarea' != $query->get( 'post_type' ) ) return; //------------------------------------------- // Modify the 'orderby' and 'meta_key' parts //------------------------------------------- $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'] ); } }