Создание страницы в админке WordPress без меню для плагина

24 февр. 2014 г., 00:34:41
Просмотры: 16.3K
Голосов: 6

Я пишу плагин, который будет выводить список записей из пользовательских таблиц. Я добавил главную страницу плагина с помощью следующих функций WordPress:

// Добавляем меню и страницы в админку WordPress
add_action('admin_menu', 'myplugin_create_top_level_menu');

function myplugin_create_top_level_menu() {
    add_menu_page('MyPlugin', 'MyPlugin', 'manage_options', 'myplugin-top-level-admin-menu');
    add_submenu_page('myplugin-top-level-admin-menu', 'MyPlugin Admin Page', 'Admin Page', 'manage_options', 'myplugin-top-level-admin-menu', 'myplugin_admin_page');
}

function myplugin_admin_page {
    // Код для отображения админ-страницы плагина (php и html код)
    // Включает следующий псевдокод (на php)
    foreach ($results_from_db as $result) {
        // КОД ДЛЯ ВЫВОДА РЕЗУЛЬТАТОВ В HTML ТАБЛИЦУ *** НУЖНА ПОМОЩЬ ЗДЕСЬ ***
    }
}

Если внимательно посмотреть код выше, там есть комментарий 'I NEED HELP HERE'; вот подробности:

Я знаю, как вывести всё на созданной админ-странице. Страница будет читать данные из кастомных таблиц и выводить результаты в виде строк HTML таблицы.

Мне нужно только добавить ссылку на каждую строку, которая вела бы на страницу 'Детали записи'. Идея в том, что для каждой строки в таблице будет ссылка, при клике на которую откроется другая страница с подробной информацией об этой записи.

Я думал использовать add_submenu_page как описано здесь, но честно говоря не понял, как это применить в моём коде. Я пробовал примерно так, но думаю это неправильно:

function myplugin_admin_page {
    // Код для отображения админ-страницы плагина (php и html код)
    // Включает следующий псевдокод (на php)
    foreach ($results_from_db as $result) {
        // КОД ДЛЯ ВЫВОДА РЕЗУЛЬТАТОВ В HTML ТАБЛИЦУ *** НУЖНА ПОМОЩЬ ЗДЕСЬ ***

        // Следующая строка кода неверна, но показывает идею
        echo '<a href="' . add_submenu_page(NULL,'Детали записи','Детали записи','manage_options','details-page', 'myplugin_details_page'); . '">Просмотр</a>';
    }
}

myplugin_details_page () {
    // Код для отображения страницы с деталями
}

Сейчас у меня две проблемы:

  1. Как правильно добавить страницу деталей (очевидно, что мой вариант во втором примере кода неверен)?
  2. Как передавать параметры на страницу деталей (мне нужно передавать ID записи для просмотра деталей)?

Я думаю, что близок к решению, но не смог найти достаточно документации чтобы завершить задачу. Пожалуйста, помогите, буду очень признателен.

Спасибо.

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

Вы видели это https://github.com/tommcfarlin/WordPress-Plugin-Boilerplate

Brad Dalton Brad Dalton
24 февр. 2014 г. 01:55:38

@BradDalton: Нет, я раньше этого не видел, но выглядит интересно. Я посмотрю позже.

Greeso Greeso
24 февр. 2014 г. 07:14:29
Все ответы на вопрос 2
2
13

Я уже не так уверен, что понимаю, что именно вы делаете, как раньше.

// Добавляем меню и страницы в админку WordPress
add_action('admin_menu', 'myplugin_create_top_level_menu');

function myplugin_create_top_level_menu() {

    // Это меню в боковой панели
    add_menu_page(
      'MyPlugin', 
      'MyPlugin', 
      'manage_options', 
      'myplugin-top-level-page'
    );

    // Это первая страница, которая отображается при клике на меню
    add_submenu_page(
      'myplugin-top-level-page', 
      'MyPlugin Top Level Page',
      'MyPlugin Top Level Page', 
      'manage_options', 
      'myplugin-top-level-page', 
      'myplugin_top_level_page_callback'
     );

     // Это скрытая страница
     add_submenu_page(
      null, 
      'MyPlugin Details Page',
      'MyPlugin Details Page', 
      'manage_options', 
      'myplugin-details-page', 
      'myplugin_details_page_callback'
     );
}

function myplugin_top_level_page_callback() {

    global $wpdb;
    $results_from_db = $wpdb->get_results("SELECT * FROM myplugin_custom_table");

    foreach ($results_from_db as $result) {

        $id = $result->id;

        $link = add_query_arg(
            array(
                'page' => 'myplugin-details-page', // как определено в скрытой странице
                'id' => $id
            ),
            admin_url('admin.php')
        );

        echo '<ul>';
        echo '<li><a href="'.$link.'">'.$id.'</a><li>';
        echo '</ul>';
    }
}

function myplugin_details_page_callback () {
    // Эта функция для отображения скрытой страницы (html и php)
}

Вы используете две дополнительные основные функции, поэтому для справки:

24 февр. 2014 г. 00:57:36
Комментарии

Спасибо за ваш ответ. Однако мне нужно создать две отдельные страницы. Приведу пример. В админке WordPress, если вы нажмете на "Записи", вы увидите список записей вашего сайта. Для каждой записи можно нажать "Редактировать", чтобы просмотреть детали этой конкретной записи. Детали записи доступны только через ссылку из списка записей. Также postID передается на страницу редактирования, чтобы отображалась правильная запись. Я делаю то же самое, но для плагина, как описано в моем вопросе.

Greeso Greeso
24 февр. 2014 г. 01:06:59

Ваше решение не было на 100% точным, но оно было достаточно близким, чтобы вдохновить меня на правильное решение. Я изменю ваш ответ, чтобы отразить верное решение. Спасибо.

Greeso Greeso
24 февр. 2014 г. 06:53:35
0

Лучше добавить дополнительный параметр в URL, назвав его "action", и в зависимости от действия отображать разные шаблоны для разных действий.

Преимущество: Это позволит сохранить меню открытым (активным). В предыдущем решении меню не будет оставаться открытым для скрытого пункта, поскольку мы фактически удаляем родительский элемент подменю.

11 окт. 2018 г. 08:14:04