Come aggiungo delle colonne ordinabili negli elenchi di un custom post type in wordpress admin?

Supponiamo che il custom post type in questione si chiama “EVENTO”, e vogliamo mostrare data di inizio e data di fine nelle liste dei post nel backend.

Per prima cosa useremo due filtri per fare questo.

Il primo sarà “manage_edit-{SLUG-POST-TYPE}_columns” nel nostro caso “manage_edit-evento_columns”. Questo filtro ci permetterà di creare le colonne dove poi mostreremo le date.

Il secondo sarà “manage_{SLUG-POST-TYPE}_posts_custom_column” nel nostro caso “manage_evento_posts_custom_column“. Questo filtro ci permettrà di popolare le righe delle nostre colonne con le date di inizio e fine evento.

Scriviamo la funzione per il primo filtro.

/**
 * add extra columns to post type evento 
 * 
 * @author Toni Guga <toni@schiavoneguga.com>
 * @param [type] $columns
 * @return void
 */
function evento_extra_columns($columns)
{

    $columns['evento_data_inizio'] = __('Data di Inizio', 'your-translate-text-domain');
    $columns['evento_data_fine'] = __('Data di Fine', 'your-translate-text-domain');

    return $columns;
}
add_filter('manage_edit-evento_columns', 'evento_extra_columns', 10);

Scriviamo la funzione per il secondo filtro.

/**
 * populate evento extra columns with data
 * 
 * @author Toni Guga <toni@schiavoneguga.com>
 * @param [type] $column
 * @return void
 */
function evento_extra_columns_content($column)
{
    global $post;

    //esempio con campi ACF
    if ('evento_data_inizio' === $column) {
        echo get_field('data_di_fine', $post->ID);
    } elseif ('data_di_inizio' === $column) {
        echo get_field('data_di_fine', $post->ID);
    } 

    // esempio con un custom field
    // echo get_post_meta($post->ID, 'data_di_fine', true);

}
add_action('manage_evento_posts_custom_column', 'evento_extra_columns_content');

Se si usano solo queste due funzioni otteniamo due colonne con i dati che però non possono essere ordinabili.

Per rendere ordinabli queste colonne abbiamo bisogno ancora di due piccole funzioni, che verranno richiamate in altretanti filtri.

Primo filtro “manage_edit-{SLUG-POST-TYPE}_sortable_columns” nel nostro caso “manage_edit-evento_sortable_columns”.

Secondo filtro “pre_get_posts” che serve per passare i paramentri giusti per ordinare i dati nelle colonne.

Scriviamo la funzione per il primo filtro.

/**
 * make this extra columns sortable
 *
 * @author Toni Guga <toni@schiavoneguga.com>
 * @param [type] $columns
 * @return void
 */
function evento_extra_columns_content_sortable($columns)
{
    $columns['evento_data_inizio'] = 'evento_data_inizio';
    $columns['evento_data_fine'] = 'evento_data_fine';

    //To make a column 'un-sortable' remove it from the array
    //unset($columns['date']);

    return $columns;
}
add_filter('manage_edit-evento_sortable_columns', 'evento_extra_columns_content_sortable');

Scriviamo la funzione per il secondo filtro.

/**
 * adjust orderby query
 * 
 * @author Toni Guga <toni@schiavoneguga.com>
 * @param [type] $query
 * @return void
 */
function mbc_admin_columns_orderby($query)
{
    // limitia utilizzo solo per il beckend
    if (!is_admin()) {
        return;
    }

    $post_type = $query->get('post_type');
    $order_by = $query->get('orderby');

    if ('evento_data_inizio' == $orderby) {

        $query->set('meta_key', 'data_di_fine');
        $query->set('orderby', 'meta_value');
        // usa meta_value_num in caso di numeri

    } elseif ('evento_data_fine' == $orderby) {

        $query->set('meta_key', 'data_di_fine');
        $query->set('orderby', 'meta_value');
        // usa meta_value_num in caso di numeri

    }
}
add_action('pre_get_posts', 'mbc_admin_columns_orderby');

Bene salvo refusi questo codice dovrebbe funzionare, e si può adattare a qualsiasi post type custom o standard ed anche a tipi di dati differenti da mostrare.

Rispondi