web-dev-qa-db-ja.com

Wordpressのメニューにログインユーザ名を表示する

私はWordpressをUserProと一緒に使用していて、自分のメニューにログインしているユーザーの姓をユーザープロファイルページにリンクさせて表示させます。

問題は私のメニュー構造では、 "Profile"メニューオプションは "edit profile"、 "submit"、そして "logout"を含むサブメニューを持つことになっているということです。

これは私が現在使っているコードです:

/*earlier code, currently commented out, for function to
display username in menu using #profile_name# placeholder

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'] ) ) {
                // Or do_shortcode(), if you must.
                $menu_item->title = call_user_func( $shortcode_tags['profile_name'] );
            }    
        }
    }

    return $menu_items;
}  

end of earlier code */

//currently in use, unlinked code

    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のメニューからサブメニュー項目を簡単に追加、編集、削除、リダイレクトできるようにしたい。

お知らせ下さい。

4
Akash kapur

さて、私は解決策を見つけました(そしてそれはコアWordPress機能を使うだけなのでどんなプラグインでもどんなテーマにも使えます).

メニューで、ユーザーの名前を表示するメニュー項目にプレースホルダーを付けます(下のスクリーンショットを参照)。例:#profile_name#、#user#、#random#

enter image description here 

では、あなたの子供テーマの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'] ) ) {
                // Or do_shortcode(), if you must.
                $menu_item->title = call_user_func( $shortcode_tags['profile_name'] );
            }    
        }
    }

    return $menu_items;
} 

独自のプレースホルダーを使用している場合は、上記のコードで#profile_name#をカスタムプレースホルダーの名前に置き換えることを忘れないでください。

「プレースホルダ」という用語を誤用した場合の謝罪.

7
Akash kapur

コード:

function give_profile_name($atts){
...
}

警告を出します。より良いです:

function give_profile_name(){
...
}

また、ユーザーがログインしているかどうかを検出することをお勧めします。そのようです:

function give_profile_name(){
    $user=wp_get_current_user();
    if(!is_user_logged_in())
        $name = "User not logged in";
    else
         $name=$user->user_firstname.' '.$user->user_lastname; 
    return $name;
}

お役に立てれば。

5
Eutychus Mak

ショートコードは不要

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;
} 
0
Manu Lebranders