El escritorio de WordPress incluye una sección llamada «A vista de pista» (At a Glance) que muestra un resumen rápido de publicaciones, páginas y comentarios. Sin embargo, muchos desarrolladores necesitan mostrar tipos de post personalizados en este panel para una mejor gestión del contenido.
En este artículo, te mostraré cómo personalizar esta sección con un código seguro y optimizado, utilizando buenas prácticas de desarrollo y evitando vulnerabilidades.
if (!function_exists('mx_custom_glance_items')) {
function mx_custom_glance_items() {
// Verificar permisos: Solo usuarios con capacidad 'edit_posts' pueden ver esto
if (!current_user_can('edit_posts')) {
return [];
}
global $wpdb;
// Consulta SQL segura con $wpdb->prepare()
$query = $wpdb->prepare(
"SELECT DISTINCT(post_type), COUNT(*) as count
FROM {$wpdb->posts}
WHERE post_type NOT IN (%s, %s, %s)
GROUP BY post_type
ORDER BY post_type ASC",
'post', 'page', 'comment'
);
$post_types_result = $wpdb->get_results($query, ARRAY_A);
$post_types = [];
foreach ($post_types_result as $arr) {
$post_types[sanitize_key($arr['post_type'])] = intval($arr['count']);
}
arsort($post_types);
$items = [];
foreach ($post_types as $type => $count) {
$type_object = get_post_type_object($type);
// Sanitizar el nombre del post type para evitar XSS
$safe_type = esc_html($type);
$count_i18n = number_format_i18n($count);
if (!is_null($type_object)) {
$text = _n(
'%s ' . $type_object->labels->singular_name,
'%s ' . $type_object->labels->name,
$count,
'your_textdomain'
);
$text = sprintf($text, $count_i18n);
$items[] = sprintf(
'<a class="%s-count" href="%s">%s</a>',
esc_attr($type),
esc_url(admin_url("edit.php?post_type=$type")),
wp_kses_post($text)
);
} else {
$text = _n(
'%s ' . $safe_type,
'%s ' . $safe_type,
$count,
'your_textdomain'
);
$text = sprintf($text, $count_i18n);
$items[] = sprintf(
'<span class="%s-count">%s</span>',
esc_attr($type),
wp_kses_post($text)
);
}
}
return $items;
}
add_filter('dashboard_glance_items', 'mx_custom_glance_items', 10, 1);
}
¿Qué Hace Este Código?
El siguiente fragmento de PHP agrega tipos de post personalizados al dashboard de WordPress, excluyendo los tipos por defecto (post, page y comment). Además, implementa:
✅ Verificación de permisos (solo usuarios con edit_posts
pueden verlo).
✅ Consulta SQL segura con $wpdb->prepare()
.
✅ Sanitización de datos para evitar XSS.
✅ Soporte para traducciones con _n()
.
✅ Enlaces directos a la lista de entradas de cada tipo.
Cómo Implementarlo
- Añade el código al archivo
functions.php
de tu tema hijo o en un plugin personalizado. - Personaliza los tipos de post excluidos si es necesario.
- Usa un textdomain válido para traducciones.