Изменение названий пунктов меню в админке

12 февр. 2011 г., 21:32:38
Просмотры: 94.2K
Голосов: 50

Я провел последний день, работая с файлом functions.php, чтобы полностью настроить WordPress для сайтов моих клиентов. Я поражен тем, сколько всего мне удалось сделать и насколько это упростит работу моим клиентам.

Я убрал определенные пункты меню для пользователей, которые не авторизованы как администраторы. Теперь я хочу (и из прочитанного знаю, что это возможно) найти способ переименовать некоторые пункты меню (в левой боковой панели админки). Например, изменить "Записи" на "Статьи".

Если кто-то может предоставить код для файла functions.php или направить меня в нужную сторону, я буду очень благодарен!

1
Комментарии

Возможно, вам стоит разделить это на два отдельных вопроса: "Переименование пунктов меню администратора" и "Изменение порядка пунктов меню администратора"? Это поможет получить больше просмотров для вашего вопроса.

Jan Fabry Jan Fabry
13 февр. 2011 г. 17:39:14
Все ответы на вопрос 6
8
74

Вот процесс изменения названий (в моем примере я заменил "записи" на "контакты")

function change_post_menu_label() {
    global $menu;
    global $submenu;
    $menu[5][0] = 'Контакты';
    $submenu['edit.php'][5][0] = 'Контакты';
    $submenu['edit.php'][10][0] = 'Добавить контакт';
    $submenu['edit.php'][15][0] = 'Статусы'; // Изменяем название для категорий
    $submenu['edit.php'][16][0] = 'Метки'; // Изменяем название для меток
    echo '';
}

function change_post_object_label() {
        global $wp_post_types;
        $labels = &$wp_post_types['post']->labels;
        $labels->name = 'Контакты';
        $labels->singular_name = 'Контакт';
        $labels->add_new = 'Добавить контакт';
        $labels->add_new_item = 'Добавить контакт';
        $labels->edit_item = 'Редактировать контакт';
        $labels->new_item = 'Контакт';
        $labels->view_item = 'Просмотреть контакт';
        $labels->search_items = 'Искать контакты';
        $labels->not_found = 'Контактов не найдено';
        $labels->not_found_in_trash = 'Контактов не найдено в корзине';
    }
    add_action( 'init', 'change_post_object_label' );
    add_action( 'admin_menu', 'change_post_menu_label' );

Для изменения порядка меню используйте этот код:

// НАСТРОЙКА ПОРЯДКА МЕНЮ В АДМИНКЕ
   function custom_menu_order($menu_ord) {
       if (!$menu_ord) return true;
       return array(
        'index.php', // ссылка на консоль
        'edit.php', // раздел записей
        'upload.php', // медиабиблиотека
        'edit.php?post_type=page', // раздел страниц
    );
   }
   add_filter('custom_menu_order', 'custom_menu_order');
   add_filter('menu_order', 'custom_menu_order');

У меня есть код для удаления элементов, но он глобальный и не основан на уровне доступа пользователя

13 февр. 2011 г. 01:59:05
Комментарии

Это отлично, спасибо! Теперь мне просто нужно найти способ переместить пункт подменю (например, "Меню") в качестве основной кнопки меню. Есть идеи по этому поводу?

Adam Adam
13 февр. 2011 г. 02:18:24

Не проверял, но попробуй добавить 'nav-menus.php' в массив — возможно, это переместит его наверх.

Norcross Norcross
13 февр. 2011 г. 02:29:40

К сожалению, нет. Это как раз та часть, которая меня беспокоит. Я просто хочу, чтобы меню и виджеты были отдельными кнопками для удобства клиентов. Но всё равно спасибо за попытку помочь.

Adam Adam
13 февр. 2011 г. 02:33:50

@Norcross Это отлично, но можно ли адаптировать код, чтобы он включал текстовый домен для целей перевода?

Phill Healey Phill Healey
12 нояб. 2014 г. 11:37:41

@PhillHealey эта функция вообще не содержит никаких данных для подписей, только сам порядок.

Norcross Norcross
12 нояб. 2014 г. 15:57:08

@Norcross Конечно. Думаю, у меня было слишком много задач в голове, когда я это писал. ;-)

Phill Healey Phill Healey
13 нояб. 2014 г. 17:06:31

Небольшая подсказка. Думаю, правильно и достаточно возвращать true для хука custom_menu_order. - add_filter( 'custom_menu_order', '__return_true' ); Порядок берется из menu_order.

bueltge bueltge
30 мар. 2015 г. 09:35:49

Ответ @Ivan ниже лучше, так как использует встроенный фильтр post_type_labels_{$post_type}, что более правильно.

Ryan Ryan
20 февр. 2018 г. 19:15:34
Показать остальные 3 комментариев
2
15

Чтобы переименовать стандартный тип записи (или любой другой), используйте фильтр post_type_labels_{$post_type}. Для стандартного типа post это будет post_type_labels_post. В приведённом ниже коде представлен полный список меток (WP 4.7.1). Вам не обязательно менять все из них.

add_filter( 'post_type_labels_post', 'news_rename_labels' );

/**
* Переименование стандартного типа записи в новости
*
* @param object $labels
* @hooked post_type_labels_post
* @return object $labels
*/
function news_rename_labels( $labels )
{
    # Метки
    $labels->name = 'Новости';
    $labels->singular_name = 'Новость';
    $labels->add_new = 'Добавить новость';
    $labels->add_new_item = 'Добавить новость';
    $labels->edit_item = 'Редактировать новость';
    $labels->new_item = 'Новая новость';
    $labels->view_item = 'Просмотреть новость';
    $labels->view_items = 'Просмотреть новости';
    $labels->search_items = 'Искать новости';
    $labels->not_found = 'Новостей не найдено.';
    $labels->not_found_in_trash = 'В корзине новостей не найдено.';
    $labels->parent_item_colon = 'Родительская новость'; // Не для "post"
    $labels->archives = 'Архив новостей';
    $labels->attributes = 'Атрибуты новости';
    $labels->insert_into_item = 'Вставить в новость';
    $labels->uploaded_to_this_item = 'Загружено для этой новости';
    $labels->featured_image = 'Миниатюра';
    $labels->set_featured_image = 'Установить миниатюру';
    $labels->remove_featured_image = 'Удалить миниатюру';
    $labels->use_featured_image = 'Использовать как миниатюру';
    $labels->filter_items_list = 'Фильтровать список новостей';
    $labels->items_list_navigation = 'Навигация по списку новостей';
    $labels->items_list = 'Список новостей';

    # Меню
    $labels->menu_name = 'Новости';
    $labels->all_items = 'Все новости';
    $labels->name_admin_bar = 'Новость';

    return $labels;
}

Если вам нужна поддержка интернационализации, используйте __( $text, $textdomain ), например:

$labels->name = __( 'Новости', 'textdomain' );

Я нашёл этот фильтр в функции: get_post_type_labels() из файла wp-includes/post.php:

/**
 * Фильтр меток определённого типа записи.
 *
 * Динамическая часть имени хука, `$post_type`, относится к
 * ярлыку (slug) типа записи.
 *
 * @since 3.5.0
 *
 * @see get_post_type_labels() для полного списка меток.
 *
 * @param object $labels Объект с метками для типа записи в виде переменных-членов.
 */
$labels = apply_filters( "post_type_labels_{$post_type}", $labels );
19 февр. 2017 г. 02:20:30
Комментарии

Ответ Норкросса мог быть лучшим на момент написания, но этот подход гораздо чище, так как использует нативный фильтр для достижения того же результата.

Ryan Ryan
20 февр. 2018 г. 19:18:07

Как автор оригинала, согласен, что этот фильтр намного лучше.

Norcross Norcross
26 нояб. 2018 г. 02:49:00
2

Согласен.. Файл functions.php предоставляет множество возможностей для настройки. Мне тоже требовалась похожая функциональность, которую я реализовал комбинацией фильтров в functions.php и этого плагина.

Насколько я могу судить.. этот плагин решает обе ваши проблемы и отлично работает в мультисайтовых установках. Надеюсь, это поможет.

12 февр. 2011 г. 22:09:36
Комментарии

Упс... ой, извините, только что увидел часть про нежелание использовать плагин. Определенно есть способы перевести названия вкладок и их расположение только через Functions.php. Лично я, пройдя по этому пути (пытаясь обойтись без плагинов), решил, что дополнительные усилия по кодингу просто не стоят того... учитывая, насколько просто использовать этот плагин. Извините, что пропустил это условие раньше.

Ross Ross
12 февр. 2011 г. 22:11:50

Без проблем, Росс, я все равно собираюсь разобраться в этом. Спасибо.

Adam Adam
13 февр. 2011 г. 02:34:13
0

Возможно, вам стоит посмотреть этот вопрос

и упомянутый там класс на gist

который содержит нужные вам функции

rename_admin_menu_section()

чтобы, например, переименовать "Записи" в "Статьи"

а также вы можете удалить меню "Внешний вид" и создать свой новый элемент верхнего меню для

13 февр. 2011 г. 00:25:36
2

Пример от Norcross выше абсолютно верный, но мне потребовалась возможность интернационализации. Если бы у меня была достаточная репутация, я бы оставил это как комментарий к ответу Norcross, но поскольку её нет, я просто размещу модифицированный код здесь. 'i18n_context' — это произвольное пространство имён для контекста перевода, например, оно может быть названием вашего плагина или темы.

function change_post_menu_label() {
  global $menu;
  global $submenu;
  $menu[5][0] = __('Контакты', 'i18n_context');
  $submenu['edit.php'][5][0] = __('Контакты', 'i18n_context');
  $submenu['edit.php'][10][0] = __('Добавить контакты', 'i18n_context');
  $submenu['edit.php'][15][0] = __('Статус', 'i18n_context'); // Изменяем название для категорий
  $submenu['edit.php'][16][0] = __('Метки', 'i18n_context'); // Изменяем название для тегов
  echo '';
}

function change_post_object_label() {
  global $wp_post_types;
  $labels = &$wp_post_types['post']->labels;
  $labels->name = __('Контакты', 'i18n_context');
  $labels->singular_name = __('Контакт', 'i18n_context');
  $labels->add_new = __('Добавить контакт', 'i18n_context');
  $labels->add_new_item = __('Добавить контакт', 'i18n_context');
  $labels->edit_item = __('Редактировать контакты', 'i18n_context');
  $labels->new_item = __('Контакт', 'i18n_context');
  $labels->view_item = __('Просмотреть контакт', 'i18n_context');
  $labels->search_items = __('Искать контакты', 'i18n_context');
  $labels->not_found = __('Контактов не найдено', 'i18n_context');
  $labels->not_found_in_trash = __('Контактов в корзине не найдено', 'i18n_context');
}
add_action( 'init', 'change_post_object_label' );
add_action( 'admin_menu', 'change_post_menu_label' );
4 февр. 2016 г. 10:11:04
Комментарии

Почему ты не предложил правку к другому ответу?

fuxia fuxia
4 февр. 2016 г. 10:35:38

ну, я пока не могу оставлять комментарии... также я подумал, что копирование и вставка могут быть полезны, если Norcross захочет отредактировать ответ.

nimmolo nimmolo
5 февр. 2016 г. 12:16:04
0

Я знаю, что несколько запоздал с этим вопросом, но чувствую, что в этом подходе есть проблема, о которой нужно сказать.

Когда любой из приведённых выше кодов используется вместе с WP 6.4.2, поле заголовка исчезает в редакторе блоков в режиме редактирования, делая невозможным его изменение или даже просмотр.

Поскольку никто не упоминает об этом в более старых сообщениях выше, я предполагаю, что это либо моя проблема, либо что-то изменилось в Wordpress после введения редактора блоков.

Может ли кто-нибудь прояснить, является ли это актуальной проблемой сейчас или у меня есть какая-то другая причина этого поведения?

25 янв. 2024 г. 10:51:03