Отображение имени авторизованного пользователя в меню WordPress

3 авг. 2015 г., 13:03:22
Просмотры: 28.5K
Голосов: 6

Я использую 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.

Пожалуйста, подскажите.

0
Все ответы на вопрос 3
0
10

Хорошо, я нашел решение (и оно может быть использовано для любой темы, с любым плагином, так как использует только основные функции 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# на имя вашего пользовательского заполнителя в коде выше.

Извините, если я неправильно использовал термин 'заполнитель'.

3 авг. 2015 г. 14:57:07
0

Код:

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;
}

Надеюсь, это поможет.

27 окт. 2016 г. 10:42:47
0

Короткий код не требуется

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;
} 
24 янв. 2018 г. 14:51:08