Contents
Introducción
Modificar la lista de entradas (Posts) en el panel de administración de WordPress para mostrar columnas personalizadas es una técnica muy útil cuando necesitas mostrar datos específicos (campos personalizados, taxonomías, cálculos, metadatos) de un vistazo. En este artículo encontrarás un tutorial completo, con ejemplos prácticos en PHP, buenas prácticas de rendimiento y seguridad, cómo hacer las columnas ordenables y cómo adaptar el código a tipos de contenido personalizados.
Conceptos clave
- Filtros y acciones principales: manage_edit-{post_type}_columns, manage_{post_type}_posts_custom_column, manage_edit-{post_type}_sortable_columns, pre_get_posts.
- Escenario: modificaremos la pantalla de Entradas (post type post) y mostraremos ejemplos aplicables a otros tipos personalizados (por ejemplo book).
- Rendimiento: evitar consultas en bucle preferir obtener metadatos en lote si es posible.
- Seguridad: escapar salidas con esc_html(), esc_attr(), etc., aunque en ejemplos del artículo mostramos la lógica general dentro de los fragmentos PHP.
1. Añadir columnas personalizadas (estructura básica)
Para añadir una columna personalizada a la lista de posts se usan dos pasos: 1) declarar las columnas (filtro) y 2) rellenarlas (acción).
Ejemplo: añadir columna Tiempo de lectura basada en meta key reading_time
value ) { new_columns[ key ] = value if ( title === key ) { new_columns[reading_time] = Tiempo de lectura } } return new_columns } // 2) Rellenar la columna add_action( manage_post_posts_custom_column, mi_mostrar_columna_reading_time, 10, 2 ) function mi_mostrar_columna_reading_time( column, post_id ) { if ( reading_time === column ) { reading_time = get_post_meta( post_id, reading_time, true ) if ( reading_time === ) { echo No definido } else { echo intval( reading_time ) . min } } } ?>
Notas
- Los nombres de los hooks dependen del post type. Para post usar: manage_edit-post_columns y manage_post_posts_custom_column. Para un CPT llamado book serían: manage_edit-book_columns y manage_book_posts_custom_column.
- Si prefieres afectar a todos los tipos de post puedes usar filtros/acciones genéricos, pero es más seguro especificar el post type.
2. Hacer la columna ordenable (sortable)
Para permitir ordenar por una columna que representa un meta value debemos declarar la columna como ordenable y adaptar la consulta principal en el backend con pre_get_posts.
Ejemplo: hacer ordenable la columna reading_time
is_main_query() query->get(post_type) === post ) { orderby = query->get( orderby ) if ( reading_time === orderby ) { query->set( meta_key, reading_time ) query->set( orderby, meta_value_num ) // usar meta_value_num si es numérico } } } ?>
3. Columnas que muestran taxonomías o relaciones
Es habitual querer mostrar las taxonomías relacionadas (por ejemplo categorías personalizadas o etiquetas) en una columna.
Ejemplo: columna que muestra la taxonomía genre de un CPT book
— return } out = array() foreach ( terms as t ) { // Enlace al filtro por término url = add_query_arg( array( post_type => book, genre => t->slug ), admin_url( edit.php ) ) out[] = . esc_html( t->name ) . } echo implode( , , out ) } } ?>
4. Evitar problemas de rendimiento
Si la lista contiene muchas entradas y cada fila dispara operaciones costosas (consultas, llamadas a APIs, funciones complejas), el rendimiento del listado admin puede degradarse. Recomendaciones:
- Evitar operaciones pesadas por fila. Si necesitas valores agregados, calcula y guarda el resultado como meta cuando el post se guarda (hook save_post).
- Si vas a mostrar varios metadatos a la vez, considera hacer una consulta en lote con get_post_meta( post_ids, meta_key, true ) o usar WP_Query con campos necesarios.
- Sanitiza/escapa salidas para evitar inyección de HTML o JS.
5. Añadir estilos o tamaño de columna
Para ajustar el ancho o estilos de las columnas puedes inyectar CSS en el admin con la acción admin_head. Ejemplo mínimo:
id === edit-post ) { // solo en la pantalla de entradas echo ltstylegt .column-reading_time { width: 8em text-align: right } .column-genre { max-width: 20em } lt/stylegt } } ?>
6. Eliminar columnas por defecto y reordenarlas
Puedes quitar columnas del listado (por ejemplo Autor, Etiquetas) o reordenarlas proporcionando un nuevo array en el filtro de columnas. Ejemplo: eliminar la columna tags y poner reading_time al final.
7. Buenas prácticas y seguridad
- Escapar las salidas con esc_html(), esc_attr() o funciones de escape apropiadas antes de imprimir valores.
- No ejecutar consultas innecesarias dentro de bucles precargar cuando sea posible.
- Usar capacidades (capabilities) si la información es sensible, por ejemplo comprobando current_user_can() antes de mostrar ciertos enlaces o datos.
- Si tu columna depende de metadatos que cambian, actualizar esos metadatos en el hook save_post para mantener la pantalla admin rápida.
8. Ejemplo completo: columna reading_time con guardado automático
Este ejemplo calcula el tiempo de lectura al guardar el post (preventivamente) y lo muestra en la lista, además de hacerlo ordenable.
post_type !== post ) { return } content = strip_tags( post->post_content ) words = str_word_count( content ) reading_time = max( 1, intval( round( words / 200 ) ) ) // asumiendo 200 wpm update_post_meta( post_id, reading_time, reading_time ) } // 1) Añadir columna add_filter( manage_edit-post_columns, mi_adicionar_columna_reading_time ) function mi_adicionar_columna_reading_time( columns ) { columns[reading_time] = Tiempo lectura return columns } // 2) Rellenar columna add_action( manage_post_posts_custom_column, mi_mostrar_columna_reading_time, 10, 2 ) function mi_mostrar_columna_reading_time( column, post_id ) { if ( reading_time === column ) { reading_time = get_post_meta( post_id, reading_time, true ) if ( reading_time === ) { echo — } else { echo esc_html( intval( reading_time ) ) . min } } } // 3) Hacerla ordenable add_filter( manage_edit-post_sortable_columns, mi_reading_time_sortable ) function mi_reading_time_sortable( columns ) { columns[reading_time] = reading_time return columns } add_action( pre_get_posts, mi_reading_time_orderby ) function mi_reading_time_orderby( query ) { if ( ! is_admin() ! query->is_main_query() ) { return } if ( query->get( post_type ) !== post ) { return } if ( query->get( orderby ) === reading_time ) { query->set( meta_key, reading_time ) query->set( orderby, meta_value_num ) } } ?>
9. Compatibilidad y notas finales
- Hooks alternativos: existen variantes históricas como manage_posts_columns o manage_posts_custom_column, pero es mejor usar los hooks basados en manage_edit-{post_type}_columns y manage_{post_type}_posts_custom_column para asegurar compatibilidad con CPTs.
- Si modificas columnas en un plugin, envuélvelo en una comprobación de existencia de funciones o en un prefijo para evitar colisiones con otros plugins o temas.
- Documentación oficial y referencia: WordPress Developer Resources.
Resumen
Añadir columnas personalizadas en el listado de posts de WordPress es una tarea poderosa para mejorar la usabilidad del panel administrativo. Los pasos clave son: declarar la columna, rellenarla, y si se desea, hacerla ordenable y estilizarla. Ten siempre en cuenta el rendimiento y la seguridad cuando implementes consultas o cálculos por fila.
|
Acepto donaciones de BAT's mediante el navegador Brave 🙂 |