Aggiungere colonne personalizzate ai tipi di post personalizzati

23 gen 2017, 18:12:58
Visualizzazioni: 124K
Voti: 63

L'ho fatto in precedenza ma ho dimenticato il nome dell'hook e non riesco a trovarlo da nessuna parte...

Quello che sto cercando di fare è aggiungere alcune colonne personalizzate nella lista di un tipo di post personalizzato nell'amministrazione.

Per esempio, nell'admin, cliccando su articoli, voglio aggiungere una colonna personalizzata.

1
Commenti

ho fatto (e risposto) la stessa domanda (incluso come renderle ordinabili): http://wordpress.stackexchange.com/questions/253680/add-custom-column-to-custom-post-type-overview-in-backend

beta beta
23 gen 2017 23:51:16
Tutte le risposte alla domanda 6
5
140

Gli hook per creare colonne personalizzate e i loro dati associati per un custom post type sono manage_{$post_type}_posts_columns e manage_{$post_type}_posts_custom_column rispettivamente, dove {$post_type} è il nome del custom post type.

Questo esempio dalla documentazione rimuove la colonna dell'autore e aggiunge una colonna per la tassonomia e i metadati:

// Aggiunge le colonne personalizzate al post type 'book':
add_filter( 'manage_book_posts_columns', 'set_custom_edit_book_columns' );
function set_custom_edit_book_columns($columns) {
    unset( $columns['author'] );
    $columns['book_author'] = __( 'Autore', 'your_text_domain' );
    $columns['publisher'] = __( 'Editore', 'your_text_domain' );

    return $columns;
}

// Aggiunge i dati alle colonne personalizzate per il post type 'book':
add_action( 'manage_book_posts_custom_column' , 'custom_book_column', 10, 2 );
function custom_book_column( $column, $post_id ) {
    switch ( $column ) {

        case 'book_author' :
            $terms = get_the_term_list( $post_id , 'book_author' , '' , ',' , '' );
            if ( is_string( $terms ) )
                echo $terms;
            else
                _e( 'Impossibile ottenere autore/i', 'your_text_domain' );
            break;

        case 'publisher' :
            echo get_post_meta( $post_id , 'publisher' , true ); 
            break;

    }
}
23 gen 2017 18:27:37
Commenti

Grazie per questo hook!!! È geniale!! Non c'è una documentazione chiara su stackoverflow!!! :D Saluti amico

Rodrigo Zuluaga Rodrigo Zuluaga
30 mag 2019 05:12:56

non c'è alcuna opzione per impostare il numero della colonna? come column_index[2]. Perché la custom_column appare alla fine della colonna.

Dilip Gupta Dilip Gupta
21 giu 2019 11:52:19

@DilipGupta $columns è un array, puoi riordinarlo prima di restituirlo

fogx fogx
16 lug 2019 13:39:37

Nel caso di aggiunta di una colonna per i termini di tassonomia. Come potresti aggiungere un link sotto il nome del termine che filtri la tabella per quel termine? L'ho visto in alcuni plugin in precedenza.

iamonstage iamonstage
14 mar 2021 17:01:54

@iamonstage register_taxonomy() ora include il supporto per questa funzionalità tramite l'impostazione show_admin_column passata attraverso gli argomenti. https://developer.wordpress.org/reference/functions/register_taxonomy/. Se non stai registrando tu stesso la tassonomia, puoi comunque modificare gli argomenti tramite il filtro register_taxonomy_args https://developer.wordpress.org/reference/hooks/register_taxonomy_args/

Dave Romsey Dave Romsey
15 mar 2021 08:05:31
3
17

Ho scritto una funzione che combina il filtro manage_{$post_type}_posts_columns e l'azione manage_{$post_type}_posts_custom_column.

MODIFICA: Aggiunto il filtro per l'ordinamento delle colonne manage_edit-{$post_type}_sortable_columns e l'azione pre_get_posts.

function add_admin_column( $column_title, $post_type, $cb, $order_by = false, $order_by_field_is_meta = false ){

    // Intestazione Colonna
    add_filter( 'manage_' . $post_type . '_posts_columns', function( $columns ) use ($column_title) {
        $columns[ sanitize_title($column_title) ] = $column_title;
        return $columns;
    } );

    // Contenuto Colonna
    add_action( 'manage_' . $post_type . '_posts_custom_column' , function( $column, $post_id ) use ($column_title, $cb) {
        if( sanitize_title($column_title) === $column)
          $cb($post_id);
    }, 10, 2 );

    // Ordinamento impostato?
    if( !empty( $order_by ) ) {

      // Ordinamento Colonne
      add_filter( 'manage_edit-' . $post_type . '_sortable_columns', function ( $columns ) use ($column_title, $order_by) {
          $columns[ sanitize_title($column_title) ] = $order_by;
          return $columns;
      } );

      // Ordinamento Colonne nella query
      add_action( 'pre_get_posts', function ( $query ) use ($order_by, $order_by_field_is_meta) {
          if( ! is_admin() || ! $query->is_main_query() )
            return;

          if ( sanitize_key($order_by) === $query->get( 'orderby') ) {
              if($order_by_field_is_meta){
                  $query->set( 'orderby', 'meta_value' );
                  $query->set( 'meta_key', sanitize_key($order_by) );
              }
              else {
                  $query->set( 'orderby', sanitize_key($order_by) );
              }
          }
      } );
  
    }

}

Utilizzo:

add_admin_column(__('EAN'), 'product', function($post_id){
    echo get_post_meta( $post_id , 'ean' , true ); 
}, 'meta_key_name', true);

Il parametro meta_key_name può essere omesso per evitare l'ordinamento. Altrimenti, sarà necessario conoscere l'esatto nome del meta_key per far funzionare correttamente l'ordinamento.

add_admin_column(__('Ultima Modifica'), 'post', function($post_id){
    echo get_the_modified_date(); 
}, 'modified');

In questo caso, modified non è un meta key.

10 dic 2020 21:05:34
Commenti

Funziona perfettamente, grazie. Come posso fare per rendere ordinabile la nuova colonna creata?

André R. Kohl André R. Kohl
7 gen 2021 13:02:40

Prova questo articolo su Smashing Magazine https://www.smashingmagazine.com/2017/12/customizing-admin-columns-wordpress/

Carlos Santos Carlos Santos
3 mar 2021 19:45:24

È facendo queste cose che si scopre la POTENZA di WordPress... Grazie!

gtamborero gtamborero
21 gen 2023 19:33:12
1

Questa guida ha funzionato per me. Nel mio caso, sto utilizzando CPT UI per creare i custom post type, ACF per creare i campi personalizzati dei post e Code Snippets per incollare tutto insieme.

Ho incluso una versione semplificata del codice qui sotto.

Sostituisci custom-post-type-slug, custom_post_type_slug e custom_column_name qui sotto in base alle tue esigenze. Assicurati di mantenere lo stesso formato con trattini/underscore quando cambi i nomi.

Nota che get_field() è specifico per il plugin ACF. Se non stai utilizzando ACF, potresti voler usare la funzione integrata di WordPress get_post_meta() per recuperare e visualizzare i metadati del post.

add_filter('manage_custom-post-type-slug_posts_columns', 'set_custom_edit_custom_post_type_slug_columns');

function set_custom_edit_custom_post_type_slug_columns($columns) {
    $columns['custom_column_name'] = 'Titolo Colonna Personalizzata';
    return $columns;
}

add_action('manage_custom-post-type-slug_posts_custom_column' , 'custom_custom_post_type_slug_column', 10, 2);

function custom_custom_post_type_slug_column($column, $post_id) {
    switch ($column) {
        case 'custom_column_name':
            echo get_field('custom_column_name', $post_id);
            break;
    }
}

add_filter('manage_edit-custom-post-type-slug_sortable_columns', 'set_custom_custom_post_type_slug_sortable_columns');

function set_custom_custom_post_type_slug_sortable_columns($columns) {
    $columns['custom_column_name'] = 'custom_column_name';
    return $columns;
}

add_action('pre_get_posts', 'custom_post_type_slug_custom_orderby');

function custom_post_type_slug_custom_orderby($query) {
    if ( ! is_admin()) {
        return;
    }

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

    if ('custom_column_name' == $orderby) {
        $query->set('meta_key', 'custom_column_name');
        $query->set('orderby', 'meta_value_num');
    }
}
24 gen 2022 23:53:08
Commenti

Grazie per questo, l'ho trovato molto utile. Nell'ultima riga del tuo codice "$query->set('orderby', 'meta_value_num');" cos'è meta_value_num?

stvwlf stvwlf
10 set 2024 23:44:07
3

Non sono sicuro se siano i metadati personalizzati predefiniti che vuoi mostrare come colonne, ma potresti considerare di utilizzare questo plugin gratuito che ti permette di aggiungere colonne per visualizzare campi personalizzati. https://wordpress.org/plugins/codepress-admin-columns/

La versione pro ti consente persino di aggiungere filtri, ordinamento e modifica in linea a queste colonne.

23 gen 2017 21:12:50
Commenti

NON UTILIZZARE! Potrebbe danneggiare il tuo sito: Errore PHP fatale: Impossibile ridefinire AC() (dichiarata precedentemente in [redacted]\wp-content\themes\[redacted]\functions.php:628) in [redacted]\wp-content\plugins\codepress-admin-columns\api.php alla riga 9

Peter Kionga-Kamau Peter Kionga-Kamau
6 nov 2018 22:17:07

@PeterKionga-Kamau questo è un problema di compatibilità con il tuo tema specifico. L'errore che hai postato non apparirà con un tema WP predefinito (come twentytwenty); utilizzo anche io il plugin con il tema Divi e lo trovo piuttosto utile

Philipp Philipp
8 ott 2019 22:34:19

Non esiste qualche tipo di namespacing o l'uso di nomi di funzione meno generici che potrebbero essere utilizzati per evitare questo problema?

Peter Kionga-Kamau Peter Kionga-Kamau
9 ott 2019 23:06:12
0

In base alla risposta di Carlos (grazie mille) volevo aggiungere una piccola immagine thumbnail, ma non quella in evidenza, bensì una proveniente da un metabox personalizzato.

Quindi ecco cosa ho aggiunto:

add_admin_column(__('Thumbnail'), 'obraz', function($post_id){
$image_id =  get_post_meta( $post_id , 'custom_thumbnail_metabox' , true );
echo '<img src="'.wp_get_attachment_image_url($image_id).'" />';

Informazioni: il post meta otterrà l'ID dell'allegato/immagine, ecco perché poi si richiama wp_get_attachment_image_url

21 mar 2021 19:47:22
0

Per gli ordini WooCommerce ho avuto bisogno di utilizzare il filtro: manage_edit-shop_order_columns.

add_filter( 'manage_edit-shop_order_columns', 'manage_shop_order_posts_columns', 10, 1 );
function manage_shop_order_posts_columns($columns) {
    $columns['test'] = 'Test';
    return $columns;
}

Poi per popolare il campo:

add_action( 'manage_shop_order_posts_custom_column' , 'manage_shop_order_custom_column', 10, 2 );
function manage_shop_order_custom_column($column, $post_id) {
    switch ( $column )
    {
        case 'test' :
            echo '1234';
            break;
    }
}
8 nov 2021 05:36:01