Отображение имени авторизованного пользователя в меню WordPress
Я использую WordPress с UserPro и хочу, чтобы в моем меню отображалось имя авторизованного пользователя со ссылкой на страницу его профиля.
Проблема в том, что в структуре моего меню пункт "Профиль" должен иметь подменю, содержащее "редактировать профиль", "отправить" и "выйти".
Вот код, который я сейчас использую:
/*более ранний код, в настоящее время закомментированный, для функции
отображения имени пользователя в меню, использующий плейсхолдер #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'] ) ) {
// Или do_shortcode(), если необходимо.
$menu_item->title = call_user_func( $shortcode_tags['profile_name'] );
}
}
}
return $menu_items;
}
конец раннего кода */
//сейчас используется, код без ссылок
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;
}
Я могу поэкспериментировать и попытаться добавить подменю под меню, изменяя код из Firebug, но это означало бы ручное редактирование всех ссылок в functions.php, что было бы утомительно.
Я хочу иметь возможность легко добавлять, редактировать, удалять и перенаправлять элементы подменю через меню WordPress.
Пожалуйста, подскажите.

Хорошо, я нашел решение (и оно может быть использовано для любой темы, с любым плагином, так как использует только основные функции WordPress).
В меню назовите пункт меню, где должно отображаться имя пользователя, с помощью заполнителя (см. скриншот ниже). Например: #profile_name#, #user#, #random#
Теперь добавьте следующий код в functions.php вашей дочерней темы:
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'] ) ) {
// Или do_shortcode(), если необходимо.
$menu_item->title = call_user_func( $shortcode_tags['profile_name'] );
}
}
}
return $menu_items;
}
Если вы используете свой собственный заполнитель, не забудьте заменить #profile_name# на имя вашего пользовательского заполнителя в коде выше.
Извините, если я неправильно использовал термин 'заполнитель'.

Код:
function give_profile_name($atts){
...
}
выдает предупреждение. Лучше использовать:
function give_profile_name(){
...
}
Также лучше проверять, авторизован ли пользователь. Например так:
function give_profile_name(){
$user=wp_get_current_user();
if(!is_user_logged_in())
$name = "Пользователь не авторизован";
else
$name=$user->user_firstname.' '.$user->user_lastname;
return $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 ( 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;
}
