Rendere ordinabile una colonna personalizzata
Ho aggiunto una colonna personalizzata a un post type custom, e funziona bene. Voglio solo che ordini i nomi per titolo, quindi ho provato questo:
function sortable_custom_columns( $columns ) {
$columns['custom_column'] = 'title';
return $columns;
}
add_filter( 'manage_edit-custom_sortable_columns', 'sortable_custom_columns' );
Tuttavia, questo sta restituendo un ordinamento molto casuale. Penso che potrebbe avere a che fare con il contenuto della colonna? Che io renderizzo in questo modo:
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 );
Ha senso questo? Avete qualche suggerimento? Grazie

Assicurati di cambiare MY_POST_TYPE
, MY_CUSTOM_COLUMN
e MY_META_KEY
con i valori effettivi.
Per prima cosa, aggiungi la tua colonna personalizzata. Rimuovi la data e reimpostala per mantenerla nell'ultima colonna. Puoi saltare questo passaggio.
<?php
function my_manage_MY_POST_TYPE_columns( $columns )
{
// salva la data in una variabile
$date = $columns['date'];
// rimuovi la colonna 'date'
unset( $columns['date'] );
// rimuovi qualsiasi colonna quando necessario
// unset( $columns['comments'] );
// aggiungi la tua colonna come nuovo elemento dell'array e assegna il testo dell'intestazione
$columns['MY_CUSTOM_COLUMN'] = __('Testo Intestazione Colonna Personalizzata');
$columns['date'] = $date; // reimposta la colonna 'date', dopo la colonna personalizzata
return $columns;
}
?>
Secondo, rendi la tua colonna ordinabile usando il filtro manage_edit-{$post_type}_sortable_columns
(non ancora documentato).
<?php
function my_set_sortable_columns( $columns )
{
$columns['MY_CUSTOM_COLUMN'] = 'MY_CUSTOM_COLUMN';
return $columns;
}
?>
Terzo, popola le celle della colonna.
<?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':
// codice aggiuntivo
break;
}
}
?>
Ora sei pronto per ordinare effettivamente quella colonna.
Nota: se non controlli meta_query
per valori vuoti (inesistenti), la tua colonna mostrerà solo i post che hanno un valore meta (non vuoto) finché non verranno ordinati per impostazione predefinita o per un'altra colonna.
<?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', // vedi nota sopra
),
array(
'key' => 'MY_META_KEY',
),
);
$query->set( 'meta_query', $meta_query );
$query->set( 'orderby', 'meta_value' );
}
}
?>
E ora applichiamo i filtri e le azioni. Controlla che non ti trovi sul front-end, sulla pagina giusta e che il tipo di post corretto sia selezionato:
<?php
global $pagenow;
if ( is_admin() && 'edit.php' == $pagenow && 'MY_POST_TYPE' == $_GET['post_type'] ) {
// gestisci le colonne
add_filter( 'manage_MY_POST_TYPE_posts_columns', 'my_manage_MY_POST_TYPE_columns' );
// rendi le colonne ordinabili
add_filter( 'manage_edit-MY_POST_TYPE_sortable_columns', 'my_set_sortable_columns' );
// popola le celle delle colonne
add_action( 'manage_MY_POST_TYPE_posts_custom_column', 'my_populate_custom_columns', 10, 2 );
// imposta la query per l'ordinamento
add_action( 'pre_get_posts', 'my_sort_custom_column_query' );
}
?>

manage_edit-{$post_type}_sortable_columns
è documentato come manage_{$this->screen->id}_sortable_columns
, dove $this->screen->id
in questo caso si riferisce a edit-post
, edit-page
o edit-<post_type>
.

Un'alternativa all'uso di meta_query è semplicemente usare $query->set( 'meta_key' , 'MY_META_KEY' );
. Questo eviterà il problema esistenza/non esistenza.

Se i valori nella tua colonna personalizzata sono numeri, probabilmente vorrai usare $query->set( 'orderby', 'meta_value_num' )
invece di $query->set( 'orderby', 'meta_value' )
.

Rendere le Colonne Ordinabili
Per impostazione predefinita, le nuove colonne personalizzate non sono ordinabili, il che rende difficile trovare i dati necessari. Per ordinare le colonne personalizzate, WordPress offre un altro filtro chiamato manage_edit-post_sortable_columns
che puoi utilizzare per specificare quali colonne sono ordinabili.
Quando questa azione viene eseguita, la funzione riceve un parametro con tutte le colonne attualmente ordinabili. Aggiungendo le tue nuove colonne personalizzate a questo elenco, queste diventeranno ordinabili. Il valore che assegni verrà utilizzato nell'URL per far capire a WordPress su quale colonna effettuare l'ordinamento.
Il seguente codice ti permette di ordinare in base alla meta della colonna personalizzata.
// Registra la colonna come ordinabile
function register_sortable_columns( $columns ) {
$columns['meta'] = 'Colonna Personalizzata';
return $columns;
}
add_filter( 'manage_edit-post_sortable_columns', 'register_sortable_columns' );

A partire dalla versione 6.3.0 di WordPress, il parametro $sortable_columns
è ora un array multidimensionale in cui è possibile specificare anche abbreviazioni, testo per l'ordinamento e l'ordine iniziale di ordinamento. Ciò significa che è sufficiente aggiornare la funzione my_set_sortable_columns
nell'esempio di Max Yudin da questo:
function my_set_sortable_columns( $columns )
{
$columns['MY_CUSTOM_COLUMN'] = 'MY_CUSTOM_COLUMN';
return $columns;
}
A questo:
function my_set_sortable_columns( $columns )
{
$columns['MY_CUSTOM_COLUMN'] = array(
'MY_CUSTOM_COLUMN', // Nome interno del menu, uguale alla chiave nell'array
false, // Ignora l'inizializzazione dell'ordinamento predefinito
__('Testo Intestazione Colonna Personalizzata'), // Nome abbreviato della colonna per l'attributo `abbr`
__('Tabella ordinata per colonna personalizzata.') // Stringa traducibile di una breve descrizione da utilizzare per l'ordinamento corrente
);
return $columns;
}
Se si desidera inizializzare l'ordine di ordinamento predefinito della colonna, è sufficiente modificare il secondo parametro da false
a true
e aggiungere un 5° parametro con asc
o desc
come segue:
$columns['MY_CUSTOM_COLUMN'] = array(
'MY_CUSTOM_COLUMN', // Nome interno del menu, uguale alla chiave nell'array
true, // Inizializza con l'ordine specificato
__('Testo Intestazione Colonna Personalizzata'), // Nome abbreviato della colonna per l'attributo `abbr`
__('Tabella ordinata per colonna personalizzata.'), // Stringa traducibile di una breve descrizione da utilizzare per l'ordinamento corrente,
'asc' // Inizializza in ordine crescente, può essere anche 'desc'
);

devi ordinare la tabella utilizzando pre_get_posts. Ottime istruzioni passo passo su envato tips

Questo è un commento utile! La maggior parte delle persone dovrà modificare la query principale per ottenere il risultato di ordinamento desiderato. Le risposte sopra si limitano a filtrare quali colonne POSSONO essere ordinate (non implementano la logica di ordinamento). Hai bisogno di pre_get_posts!
