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

Вот процесс изменения названий (в моем примере я заменил "записи" на "контакты")
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');
У меня есть код для удаления элементов, но он глобальный и не основан на уровне доступа пользователя

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

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

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

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

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

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

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

Чтобы переименовать стандартный тип записи (или любой другой), используйте фильтр 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 );

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

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

Возможно, вам стоит посмотреть этот вопрос
и упомянутый там класс на gist
который содержит нужные вам функции
rename_admin_menu_section()
чтобы, например, переименовать "Записи" в "Статьи"
а также вы можете удалить меню "Внешний вид" и создать свой новый элемент верхнего меню для

Пример от 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' );

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