✅ Notizie, temi, plugin WEB e WordPress. Qui condividiamo suggerimenti e le migliori soluzioni per siti web.

Come modificare o aggiungere colonne personalizzate all’elenco dei post nell’amministratore di WordPress

144

WordPress ti consente di modificare e aggiungere colonne all’elenco di post, pagine o qualsiasi tipo di post personalizzato nel pannello di amministrazione. In questo post vedremo come!

Come modificare o aggiungere colonne personalizzate all'elenco dei post nell'amministratore di WordPress

Ci sono due hook da considerare: un filtro per la posizione e l’intestazione della colonna e un’azione per l’output della colonna per ogni post. Il tipo di post fa parte dei nomi degli hook. Esaminiamoli uno per uno, iniziando dal filtro.

Filtro a colonna

Il filtro per modificare, rimuovere o aggiungere colonne all’elenco dei post nel pannello di amministrazione di WordPress è manage_{$post_type}_posts_columns. Scambia {$post_type}con il tipo di post desiderato. Per esempio; se desideri modificare le colonne per il tipo di post " post", il nome del filtro sarebbe manage_post_posts_columns. E per un tipo di post personalizzato ‘ product‘, il nome del filtro sarebbe manage_product_posts_columns.

PS: WordPress ha un filtro di colonna esclusivamente per il tipo di post ‘ page‘: manage_pages_columns, ma otterrai lo stesso risultato usando il filtro manage_page_posts_columns.

Fornito come argomento al filtro, ottieni l’intera matrice di tutte le colonne per quel tipo di post. Ogni colonna ha una chiave univoca e i loro valori sono le etichette mostrate nell’intestazione della colonna. Esempi di chiavi sono ‘ cb‘ per la colonna della casella di controllo e ‘ title‘ per la colonna del titolo del post. L’ordine degli elementi nell’array determina l’ordine delle colonne.

Quello che devi fare per aggiungere una nuova colonna è semplicemente aggiungere una nuova coppia chiave + valore all’array e restituirla. Puoi manipolare l’array come desideri, ad esempio riordinandolo.

Gancio del contenuto della colonna

Quale hook è necessario utilizzare per controllare l’output del contenuto della colonna dipende dal fatto che il tipo di post sia impostato o meno per essere gerarchico o meno. È stato definito un tipo di post gerarchico come 'hierarchical' => truein register_post_type. Qualsiasi tipo di post non gerarchico, incluso il tipo di post integrato " " di WordPress post, utilizza il nome hook manage_{$post_type}_custom_column. Qualsiasi tipo di post gerarchico, incluso il "tipo di post integrato" di WordPress page, utilizza il nome dell’hook manage_pages_custom_column(nota: nessuna iniezione del nome del tipo di post nel nome dell’hook).

Fornito come argomento per questo hook si ottiene il nome della colonna, che è la chiave menzionata nel filtro della colonna sopra (ad esempio ‘ cb‘ per la colonna checkbox), e in secondo luogo l’ID del post. Questo hook viene eseguito su ogni post e la premessa di base è che controlli se siamo o meno nel tipo di colonna corretto (tramite la chiave) e, in tal caso, usa l’ID post per recuperare il meta del post o simile e produrre cosa tu vuoi.

Esempi

Diamo un’occhiata a un codice di esempi pratici.

Aggiungi una colonna personalizzata ai post che visualizza un meta post personalizzato

Questo è l’uso più semplice dell’aggiunta di colonne personalizzate. Supponiamo di voler aggiungere una colonna personalizzata al tipo di post "post". Lo vogliamo alla fine delle colonne, chiamato "Verificato", e dovrebbe restituire "Sì" o "No" a seconda di un meta valore del post personalizzato. Nota: questo esempio non include il salvataggio o l’aggiornamento del meta post personalizzato.

Nel nostro functions.phpo in qualsiasi altro codice del tema o del plug-in, aggiungeremo la colonna stessa unendola nell’array di colonne e nell’hook per l’output della colonna, recuperiamo il valore del meta meta e lo emettiamo.

add_filter('manage_post_posts_columns', function($columns) {
    return array_merge($columns, ['verified' => __('Verified', 'textdomain')]);
});
 
add_action('manage_post_posts_custom_column', function($column_key, $post_id) {
    if ($column_key == 'verified') {
        $verified = get_post_meta($post_id, 'verified', true);
        if ($verified) {
            echo '<span style="color:green;">'; _e('Yes', 'textdomain'); echo '</span>';
        } else {
            echo '<span style="color:red;">'; _e('No', 'textdomain'); echo '</span>';
        }
    }
}, 10, 2);

L’output può essere qualsiasi cosa tu voglia, ho semplicemente aggiunto un spanintorno all’output con diversi colori del testo per una facile identificazione.

Aggiungi una colonna personalizzata a un tipo di post personalizzato gerarchico che mostra il post antenato

Quando un tipo di post è gerarchico, i post possono avere post principali. Diciamo che abbiamo un tipo di post personalizzato gerarchico " subject" per le materie scolastiche in cui è abitudine creare molti post per bambini e persino post per figli di bambini. Per una migliore panoramica, vogliamo aggiungere una colonna che mostra il genitore antenato del post ("oggetto radice"). Se il post è un post di primo livello, viene mostrato un semplice "-", altrimenti la colonna restituisce il titolo del post principale dell’antenato in un collegamento per modificare il post.

Poiché ci riferiamo a un tipo di post gerarchico, dobbiamo utilizzare un hook diverso per l’output del contenuto della colonna rispetto all’esempio sopra, ma il processo è esattamente lo stesso.

Questo codice mostra anche un esempio di come inserire una colonna nel mezzo dell’array di colonne. Definiamo che la nostra colonna dovrebbe precedere ‘author’ e utilizziamo le funzioni di array PHP per iniettare l’elemento nella giusta posizione.

add_filter('manage_subject_posts_columns', function($columns) {
    $offset = array_search('author', array_keys($columns));
    return array_merge(array_slice($columns, 0, $offset), ['ancestor' => __('Ancestor', 'textdomain')], array_slice($columns, $offset, null));
});
 
add_action('manage_pages_custom_column', function($column_key, $post_id) {
    if ($column_key == 'ancestor') {
        $ancestors = get_ancestors($post_id, 'subject', 'post_type');
        $post_ancestor = end($ancestors);
        if ($post_ancestor != 0) {
            echo '<a href="'. get_edit_post_link($post_ancestor). '">'. get_the_title($post_ancestor). '</a>';
        } else {
            echo '-';
        }
    }
}, 10, 2);

Rimozione di una colonna

Rimuovere una colonna da un tipo di post è piuttosto semplice; tutto ciò che serve è filtrare le colonne dei post, rimuovere l’elemento dall’array e restituirlo. Non è necessario collegarsi all’hook di output della colonna. Per esempio; rimuovendo la datecolonna ‘ ‘ predefinita dal tipo di post ‘ post‘:

add_filter('manage_post_posts_columns', function($columns) {
    unset($columns['date']);
    return $columns;
});

Modifica dei nomi o della posizione delle colonne predefinite

Supponiamo di avere un tipo di post personalizzato ‘ book‘ e di voler sostituire il nome di colonna predefinito "Autore" con "Editore". Filtriamo semplicemente il filtro delle colonne e diamo alla chiave ‘ author‘ un valore diverso:

add_filter('manage_book_posts_columns', function($columns) {
    $columns['author'] = __('Publisher', 'textdomain');
    return $columns;
});

È possibile riordinare le colonne utilizzando le funzioni di matrice PHP. Tieni presente che l’array risultante deve essere un array associativo con gli "ID" di colonna come chiavi e la relativa etichetta come valori. Questo è un semplice esempio di come togliere la authorcolonna ” ‘ e metterla alla fine, riordinando così le colonne:

add_filter('manage_post_posts_columns', function($columns) {
    $taken_out = $columns['author'];
    unset($columns['author']);
    $columns['author'] = $taken_out;
    return $columns;
});

Impostazione di una colonna personalizzata come ordinabile

Per impostazione predefinita, alcune delle colonne di WordPress sono ordinabili, ad esempio il titolo del post, il conteggio dei commenti e la data. È possibile rendere ordinabile la tua colonna personalizzata, ma richiede un po ‘più di codice e l’aggancio all’hook delle query post di WordPress per dire a WordPress come ordinare in base al meta del tuo post.

Supponiamo di avere un tipo di post personalizzato ‘ movie‘, e con il codice seguente aggiungiamo una colonna personalizzata che mostra il meta post personalizzato ‘ duration‘.

add_filter('manage_movie_posts_columns', function($columns) {
    return array_merge($columns, ['duration' => __('Duration', 'textdomain')]);
});
 
add_action('manage_movie_posts_custom_column', function($column_key, $post_id) {
    if ($column_key == 'duration') {
        $duration = get_post_meta($post_id, 'duration', true);
        echo (!empty($duration))? sprintf(__('%s minutes', 'textdomain'), $duration): __('Unknown', 'textdomain');
    }
}, 10, 2);

Per dire a WordPress che vogliamo che la nostra colonna sia ordinabile, dobbiamo agganciarci al filtro manage_edit-{$post_type}_sortable_columns. Aggiungiamo la nostra colonna all’array delle colonne filtrabili, quindi definiamo quale orderbydovrebbe essere il valore ‘ ‘. Impostiamo un valore personalizzato univoco lì, lo stesso nome della nostra colonna, a cui possiamo fare riferimento nel nostro hook di query in seguito.

add_filter('manage_edit-movie_sortable_columns', function($columns) {
    $columns['duration'] = 'duration';
    return $columns;
});

Se aggiorni WordPress ora, dovresti vedere che la nostra colonna personalizzata è effettivamente selezionabile e ordinabile, ma non viene ordinata correttamente. Questo perché WordPress non interpreta ‘ duration‘ come un orderby‘ valore. Questo è ciò che risolveremo agganciandoci a ‘ pre_get_posts‘:

add_action('pre_get_posts', function($query) {
    if (!is_admin()) {
        return;
    }
    $orderby = $query->get('orderby');
    if ($orderby == 'duration') {
        $query->set('meta_key', 'duration');
        $query->set('orderby', 'meta_value_num');
    }
});

Poiché il nostro meta post personalizzato " duration" sarà sempre un numero, possiamo definire " orderby" come " meta_value_num" per il confronto dei numeri. Regola gli argomenti della query per adattarli ai tuoi meta valori personalizzati.

Disabilita l’ordinamento per le colonne predefinite

Disabilitare l’ordinamento per una colonna predefinita è piuttosto semplice. Tutto quello che dobbiamo fare è agganciarci al filtro manage_edit-{$post_type}_sortable_columnse rimuovere dall’array la colonna su cui non vogliamo effettuare l’ordinamento. Ad esempio, questo rimuove l’ordinamento per la colonna della data per il tipo di post ‘ post‘.

add_filter('manage_edit-post_sortable_columns', function($columns) {
    unset($columns['date']);
    return $columns;
});

Fonte di registrazione: awhitepixel.com

This website uses cookies to improve your experience. We'll assume you're ok with this, but you can opt-out if you wish. Accept Read More