add_menu_page() с другим именем для первого элемента подменю

Вопрос или проблема

Документация по 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>';
}

Пояснение:

  1. Основной пункт меню: Функция add_menu_page() добавляет новый пункт в меню администратора. Здесь вы задаете его título и название для отображения.

  2. Первый подпункт: Для первого подпункта меню используем add_submenu_page(), указывая в качестве slug тот же идентификатор, что и для родительского меню. Это значит, что когда пользователь кликает на первый подпункт, он будет перебрасываться на ту же страницу, что и при клике на родительский пункт меню. Но при этом вы можете задать ему другое название, чтобы пользователю это отображалось именно как "Первый подпункт".

  3. Другие подпункты: Вы можете добавлять дополнительные пункты в меню, задавая уникальные значения slug для этих подпунктов.

Примечания:

  • После добавления этих кодов в ваш плагин или файл functions.php активируйте его, если это необходимо. Теперь в админке WordPress ваш пункт меню "Мое меню" будет содержать подпункт с другим названием.
  • Не забудьте проверить права доступа (capability) для пользователей, чтобы убедиться, что только авторизованные лица имеют доступ к этим страницам.
  • Дополнительное использование функции remove_submenu_page() можно применить, если вы хотите скрыть оригинальный подпункт, но это зависит от конкретных требований вашей реализации.

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

Оцените материал
Добавить комментарий

Капча загружается...