Rendere ordinabile una colonna personalizzata

6 feb 2018, 21:32:52
Visualizzazioni: 27.6K
Voti: 17

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

2
Commenti

E se sto utilizzando un valore dell'elemento? es. $item->get_meta( '_st_check_in' ); Come lo ordineresti?

Daniel Muñoz Daniel Muñoz
9 feb 2021 19:30:21

@DanielMuñoz non pubblicare una risposta al commento come soluzione alla domanda. Capisco che hai solo 1 reputazione e non puoi ancora commentare le domande degli altri, ma questo non è un motivo valido per inviare spam sul sito. Se continui, i sistemi automatici ti segnaleranno come spammer e ti bannneranno. Non sono riuscito a capire a quale commento intendessi rispondere, quindi l'ho spostato nella domanda stessa

Tom J Nowell Tom J Nowell
9 feb 2021 20:03:33
Tutte le risposte alla domanda 4
5
42

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

?>
7 feb 2018 15:54:37
Commenti

Funziona ancora perfettamente anche oggi.

MattFisch MattFisch
2 feb 2022 16:35:23

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>.

KittMedia KittMedia
6 mag 2022 11:19:34

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

Jared Jared
21 dic 2022 17:11:24

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' ).

Boycott A.I. Boycott A.I.
8 set 2023 15:12:34

Suggerimento: all'interno della funzione _sortable_columns, puoi assegnare un array con la direzione di ordinamento predefinita come ['name', false, 'Name'], non solo una stringa, ma non c'è documentazione.

ViliusL ViliusL
3 ott 2023 09:40:36
1

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' );
22 giu 2021 20:14:09
Commenti

Apprezzo lo sforzo che hai messo nella descrizione qui! Ma la soluzione così com'è sembra ribadire un pezzo di codice che è già menzionato nella domanda come inefficace per il loro obiettivo

bosco bosco
22 giu 2021 21:49:27
0

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'
);
31 lug 2024 18:26:18
1
-1

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

6 feb 2018 22:09:56
Commenti

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!

Chad Reitsma Chad Reitsma
3 feb 2025 21:47:32