web-dev-qa-db-fra.com

Modifier les clés spécifiques dans WP_Admin_Bar

Est-il facilement possible de modifier des liens dans l'instance WP_Admin_Bar global $wp_admin_bar?

3
Julian F. Weinert

Oui J'ai récemment rencontré le cas où je voulais changer le lien de profil dans la section informations sur l'utilisateur de la barre d'administration. Le problème est que vous ne pouvez obtenir que tous les nœuds, les ajouter et les supprimer. Pas éditer. Et vous ne pouvez pas non plus modifier la propriété $wp_admin_bar->nodes car elle est privée.

Lorsque vous les supprimez et les ajoutez facilement, vous perdez votre commande et le tout a l'air horrible. Maintenant voici ma solution:

// void jw_edit_admin_bar ( mixed $id , string $property , string $value )

if(!function_exists('jw_edit_admin_bar')) {
    function jw_edit_admin_bar($id, $property, $value) {
        global $wp_admin_bar;

        if(!is_array($id)) {
            $id = array($id);
        }

        $all_nodes = $wp_admin_bar->get_nodes();

        foreach($all_nodes as $key => $val) {
            $current_node = $all_nodes[$key];
            $wp_admin_bar->remove_node($key);

            if(in_array($key, $id)) {
                $current_node->$property = $value;
            }

            $wp_admin_bar->add_node($current_node);
        }
    }
}

add_action('admin_bar_menu', function() { jw_edit_admin_bar(array('user-info', 'my-account'), 'href', 'http://www.nyan.cat'); });
7
Julian F. Weinert

D'accord, j'ai récemment rencontré un problème en essayant de créer un message d'accueil personnalisé pour les vacances/l'heure du jour pour la barre d'outils Wordpress Admin et j'ai rencontré cette réponse, ce qui m'a conduit vers des heures de perte de temps, car elles sont en réalité totalement inutiles. Vous n'avez pas besoin de détruire et de reconstruire la barre d'outils d'administration pour modifier un nœud.

La solution simple au problème de Julien est un ajout de 5 lignes à votre fichier functions.php qui remplace l'URL souhaitée:

    //-----------------------------------------------------------------------------
/* change location of user profile page in admin toolbar */
add_filter( 'edit_profile_url', 'update_admin_bar_user_profile_url', 10, 3 );
function update_admin_bar_user_profile_url( $url, $user_id, $scheme ) {
    $url = site_url( '/edit-user-profile/' );
    return $url;
}
//-----------------------------------------------------------------------------

Maintenant, si vous voulez approfondir l'édition/la manipulation de la barre d'outils de l'administrateur, vous pouvez faire quelque chose comme ceci, qui ajoute l'URL du site Web de l'utilisateur, s'il en a saisi un dans sa page de profil, en tant que nœud du profil d'utilisateurs. Panel (aka un lien dans le "sous-menu"):

    /* --- add the user website link node in the admin toolbar --- */
add_action( 'admin_bar_menu', 'update_admin_bar_user_node', 250 );
function update_admin_bar_user_node( $wp_admin_bar ) {
    $user_id = get_current_user_id();
    $current_user = wp_get_current_user();
    $profile_url = get_edit_profile_url( $user_id );

    if ( ! $user_id )
            return;

    if ( current_user_can( 'read' ) ) {
        $profile_url = get_edit_profile_url( $user_id );
    } elseif ( is_multisite() ) {
        $profile_url = get_dashboard_url( $user_id, 'profile.php' );
    } else {
        $profile_url = false;
    }

    // Add the users website/link to the user-actions sub-menu if they have one 
    $my_account = $wp_admin_bar->get_node( 'my-account' );
    if( ! empty( $current_user->user_url ) && $my_account ){
        $wp_admin_bar->add_node( array(
            'parent'    => 'user-actions',
            'id'        => 'user-url',
            'title'     => '<span class="user-url">' . __( 'My Website' ) . '</span>',
            'href'      => esc_url( $current_user->user_url )
        ) );
    }       
}

Voici une capture d'écran de l'apparence de cette modification dans le menu "actions utilisateur" "mon-compte":  enter image description here 

2
Obewan