
La barra de herramientas de WordPress se puede ampliar con enlaces propios, menús y submenús. La forma recomendada es usar el hook admin_bar_menu y el objeto WP_Admin_Bar, no editar archivos del núcleo ni añadir HTML directamente a la plantilla.
El artículo original se publicó para WordPress 3.3. La barra sigue existiendo, pero el código necesita algunos ajustes para una instalación actual: identificadores únicos, permisos, URLs generadas por WordPress y una ubicación adecuada para el snippet.
La barra solo aparece para usuarios que han iniciado sesión y tienen activada esa opción en su perfil o en la configuración del sitio. Un visitante anónimo no verá estos enlaces.
El hook admin_bar_menu recibe una instancia de WP_Admin_Bar. Con su método add_node() puedes crear un elemento nuevo:
/**
* Añade un enlace a la barra de herramientas.
*
* @param WP_Admin_Bar $wp_admin_bar Barra de herramientas.
*/
function mi_toolbar_enlace( $wp_admin_bar ) {
if ( ! current_user_can( 'manage_options' ) ) {
return;
}
$wp_admin_bar->add_node(
array(
'id' => 'mi-enlace-ajustes',
'title' => __( 'Ajustes de mi sitio', 'mi-textdomain' ),
'href' => esc_url( admin_url( 'options-general.php' ) ),
'meta' => array(
'title' => __( 'Abrir los ajustes de WordPress', 'mi-textdomain' ),
),
)
);
}
add_action( 'admin_bar_menu', 'mi_toolbar_enlace', 100 );Lenguaje del código: PHP (php)
El primer parámetro de add_node() es una matriz con los datos del enlace. El id debe ser único, title es el texto visible y href contiene la dirección de destino. La prioridad 100 determina cuándo se añade respecto a otros elementos.
En el ejemplo se usa manage_options porque el destino son los ajustes generales. La función current_user_can() comprueba capacidades, no nombres de roles. Eso permite que el código respete los permisos reales del usuario y funcione mejor en instalaciones con roles personalizados.
Si no quieres crear un elemento principal, indica el identificador del nodo padre con parent. Este ejemplo añade un enlace a la biblioteca multimedia dentro del menú del sitio:
function mi_toolbar_biblioteca( $wp_admin_bar ) {
if ( ! current_user_can( 'upload_files' ) ) {
return;
}
$wp_admin_bar->add_node(
array(
'id' => 'mi-biblioteca',
'parent' => 'site-name',
'title' => __( 'Biblioteca multimedia', 'mi-textdomain' ),
'href' => esc_url( admin_url( 'upload.php' ) ),
)
);
}
add_action( 'admin_bar_menu', 'mi_toolbar_biblioteca', 110 );Lenguaje del código: PHP (php)
site-name es el identificador habitual del menú con el nombre del sitio. El método add_node() acepta también parent, group y distintos datos en meta, como el título emergente, la clase CSS o el destino del enlace.
Para reunir varios accesos, crea primero el nodo principal y después añade cada hijo utilizando el mismo valor en parent:
function mi_toolbar_herramientas( $wp_admin_bar ) {
if ( ! current_user_can( 'edit_posts' ) ) {
return;
}
$wp_admin_bar->add_node(
array(
'id' => 'mi-herramientas',
'title' => __( 'Herramientas rápidas', 'mi-textdomain' ),
'href' => false,
)
);
$wp_admin_bar->add_node(
array(
'id' => 'mi-nueva-entrada',
'parent' => 'mi-herramientas',
'title' => __( 'Nueva entrada', 'mi-textdomain' ),
'href' => esc_url( admin_url( 'post-new.php' ) ),
)
);
$wp_admin_bar->add_node(
array(
'id' => 'mi-medios',
'parent' => 'mi-herramientas',
'title' => __( 'Medios', 'mi-textdomain' ),
'href' => esc_url( admin_url( 'upload.php' ) ),
)
);
}
add_action( 'admin_bar_menu', 'mi_toolbar_herramientas', 100 );Lenguaje del código: PHP (php)
Un menú sin destino puede llevar 'href' => false. Si prefieres que el título principal abra una página, utiliza una URL y conserva los submenús para los accesos secundarios.
Para enlazar a una herramienta externa puedes usar una URL completa y añadir atributos dentro de meta:
$wp_admin_bar->add_node(
array(
'id' => 'mi-documentacion',
'title' => __( 'Documentación externa', 'mi-textdomain' ),
'href' => 'https://developer.wordpress.org/',
'meta' => array(
'target' => '_blank',
'rel' => 'noopener noreferrer',
'title' => __( 'Abrir la documentación', 'mi-textdomain' ),
),
)
);Lenguaje del código: PHP (php)
Abre una pestaña nueva solo cuando aporte algo. Para enlaces internos suele ser mejor mantener la navegación en la misma pestaña. Si el texto depende del idioma del sitio, pásalo por __() o _e() con un text domain propio.
Puedes limitar el enlace al escritorio de administración o a la parte pública. Si lo necesitas solo en wp-admin, añade una comprobación:
function mi_toolbar_solo_admin( $wp_admin_bar ) {
if ( ! is_admin() || ! current_user_can( 'manage_options' ) ) {
return;
}
$wp_admin_bar->add_node(
array(
'id' => 'mi-panel-interno',
'title' => __( 'Panel interno', 'mi-textdomain' ),
'href' => esc_url( admin_url( 'admin.php?page=mi-panel' ) ),
)
);
}
add_action( 'admin_bar_menu', 'mi_toolbar_solo_admin', 100 );Lenguaje del código: PHP (php)
En una página pública puedes usar etiquetas condicionales como is_page(), is_singular() o is_post_type_archive(). Comprueba el contexto antes de cargar el enlace y evita que un usuario vea un acceso que luego no puede utilizar.
El mismo sistema sirve para cambiar un nodo existente. Si reutilizas su id y pasas nuevos valores, WordPress actualiza esos datos. Para eliminarlo puedes usar remove_node() durante el hook wp_before_admin_bar_render:
function quitar_enlace_de_la_barra( $wp_admin_bar ) {
if ( ! current_user_can( 'manage_options' ) ) {
$wp_admin_bar->remove_node( 'wp-logo' );
}
}
add_action( 'wp_before_admin_bar_render', 'quitar_enlace_de_la_barra' );Lenguaje del código: PHP (php)
Usa esta técnica con cuidado. Quitar el logo de WordPress o enlaces estándar puede complicar el trabajo de otros administradores y no mejora la seguridad por sí mismo. Si el objetivo es reducir accesos, aplica una política de permisos coherente en todo el sitio.
No edites el tema padre ni los archivos de /wp-admin/ o /wp-includes/. Las actualizaciones pueden sobrescribir esos cambios y los archivos del núcleo no son el lugar adecuado para personalizaciones. Puedes consultar nuestra guía sobre los ficheros de WordPress y cómo comprobarlos si estás revisando una instalación antigua.
id repetido y sobrescribir otro elemento sin querer.current_user_can().admin_url().La barra de herramientas es un menú compartido por WordPress, el tema y los plugins. Mantén los títulos cortos, evita llenarla de accesos que apenas uses y comprueba el resultado con cada perfil que deba verla.
La información se ha revisado con la documentación de WordPress sobre el hook admin_bar_menu, el método WP_Admin_Bar::add_node() y la función current_user_can().
