Changer les étiquettes du menu Admin

44

J'ai passé la dernière journée à utiliser le fichier functions.php pour personnaliser entièrement WordPress pour mes sites clients. Je suis émerveillé de voir à quel point j'ai pu accomplir et à quel point cela facilitera les choses pour mes clients.

J'ai supprimé certains éléments de menu pour les utilisateurs qui ne sont pas connectés en tant qu'administrateur. Ce que j'espère (et d'après ce que j'ai lu, je sais que cela peut être fait) est de trouver un moyen de renommer certains éléments du menu (encadré de gauche dans la zone d'administration). Par exemple, changez les articles en articles.

Si quelqu'un peut fournir le code du fichier functions.php ou m'indiquer la direction, je l'apprécierais beaucoup!

Adam
la source
Peut-être devriez-vous diviser ceci en deux questions différentes: "Renommer les éléments du menu administrateur" et "Changer l'ordre des éléments du menu administrateur" ? Cela vous aidera à obtenir plus de points de vue pour votre question.
Jan Fabry

Réponses:

66

Voici le processus pour changer les libellés (j'ai changé de posts en "contacts" dans mon exemple)

function change_post_menu_label() {
    global $menu;
    global $submenu;
    $menu[5][0] = 'Contacts';
    $submenu['edit.php'][5][0] = 'Contacts';
    $submenu['edit.php'][10][0] = 'Add Contacts';
    $submenu['edit.php'][15][0] = 'Status'; // Change name for categories
    $submenu['edit.php'][16][0] = 'Labels'; // Change name for tags
    echo '';
}

function change_post_object_label() {
        global $wp_post_types;
        $labels = &$wp_post_types['post']->labels;
        $labels->name = 'Contacts';
        $labels->singular_name = 'Contact';
        $labels->add_new = 'Add Contact';
        $labels->add_new_item = 'Add Contact';
        $labels->edit_item = 'Edit Contacts';
        $labels->new_item = 'Contact';
        $labels->view_item = 'View Contact';
        $labels->search_items = 'Search Contacts';
        $labels->not_found = 'No Contacts found';
        $labels->not_found_in_trash = 'No Contacts found in Trash';
    }
    add_action( 'init', 'change_post_object_label' );
    add_action( 'admin_menu', 'change_post_menu_label' );

Pour changer l'ordre du menu, allez avec ceci:

// CUSTOMIZE ADMIN MENU ORDER
   function custom_menu_order($menu_ord) {
       if (!$menu_ord) return true;
       return array(
        'index.php', // this represents the dashboard link
        'edit.php', //the posts tab
        'upload.php', // the media manager
        'edit.php?post_type=page', //the posts tab
    );
   }
   add_filter('custom_menu_order', 'custom_menu_order');
   add_filter('menu_order', 'custom_menu_order');

J'ai du code pour supprimer des éléments, mais il est global et non basé sur le niveau d'accès de l'utilisateur

Norcross
la source
C'est excellent merci! Maintenant, je dois juste trouver un moyen de déplacer un élément de sous-menu (ex. Menus) en tant que bouton du menu principal. Une idée à ce sujet?
Adam
N'a pas testé, mais voyez si l'ajout de 'nav-menus.php' au tableau le déplace vers le haut.
Norcross
Malheureusement non. C’est la seule partie qui me dérange. Je veux simplement pouvoir utiliser les menus et les widgets avec leurs propres boutons pour faciliter la tâche des clients. Merci d'avoir essayé
Adam
@Norcross C'est formidable, mais est-il possible de l'adapter pour qu'il puisse inclure le domaine de texte à des fins de traduction?
Phill Healey
@PhillHealey, cette fonction ne contient aucune donnée pour l’étiquetage, mais plutôt l’ordre lui-même.
Norcross
8

Pour renommer le type de message par défaut (ou tout autre type d'ailleurs), utilisez simplement le filtre post_type_labels_{$post_type}. Par défaut postce sera post_type_labels_post. Dans le code ci-dessous se trouve la liste complète des étiquettes ( WP 4.7.1). Vous n'êtes pas obligé de tout changer.

add_filter( 'post_type_labels_post', 'news_rename_labels' );

/**
* Rename default post type to news
*
* @param object $labels
* @hooked post_type_labels_post
* @return object $labels
*/
function news_rename_labels( $labels )
{
    # Labels
    $labels->name = 'News';
    $labels->singular_name = 'News';
    $labels->add_new = 'Add News';
    $labels->add_new_item = 'Add News';
    $labels->edit_item = 'Edit News';
    $labels->new_item = 'New News';
    $labels->view_item = 'View News';
    $labels->view_items = 'View News';
    $labels->search_items = 'Search News';
    $labels->not_found = 'No news found.';
    $labels->not_found_in_trash = 'No news found in Trash.';
    $labels->parent_item_colon = 'Parent news'; // Not for "post"
    $labels->archives = 'News Archives';
    $labels->attributes = 'News Attributes';
    $labels->insert_into_item = 'Insert into news';
    $labels->uploaded_to_this_item = 'Uploaded to this news';
    $labels->featured_image = 'Featured Image';
    $labels->set_featured_image = 'Set featured image';
    $labels->remove_featured_image = 'Remove featured image';
    $labels->use_featured_image = 'Use as featured image';
    $labels->filter_items_list = 'Filter news list';
    $labels->items_list_navigation = 'News list navigation';
    $labels->items_list = 'News list';

    # Menu
    $labels->menu_name = 'News';
    $labels->all_items = 'All News';
    $labels->name_admin_bar = 'News';

    return $labels;
}

Si vous souhaitez un support pour l'internationalisation, utilisez simplement __( $text, $textdomain ):

$labels->name = __( 'News', 'textdomain' );

J'ai trouvé le filtre dans la fonction: à get_post_type_labels()partir d'un fichier wp-includes/post.php:

/**
 * Filter the labels of a specific post type.
 *
 * The dynamic portion of the hook name, `$post_type`, refers to
 * the post type slug.
 *
 * @since 3.5.0
 *
 * @see get_post_type_labels() for the full list of labels.
 *
 * @param object $labels Object with labels for the post type as member variables.
 */
$labels = apply_filters( "post_type_labels_{$post_type}", $labels );
Ivan
la source
2
La réponse de Norcross était peut-être la meilleure au moment de sa rédaction, mais il s'agit d'une approche beaucoup plus nette qui utilise un filtre natif pour obtenir le même résultat.
Ryan
2
Ayant écrit l'original, je conviens que ce filtre est bien meilleur.
Norcross
3

Vous voudrez peut-être regarder cette question

et la classe qu'ils mentionnent là sur l' essentiel

qui détient des fonctions que vous recherchez

rename_admin_menu_section()

renommer par exemple modifier Posts en Articles

et vous pouvez supprimer le menu des apparences et vous créer un nouvel élément de menu de page supérieure pour

Bainternet
la source
3

Je suis d'accord .. Le functions.phpfichier donne beaucoup de flexibilité. J'ai eu besoin de certaines des fonctionnalités que vous avez décrites avec une combinaison de functions.phpfiltres et de ce plugin .

À ce que je sache, ce plugin résoudrait vos deux problèmes et fonctionnera également dans les situations d’installation multisite. J'espère que ça t'as aidé.

Ross
la source
Oups ... shoot, désolé, je viens de comprendre le fait de ne pas vouloir utiliser un plugin. Il existe certainement des moyens de traduire les noms d'onglets et les emplacements uniquement avec le fichier Functions.php. Pour moi, après avoir emprunté cette voie (en essayant de ne pas utiliser de plug-in pour cela), j'ai décidé que le codage supplémentaire n'en valait simplement pas la peine ... compte tenu de la facilité d'utilisation de ce plug-in. Désolé, j'ai raté ce critère auparavant.
Ross
Pas de problème Ross, je vais quand même y réfléchir. Merci
Adam
0

L'exemple ci-dessus de Norcross est juste, mais j'avais besoin de la possibilité d'internationalisation. Si j'avais la réputation, ce serait un commentaire dans la réponse de Norcross, mais comme ce n'est pas le cas, je vais simplement mettre le code modifié ici. 'i18n_context' est un espace de noms arbitraire pour le contexte de traduction, il peut s'agir du nom de votre plugin ou de votre thème par exemple.

function change_post_menu_label() {
  global $menu;
  global $submenu;
  $menu[5][0] = __('Contacts', 'i18n_context');
  $submenu['edit.php'][5][0] = __('Contacts', 'i18n_context');
  $submenu['edit.php'][10][0] = __('Add Contacts', 'i18n_context');
  $submenu['edit.php'][15][0] = __('Status', 'i18n_context'); // Change name for categories
  $submenu['edit.php'][16][0] = __('Labels', 'i18n_context'); // Change name for tags
  echo '';
}

function change_post_object_label() {
  global $wp_post_types;
  $labels = &$wp_post_types['post']->labels;
  $labels->name = __('Contacts', 'i18n_context');
  $labels->singular_name = __('Contact', 'i18n_context');
  $labels->add_new = __('Add Contact', 'i18n_context');
  $labels->add_new_item = __('Add Contact', 'i18n_context');
  $labels->edit_item = __('Edit Contacts', 'i18n_context');
  $labels->new_item = __('Contact', 'i18n_context');
  $labels->view_item = __('View Contact', 'i18n_context');
  $labels->search_items = __('Search Contacts', 'i18n_context');
  $labels->not_found = __('No Contacts found', 'i18n_context');
  $labels->not_found_in_trash = __('No Contacts found in Trash', 'i18n_context');
}
add_action( 'init', 'change_post_object_label' );
add_action( 'admin_menu', 'change_post_menu_label' );
nimmolo
la source
Pourquoi n'avez-vous pas suggéré une modification à l'autre réponse?
fuxia
Eh bien, je ne peux pas encore commenter ... aussi je pensais qu'un couper-coller pourrait être utile dans le cas où Norcross veut l'éditer.
Nimmolo