Făcând o coloană personalizată sortabilă
Am adăugat o coloană personalizată la un tip de postare personalizat și funcționează bine. Vreau doar să sortez numele după titlu, așa că am încercat asta,
function sortable_custom_columns( $columns ) {
$columns['custom_column'] = 'title';
return $columns;
}
add_filter( 'manage_edit-custom_sortable_columns', 'sortable_custom_columns' );
Cu toate acestea, rezultatul este o sortare foarte aleatorie. Cred că ar putea avea legătură cu conținutul coloanei? Pe care îl redau astfel:
function location_column_content( $column, $post_id ) {
switch ( $column ) {
case 'practice_name':
$location_post_meta = get_post_meta( $post_id );
$practice_post_id = $location_post_meta['practice_id'][0];
echo '<a href="' . get_edit_post_link( $practice_post_id ) . '">' . get_the_title( $practice_post_id ) . '</a>';
break;
}
}
add_action( 'manage_sf-location_posts_custom_column', 'location_column_content', 10, 2 );
Are sens? Aveți vreo sugestie aici? Mulțumesc

Asigură-te să schimbi MY_POST_TYPE
, MY_CUSTOM_COLUMN
și MY_META_KEY
cu valorile reale.
Mai întâi, adaugă coloana personalizată. Elimină data și seteaz-o din nou pentru a o păstra în ultima coloană. Poți sări peste acest pas.
<?php
function my_manage_MY_POST_TYPE_columns( $columns )
{
// salvează data într-o variabilă
$date = $columns['date'];
// elimină coloana 'date'
unset( $columns['date'] );
// elimină orice coloană când este necesar
// unset( $columns['comments'] );
// adaugă coloana ta ca element nou de array și dă-i text pentru antetul tabelului
$columns['MY_CUSTOM_COLUMN'] = __('Text Antet Coloană Personalizată');
$columns['date'] = $date; // setează din nou coloana 'date', după coloana personalizată
return $columns;
}
?>
Apoi, fă coloana sortabilă folosind filtrul manage_edit-{$post_type}_sortable_columns
(încă nedocumentat).
<?php
function my_set_sortable_columns( $columns )
{
$columns['MY_CUSTOM_COLUMN'] = 'MY_CUSTOM_COLUMN';
return $columns;
}
?>
În al treilea rând, completează celulele coloanei.
<?php
function my_populate_custom_columns( $column, $post_id )
{
switch ( $column ) {
case 'MY_CUSTOM_COLUMN':
echo get_post_meta($post_id, 'MY_META_KEY', true);
break;
case 'MAYBE_ANOTHER_CUSTOM_COLUMN':
// cod suplimentar
break;
}
}
?>
Acum ești gata să sortezi efectiv acea coloană.
Notă: dacă nu verifici meta_query
pentru valori goale (inexistente), coloana ta va afișa doar postările care au valoare meta (negoală) până când va fi sortată implicit sau după altă coloană
<?php
function my_sort_custom_column_query( $query )
{
$orderby = $query->get( 'orderby' );
if ( 'MY_CUSTOM_COLUMN' == $orderby ) {
$meta_query = array(
'relation' => 'OR',
array(
'key' => 'MY_META_KEY',
'compare' => 'NOT EXISTS', // vezi nota de mai sus
),
array(
'key' => 'MY_META_KEY',
),
);
$query->set( 'meta_query', $meta_query );
$query->set( 'orderby', 'meta_value' );
}
}
?>
Și acum să aplicăm filtrele și acțiunile. Verifică dacă nu ești pe partea de front-end, pe pagina corectă și tipul de postare corect este selectat:
<?php
global $pagenow;
if ( is_admin() && 'edit.php' == $pagenow && 'MY_POST_TYPE' == $_GET['post_type'] ) {
// gestionează coloanele
add_filter( 'manage_MY_POST_TYPE_posts_columns', 'my_manage_MY_POST_TYPE_columns' );
// face coloanele sortabile
add_filter( 'manage_edit-MY_POST_TYPE_sortable_columns', 'my_set_sortable_columns' );
// completează celulele coloanelor
add_action( 'manage_MY_POST_TYPE_posts_custom_column', 'my_populate_custom_columns', 10, 2 );
// setează interogarea pentru sortare
add_action( 'pre_get_posts', 'my_sort_custom_column_query' );
}
?>

manage_edit-{$post_type}_sortable_columns
este documentat ca manage_{$this->screen->id}_sortable_columns
, unde $this->screen->id
în acest caz se referă la edit-post
, edit-page
sau edit-<post_type>
.

O alternativă la utilizarea unui meta_query este să folosești simplu $query->set( 'meta_key' , 'MY_META_KEY' );
. Aceasta va evita problema exist/not exists.

Dacă valorile din coloana personalizată sunt numere, probabil veți dori să utilizați $query->set( 'orderby', 'meta_value_num' )
în loc de $query->set( 'orderby', 'meta_value' )
.

Fă Coloanele Sortabile
În mod implicit, noile coloane personalizate nu sunt sortabile, ceea ce face dificilă găsirea datelor de care aveți nevoie. Pentru a sorta coloanele personalizate, WordPress oferă un alt filtru numit manage_edit-post_sortable_columns
pe care îl puteți utiliza pentru a specifica care coloane sunt sortabile.
Când această acțiune este executată, funcția va primi ca parametru toate coloanele care sunt deja sortabile. Adăugând noile coloane personalizate la această listă, acestea vor deveni sortabile. Valoarea pe care o atribuiți va fi utilizată în URL, astfel încât WordPress să înțeleagă după care coloană să ordoneze.
Următorul cod vă permite să sortați după metadatele din coloana personalizată:
// Înregistrează coloana ca sortabilă
function register_sortable_columns( $columns ) {
$columns['meta'] = 'Coloană Personalizată';
return $columns;
}
add_filter( 'manage_edit-post_sortable_columns', 'register_sortable_columns' );

Începând cu versiunea WordPress 6.3.0, parametrul $sortable_columns
este acum o matrice multidimensională unde poți specifica și abrevieri, text pentru orderby și ordinea inițială de sortare. Aceasta înseamnă că trebuie doar să actualizezi funcția my_set_sortable_columns
din exemplul lui Max Yudin de la aceasta:
function my_set_sortable_columns( $columns )
{
$columns['MY_CUSTOM_COLUMN'] = 'MY_CUSTOM_COLUMN';
return $columns;
}
La aceasta:
function my_set_sortable_columns( $columns )
{
$columns['MY_CUSTOM_COLUMN'] = array(
'MY_CUSTOM_COLUMN', // Numele intern al meniului, același cu cheia din matrice
false, // Ignoră inițializarea sortării implicite
__('Text Antet Coloană Personalizată'), // Nume scurt al coloanei (abreviere) pentru atributul `abbr`
__('Tabel sortat după coloană personalizată.') // Șir tradus cu o descriere scurtă pentru sortarea curentă
);
return $columns;
}
Dacă dorești să inițializezi ordinea implicită de sortare a coloanei, schimbă pur și simplu al doilea parametru din false
în true
, și adaugă un al 5-lea parametru cu valoarea asc
sau desc
astfel:
$columns['MY_CUSTOM_COLUMN'] = array(
'MY_CUSTOM_COLUMN', // Numele intern al meniului, același cu cheia din matrice
true, // Inițializează cu ordinea specificată
__('Text Antet Coloană Personalizată'), // Nume scurt al coloanei (abreviere) pentru atributul `abbr`
__('Tabel sortat după coloană personalizată.'), // Șir tradus cu o descriere scurtă pentru sortarea curentă,
'asc' // Inițializează în ordine crescătoare, poate fi și 'desc'
);

trebuie să sortezi tabelul folosind pre_get_posts. Instrucțiuni pas cu pas la sfaturi envato

Acesta este un comentariu bun! Majoritatea oamenilor vor trebui să modifice interogarea principală pentru a obține rezultatul dorit de sortare. Răspunsurile de mai sus doar filtrează care coloane sunt PERMISE să fie sortate (nu implementează logica de sortare). Ai nevoie de pre_get_posts!
