Aggiungere colonne personalizzate ai tipi di post personalizzati
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.
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;
}
}

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

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

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

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.

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

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

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

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.

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

@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

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

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