Вопрос или проблема
Документация по add_menu_page
говорит, что нужно передать заголовок меню в качестве второго параметра:
add_menu_page('Заголовок страницы', 'Заголовок меню', ...);
При добавлении дополнительных страниц позже через add_submenu_page
главная страница становится первым элементом в подменю:
Однако я хочу, чтобы первый элемент списка имел другое имя (но все еще указывал на ту же страницу), так как это делает сам WordPress:
Как я могу этого добиться в своем плагине?
Вы можете сделать ‘slug’ для подстраницы равным слогу главной страницы, и они будут указывать на одно и то же место:
add_action('admin_menu', 'my_menu_pages');
function my_menu_pages(){
add_menu_page('Мой заголовок страницы', 'Мой заголовок меню', 'manage_options', 'my-menu', 'my_menu_output' );
add_submenu_page('my-menu', 'Заголовок подменю', 'Все, что хотите', 'manage_options', 'my-menu' );
add_submenu_page('my-menu', 'Заголовок подменю 2', 'Все, что хотите 2', 'manage_options', 'my-menu2' );
}
Например:
Сделайте slug родительского элемента меню и подменю таким же (первый элемент), как показано ниже:
function actions_recent_bids_add_admin_page(){
add_menu_page(
'Недавние ставки',
'Отчеты аукционов',
'manage_options',
'wc-auction-reports',
'actions_recent_bids_list',
'dashicons-chart-area',
56
);
add_submenu_page(
'wc-auction-reports', // родительский slug
'Недавние ставки', // заголовок страницы
'Недавние ставки', // заголовок меню
'manage_options', // права
'wc-auction-reports', // slug
'acutions_customers_spendings_list' // обратный вызов
);
add_submenu_page(
'wc-auction-reports', // родительский slug
'Расходы клиента', // заголовок страницы
'Расходы клиента', // заголовок меню
'manage_options', // права
'wc-acutions-customers-spendings', // slug
'acutions_customers_spendings_list' // обратный вызов
);
add_submenu_page(
'wc-auction-reports', // родительский slug
'Ставки клиента', // заголовок страницы
'Ставки клиента', // заголовок меню
'manage_options', // права
'wc-acutions-customers-bids', // slug
'acutions_customers_bids_list' // обратный вызов
);
}
add_action('admin_menu','actions_recent_bids_add_admin_page');
Привет, я только что потратил массу времени, пытаясь найти это, и правильный способ не указан здесь. Вам нужно использовать
remove_submenu_page('parent_slug','parent_slug');
в конце вашей функции
Обновление!!! Если вы не уверены, существует ли родительское меню, вы можете сначала проверить это следующим образом:
function contacts_page_submenu(){
// Проверить, существует ли меню (если родитель существует), нам это не нужно, но он написал :| (я редактор)
if(menu_page_url('contacts-parent-menu', false)){
// Изменить текст первого подменю
add_submenu_page(
'contacts-parent-menu', // Требуется slug родителя
'Настройки контактов',
'Настройки контактов',
'manage_options',
'contacts-parent-menu', // Требуется slug родителя
'contacts_submenu_callback' // Укажите имя обратного вызова родителя
);
}
}
add_action('admin_menu', 'contacts_page_submenu');
Проверено и работает в WordPress 6.
Ссылка: https://developer.wordpress.org/reference/functions/add_submenu_page/
function content_adder_menu() {
add_menu_page(
'Контент', // Заголовок страницы
'Контент', // Заголовок меню
'manage_options', // Права, необходимые для доступа
'content-adder', // slug меню
'content_adder_page' // Функция обратного вызова для отображения страницы
);
// Добавить подстраницу под верхним уровнем меню
add_submenu_page(
'content-adder', // slug родительского меню
'Добавить контент', // Заголовок страницы
'Добавить контент', // Заголовок меню
'manage_options', // Права, необходимые для доступа
'add-content', // slug меню
'add_content_page' // Функция обратного вызова для отображения страницы
);
}
// Функция обратного вызова для страницы верхнего уровня меню
function content_adder_page() {
// Отображение содержимого вашей страницы верхнего уровня меню здесь
echo '<div class="wrap">';
echo '<h1>Добро пожаловать в Контент</h1>';
// Получение записей из типа поста 'post'
$args = array(
'post_type' => 'post', // Настройте тип поста по мере необходимости
'post_status' => 'publish', // Получить только опубликованные записи
'posts_per_page' => -1, // Получить все записи
);
$query = new WP_Query($args);
if ($query->have_posts()) {
echo '<h2>Список записей</h2>';
echo '<ul>';
while ($query->have_posts()) {
$query->the_post();
echo '<li><a href="' . get_permalink() . '">' . get_the_title() . '</a></li>';
}
echo '</ul>';
wp_reset_postdata(); // Восстановить глобальные данные поста
} else {
echo '<p>Записи не найдены.</p>';
}
echo '</div>';
}
// Функция обратного вызова для подстраницы
function add_content_page() {
// Отображение содержимого вашей подстраницы здесь
echo '<div class="wrap">';
echo '<h1>Добавить контент </h1>';
// Проверка, отправлена ли форма
if(isset($_POST['submit'])) {
// Обработка данных формы здесь
$url = sanitize_text_field($_POST['url']);
$content = wp_kses_post($_POST['content']);
// Сохранить или использовать отправленные данные по мере необходимости
// Например, вы можете сохранить это в настраиваемый тип поста или отобразить
$new_post = array(
'post_title' => 'Ваш заголовок поста',
'post_content' => $content, // Содержимое, которое вы хотите сохранить
'post_status' => 'publish', // Опубликовать пост
'post_author' => 1, // ID автора (1 обычно является администратором)
'post_type' => 'post', // Тип поста (измените по мере необходимости)
);
$post_id = wp_insert_post($new_post);
if ($post_id) {
// Пост успешно вставлен
echo 'Пост с ID ' . $post_id . ' создан.';
} else {
// Произошла ошибка
echo 'Ошибка при создании поста.';
}
echo "<p>URL: $url</p>";
echo "<div>Содержимое: $content</div>";
} else {
// Отображение формы
echo '<form method="post">';
echo '<label for="url">Добавить URL:</label> <br>';
echo '<input type="text" name="url" id="url" /><br />';
echo '<label for="content">Добавить содержимое:</label> <br>';
echo '<textarea name="content" id="content" rows="5" cols="40"></textarea><br />';
echo '<input type="submit" name="submit" value="Добавить контент" class="button button-primary" />';
echo '</form>';
}
echo '</div>';
}
add_action('admin_menu', 'content_adder_menu');
Просто добавьте это:
$submenu['my-menu'][0][0] = 'Мой новый заголовок меню';
Для отладки вы можете выполнить print_r($menu)
, чтобы проверить все меню WP.
add_submenu_page(
'tut_theme_settings', // родительский slug
'Элементы главной страницы 2', // заголовок страницы
'Главная страница 2', // заголовок меню
'manage_options', // права
'tut_theme_settings2', // slug
'theme_front_page_settings' // обратный вызов
);
если требуется другое имя для первого подменю, создайте такой же slug для родителя и первого дочернего элемента и вызовите ту же функцию
Ответ или решение
Чтобы задать разные названия для первого элемента подпункта меню в WordPress, используя функции add_menu_page()
и add_submenu_page()
, необходимо использовать несколько хитростей. Основная концепция заключается в том, чтобы назначить родительскому пункту меню и первому подпункту одно и то же значение для параметра slug, что обеспечит их привязку к одной и той же странице, а также позволяет переопределить название первого подпункта, чтобы оно отличалось от названия родительского меню.
Пример реализации
Для начала создайте функцию, которая будет добавлять меню на панель администратора:
function my_custom_menu() {
// Добавляем основной меню
add_menu_page(
'Моя страница', // Заголовок страницы
'Мое меню', // Название меню
'manage_options', // Права доступа
'my-menu', // slug
'my_menu_callback', // Callback функция для вывода содержимого
'dashicons-admin-home', // Иконка меню
56 // Позиция в меню
);
// Добавляем подпункт меню, с тем же slug как у родителя
add_submenu_page(
'my-menu', // slug родительского меню
'Моя страница', // Заголовок страницы
'Первый подпункт', // Название подпункта
'manage_options', // Права доступа
'my-menu', // Существующий slug родительского меню
'my_menu_callback' // Ссылка на тот же callback
);
// Другие подпункты
add_submenu_page(
'my-menu', // slug родительского меню
'Второй подпункт', // Заголовок страницы
'Второй подпункт', // Название подпункта
'manage_options', // Права доступа
'my-second-submenu', // Уникальный slug
'my_second_submenu_callback' // Callback для второго подпункта
);
}
add_action('admin_menu', 'my_custom_menu');
// Callback функция для главного меню и первого подпункта
function my_menu_callback() {
echo '<div class="wrap"><h1>Это содержимое главной страницы</h1></div>';
}
// Callback функция для второго подпункта
function my_second_submenu_callback() {
echo '<div class="wrap"><h1>Это содержимое второго подпункта</h1></div>';
}
Пояснение:
-
Основной пункт меню: Функция
add_menu_page()
добавляет новый пункт в меню администратора. Здесь вы задаете его título и название для отображения. -
Первый подпункт: Для первого подпункта меню используем
add_submenu_page()
, указывая в качестве slug тот же идентификатор, что и для родительского меню. Это значит, что когда пользователь кликает на первый подпункт, он будет перебрасываться на ту же страницу, что и при клике на родительский пункт меню. Но при этом вы можете задать ему другое название, чтобы пользователю это отображалось именно как "Первый подпункт". -
Другие подпункты: Вы можете добавлять дополнительные пункты в меню, задавая уникальные значения slug для этих подпунктов.
Примечания:
- После добавления этих кодов в ваш плагин или файл
functions.php
активируйте его, если это необходимо. Теперь в админке WordPress ваш пункт меню "Мое меню" будет содержать подпункт с другим названием. - Не забудьте проверить права доступа (capability) для пользователей, чтобы убедиться, что только авторизованные лица имеют доступ к этим страницам.
- Дополнительное использование функции
remove_submenu_page()
можно применить, если вы хотите скрыть оригинальный подпункт, но это зависит от конкретных требований вашей реализации.
Этот способ позволит вам гибко управлять отображением элементов меню в WordPress, унифицировать usability и обеспечить удобный интерфейс для конечного пользователя, сохраняя при этом функциональность вашего плагина.