Añadir columnas personalizadas en el listado del admin

Php marzo 10, 2026

El listado de posts en el admin (la tabla con todas las entradas) puede ampliarse con columnas personalizadas para mostrar metadatos importantes a golpe de vista. Esto es especialmente útil para CPTs con campos propios — así evitas tener que abrir cada entrada para consultar esa información.

Casos de uso: mostrar la URL del proyecto en el listado de portfolios, ver el precio en un listado de productos, mostrar el estado de un pedido hecho a medida, ver la categoría o versión de un plugin propio.

<?php
add_filter( 'manage_proyecto_posts_columns', 'mi_columna_header' );
function mi_columna_header( $columns ) {
    $columns['url_proyecto'] = 'URL del Proyecto';
    return $columns;
}

add_action( 'manage_proyecto_posts_custom_column', 'mi_columna_contenido', 10, 2 );
function mi_columna_contenido( $column, $post_id ) {
    if ( 'url_proyecto' === $column ) {
        $url = get_post_meta( $post_id, '_mi_campo', true );
        if ( $url ) {
            echo '' . esc_html( $url ) . '';
        } else {
            echo '—';
        }
    }
}

¿Qué hace cada parte?

  • manage_{post_type}_posts_columns: filter que recibe el array de columnas actuales y permite añadir, eliminar o reordenar. La clave del array es el ID interno de la columna.
  • $columns[‘url_proyecto’]: añade la nueva columna al final. Para reordenar, reconstruye el array completo en el orden deseado.
  • manage_{post_type}_posts_custom_column: action que se dispara para cada columna personalizada de cada fila. Recibe el ID de la columna y el ID del post.
  • Comprobación del $column: necesaria porque el action se dispara para todas las columnas personalizadas. Si tienes varias, usa if/elseif o switch.
  • get_post_meta(): recupera el metadato guardado para ese post. El tercer parámetro true devuelve un string simple.
  • esc_url() y esc_html(): siempre escapar antes de imprimir en el admin — aunque el dato venga de la base de datos propia.