Zmiana etykiet menu administracyjnego

44

Ostatni dzień spędziłem przy użyciu pliku functions.php, aby w pełni dostosować WordPress do moich witryn klienckich. Jestem zdumiony, jak wiele udało mi się osiągnąć i o ile łatwiej uczyni to moim klientom.

Usunąłem pewne elementy menu dla użytkowników, którzy nie są zalogowani jako administrator. Mam nadzieję (i z tego, co przeczytałem, wiem, że można to zrobić) to znaleźć sposób na zmianę nazwy niektórych pozycji menu (lewy pasek boczny w obszarze administracyjnym). Na przykład zmień posty na artykuły.

Jeśli ktokolwiek może dostarczyć kod dla pliku functions.php lub skierować mnie w tym kierunku, byłbym bardzo wdzięczny!

Adam
źródło
Może powinieneś podzielić to na dwa różne pytania: „Zmiana nazwy elementów menu administratora” i „Zmiana kolejności elementów menu administratora” ? Pomoże Ci to uzyskać więcej wyświetleń pytania.
Jan Fabry

Odpowiedzi:

66

Oto proces zmiany etykiet (w moim przykładzie zmieniłem posty na „kontakty”)

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' );

Aby zmienić kolejność menu, wykonaj następujące czynności:

// 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');

Mam kod do usuwania elementów, ale jest on globalny i nie zależy od poziomu dostępu użytkownika

Norcross
źródło
To wspaniale dzięki! Teraz muszę tylko znaleźć sposób na przeniesienie elementu podmenu (np. Menu) jako przycisku menu głównego. Masz jakiś pomysł na ten temat?
Adam
Nie testowałem, ale sprawdź, czy dodanie „nav-menus.php” do tablicy powoduje wzrost.
Norcross,
Niestety nie. To była jedna część, która mnie wkurza. Chcę tylko, aby menu i widżety były własnymi przyciskami, więc jest to łatwiejsze dla klientów. Dziękuję jednak za próbę
Adam
@Norcross To świetnie, ale czy można go dostosować, aby mógł zawierać domenę tekstową do celów tłumaczenia?
Phill Healey,
@PhillHealey ta funkcja nie zawiera żadnych danych do etykietowania, a jedynie samą kolejność.
Norcross,
8

Aby zmienić nazwę domyślnego typu posta (lub dowolnego innego w tym zakresie), wystarczy użyć filtru post_type_labels_{$post_type}. Domyślnie posttak będzie post_type_labels_post. W poniższym kodzie znajduje się pełna lista etykiet ( WP 4.7.1). Nie musisz zmieniać wszystkiego.

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

Jeśli chcesz uzyskać obsługę internacjonalizacji, po prostu użyj __( $text, $textdomain ):

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

Znalazłem filtr w funkcji: get_post_type_labels()z pliku 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
źródło
2
Odpowiedź Norcrossa mogła być najlepsza w chwili, gdy została napisana, ale jest to o wiele czystsze podejście, które wykorzystuje natywny filtr do osiągnięcia tego samego rezultatu.
Ryan
2
Po napisaniu oryginału zgadzam się, że ten filtr jest znacznie lepszy.
Norcross
3

Możesz spojrzeć na to pytanie

a klasa wspominają tam na GIST

który zawiera funkcje, których szukasz

rename_admin_menu_section()

zmienić nazwę, na przykład zmienić posty na artykuły

możesz usunąć menu wyglądów i utworzyć nowy element menu górnej strony

Bainternet
źródło
3

Zgadzam się. functions.phpPlik zapewnia dużą elastyczność. Potrzebowałem tej samej funkcjonalności, którą opisałeś z kombinacją functions.phpfiltrów i tej wtyczki .

Z tego, co mogę powiedzieć .. ta wtyczka rozwiązałaby oba problemy i działa również w sytuacjach instalacji wielu witryn. Mam nadzieję, że to pomaga.

Ross
źródło
Ups ... strzelaj, przepraszam, właśnie zobaczyłem, że nie chcesz używać wtyczki. Istnieją zdecydowanie sposoby na przetłumaczenie nazw kart i miejsc docelowych za pomocą Functions.php. Dla mnie, po przejściu tej ścieżki (próbując być za to darmowy dla wtyczek) zdecydowałem, że dodatkowe kodowanie po prostu nie było tego warte ... biorąc pod uwagę, jak łatwa była ta wtyczka. Przepraszam, że wcześniej nie spełniałem tych kryteriów.
Ross
Nie ma problemu, Ross, i tak się tym zajmę. Dzięki
Adam,
0

Powyższy przykład Norcrossa jest słuszny, ale potrzebowałem możliwości internacjonalizacji. Gdybym miał reputację, byłby to komentarz pod odpowiedzią Norcrossa, ale ponieważ nie mam, po prostu umieszczę tutaj zmodyfikowany kod. „i18n_context” to dowolna przestrzeń nazw dla kontekstu tłumaczenia, na przykład może to być nazwa wtyczki lub motywu.

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
źródło
Dlaczego nie zaproponowałeś edycji innej odpowiedzi?
fuxia
Cóż, nie mogę jeszcze komentować ... Pomyślałem też, że wycinanie i wklejanie może być przydatne w przypadku, gdy Norcross chce je edytować.
nimmolo,