Cum setez ordinea implicită de sortare pentru administrator într-un tip de postare personalizat către o coloană personalizată?
SOLUȚIE DISPONIBILĂ AICI
Am configurat un tip de postare personalizat numit clientarea și am setat mai multe coloane personalizate pentru acesta în zona de administrare - coloanele personalizate sunt toate câmpuri meta personalizate, după cum puteți vedea din codul meu. Aș dori să sortez după 'Data Programării' descendent în mod implicit.
Toate coloanele funcționează bine și pot fi sortate manual după cum era de așteptat, dar nu reușesc să fac să funcționeze ordinea implicită de sortare.
Dacă schimb câmpul implicit de sortare cu un câmp standard (de ex. 'title') funcționează conform așteptărilor; pare să nu funcționeze doar când încerc să setez o coloană personalizată ca ordine implicită de sortare. Ordinea funcționează (adică pot schimba între asc și desc implicit chiar și cu o coloană personalizată), dar nu preia orderby așa că revine la sortarea după data la care a fost publicată postarea personalizată.
Ce îmi scapă?
Codul meu este următorul:
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');
}
}

Soluție dintr-un post încrucișat de pe StackExchange de la @birgire:
Problema este că rulezi callback-ul
clientarea_default_order
prea târziu.Pentru a remedia acest lucru, trebuie doar să modifici prioritatea de la cea implicită care este
10
:add_action( 'pre_get_posts','clientarea_default_order');
la prioritatea de
9
:add_action( 'pre_get_posts','clientarea_default_order', 9 );
Dar, de fapt, nu ai nevoie de două funcții callback pentru
pre_get_posts
.Le poți combina:
Exemplul #1
is_admin() && add_action( 'pre_get_posts', 'extranet_orderby' ); function extranet_orderby( $query ) { // Nimic de făcut: if( ! $query->is_main_query() || 'clientarea' != $query->get( 'post_type' ) ) return; //------------------------------------------- // Modifică părțile 'orderby' și '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 '': // <-- Cazul implicit gol $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; } }
unde am adăugat o verificare pentru interogarea principală și un caz gol în switch.
Exemplul #2
Iată o altă abordare, fără partea
switch
(PHP 5.4+):is_admin() && add_action( 'pre_get_posts', 'extranet_orderby' ); function extranet_orderby( $query ) { // Nimic de făcut if( ! $query->is_main_query() || 'clientarea' != $query->get( 'post_type' ) ) return; //------------------------------------------- // Modifică părțile 'orderby' și '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'] ); } }
