Wordpress - Adding custom columns to custom post types
The hooks to create custom columns and their associated data for a custom post type are manage_{$post_type}_posts_columns
and manage_{$post_type}_posts_custom_column
respectively, where {$post_type}
is the name of the custom post type.
This example from the documentation removes the author column and adds a taxonomy and meta data column:
// Add the custom columns to the book post type:
add_filter( 'manage_book_posts_columns', 'set_custom_edit_book_columns' );
function set_custom_edit_book_columns($columns) {
unset( $columns['author'] );
$columns['book_author'] = __( 'Author', 'your_text_domain' );
$columns['publisher'] = __( 'Publisher', 'your_text_domain' );
return $columns;
}
// Add the data to the custom columns for the book post type:
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( 'Unable to get author(s)', 'your_text_domain' );
break;
case 'publisher' :
echo get_post_meta( $post_id , 'publisher' , true );
break;
}
}
I wrote a function that combines manage_{$post_type}_posts_columns
filter and manage_{$post_type}_posts_custom_column
action.
function add_admin_column($column_title, $post_type, $cb){
// Column Header
add_filter( 'manage_' . $post_type . '_posts_columns', function($columns) use ($column_title) {
$columns[ sanitize_title($column_title) ] = $column_title;
return $columns;
} );
// Column Content
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 );
}
Usage:
add_admin_column(__('EAN'), 'product', function($post_id){
echo get_post_meta( $post_id , 'ean' , true );
});