Mostrar el Nombre del Usuario Conectado en el Menú de WordPress
Estoy usando WordPress con UserPro y quiero que mi menú muestre el nombre del usuario conectado, vinculado a la página de perfil del usuario.
El problema es que en mi estructura de menú, la opción de menú "Perfil" debe tener un submenú que contenga "editar perfil", "enviar" y "cerrar sesión".
Este es el código que estoy usando actualmente:
/*código anterior, actualmente comentado, para la función que
muestra el nombre de usuario en el menú usando el marcador #profile_name#
function give_profile_name($atts){
echo userpro_profile_data('first_name', get_current_user_id());
}
add_shortcode('profile_name', 'give_profile_name');
add_filter( 'wp_nav_menu_objects', 'my_dynamic_menu_items' );
function my_dynamic_menu_items( $menu_items ) {
foreach ( $menu_items as $menu_item ) {
if ( '#profile_name#' == $menu_item->title ) {
global $shortcode_tags;
if ( isset( $shortcode_tags['profile_name'] ) ) {
// O do_shortcode(), si es necesario.
$menu_item->title = call_user_func( $shortcode_tags['profile_name'] );
}
}
}
return $menu_items;
}
fin del código anterior */
//actualmente en uso, código sin vincular
add_filter( 'wp_nav_menu_items', 'my_custom_menu_item');
function my_custom_menu_item($items)
{
if(is_user_logged_in())
{
$user=wp_get_current_user();
$name=$user->user_firstname;
$items .= '<li>'.$name.'';
}
return $items;
}
Puedo jugar un poco e intentar agregar el submenú bajo el menú modificando el código desde Firebug, pero eso significaría ediciones manuales a todos los enlaces en functions.php, lo cual sería tedioso.
Quiero poder agregar, editar, eliminar y redirigir los elementos del submenú fácilmente a través del menú de WordPress.
Por favor, aconséjenme.

De acuerdo, encontré una solución (y puede usarse para cualquier tema, con cualquier plugin ya que solo utiliza funciones principales de WordPress).
En el menú, nombra el elemento del menú donde deseas que aparezca el nombre del usuario con un marcador de posición (ver captura de pantalla a continuación). Ejemplo: #profile_name#, #user#, #random#
Ahora, agrega el siguiente código al functions.php de tu tema hijo:
function give_profile_name($atts){
$user=wp_get_current_user();
$name=$user->user_firstname;
return $name;
}
add_shortcode('profile_name', 'give_profile_name');
add_filter( 'wp_nav_menu_objects', 'my_dynamic_menu_items' );
function my_dynamic_menu_items( $menu_items ) {
foreach ( $menu_items as $menu_item ) {
if ( '#profile_name#' == $menu_item->title ) {
global $shortcode_tags;
if ( isset( $shortcode_tags['profile_name'] ) ) {
// O do_shortcode(), si es necesario.
$menu_item->title = call_user_func( $shortcode_tags['profile_name'] );
}
}
}
return $menu_items;
}
En caso de que estés usando tu propio marcador de posición, recuerda reemplazar #profile_name# con el nombre de tu marcador personalizado en el código anterior.
Disculpas en caso de que haya usado incorrectamente el término 'marcador de posición'.

El código:
function give_profile_name($atts){
...
}
genera una advertencia. Es mejor:
function give_profile_name(){
...
}
Y es mejor detectar si el usuario ha iniciado sesión o no. Así:
function give_profile_name(){
$user=wp_get_current_user();
if(!is_user_logged_in())
$name = "Usuario no conectado";
else
$name=$user->user_firstname.' '.$user->user_lastname;
return $name;
}
Espero que esto ayude.

No se necesita shortcode
add_filter( 'wp_nav_menu_objects', 'my_dynamic_menu_items' );
function my_dynamic_menu_items( $menu_items ) {
foreach ( $menu_items as $menu_item ) {
if ( strpos($menu_item->title, '#profile_name#') !== false) {
$menu_item->title = str_replace("#profile_name#", wp_get_current_user()->user_firstname, $menu_item->title);
}
}
return $menu_items;
}
