Crear una página de administración de WordPress sin menú para un plugin

24 feb 2014, 00:34:41
Vistas: 16.3K
Votos: 6

Estoy desarrollando un plugin que mostrará una serie de entradas desde tablas personalizadas. He añadido la página principal del plugin usando las siguientes funciones de WordPress:

// Añadir menú y páginas al área de administración de WordPress
add_action('admin_menu', 'myplugin_create_top_level_menu');

function myplugin_create_top_level_menu() {
    add_menu_page('MiPlugin', 'MiPlugin', 'manage_options', 'myplugin-top-level-admin-menu');
    add_submenu_page('myplugin-top-level-admin-menu', 'Página de Admin de MiPlugin', 'Página Admin', 'manage_options', 'myplugin-top-level-admin-menu', 'myplugin_admin_page');
}

function myplugin_admin_page() {
    // Código para mostrar la página de administración del plugin (tanto php como html)
    // Esto incluye el siguiente pseudocódigo (en php)
    foreach ($results_from_db as $result) {
        // CÓDIGO PARA MOSTRAR RESULTADOS EN UNA TABLA HTML *** NECESITO AYUDA AQUÍ ***
    }
}

Si lees el código anterior detenidamente, notarás que hay un comentario que dice 'NECESITO AYUDA AQUÍ'; aquí están más detalles:

Sé cómo mostrar todo en la página de administración que creé. La página leerá de las tablas personalizadas y mostrará los resultados como filas de una tabla HTML.

Solo necesito enlazar cada fila a una página, llamémosla 'Página de Detalles de Entrada'. La idea es que para cada fila en la tabla HTML, habrá un enlace que al hacer clic me lleve a otra página que muestre más detalles sobre esa fila.

Estaba pensando en usar add_submenu_page como se describe aquí, pero honestamente no entendí cómo usarlo e incluirlo en mi código. Intenté algo como esto pero creo que está mal:

function myplugin_admin_page() {
    // Código para mostrar la página de administración del plugin (tanto php como html)
    // Esto incluye el siguiente pseudocódigo (en php)
    foreach ($results_from_db as $result) {
        // CÓDIGO PARA MOSTRAR RESULTADOS EN UNA TABLA HTML *** NECESITO AYUDA AQUÍ ***

        // La siguiente línea de código es incorrecta, pero muestra la idea
        echo '<a href="' . add_submenu_page(NULL,'Página de Detalles','Detalles','manage_options','details-page', 'myplugin_details_page'); . '">Ver</a>';
    }
}

function myplugin_details_page() {
    // Código para mostrar la página de detalles
}

Los dos problemas que enfrento son:

  1. Cómo añadir correctamente la página de detalles (está claro que lo que hice en el segundo fragmento de código es incorrecto)
  2. Cómo incluir parámetros en la página de detalles (necesito pasar un ID de fila para ver los detalles)

Creo que estoy muy cerca de resolver el problema, pero no encontré suficiente documentación para terminarlo, así que por favor ayuda, y muchas gracias de antemano.

Saludos.

2
Comentarios

¿Has visto esto https://github.com/tommcfarlin/WordPress-Plugin-Boilerplate

Brad Dalton Brad Dalton
24 feb 2014 01:55:38

@BradDalton: No, no lo había visto antes, sin embargo parece interesante. Le echaré un vistazo más tarde.

Greeso Greeso
24 feb 2014 07:14:29
Todas las respuestas a la pregunta 2
2
13

Estoy menos convencido de saber lo que estás haciendo que antes.

// Añadir menú y páginas al área de administración de WordPress
add_action('admin_menu', 'myplugin_create_top_level_menu');

function myplugin_create_top_level_menu() {

    // Este es el menú en la barra lateral
    add_menu_page(
      'MiPlugin', 
      'MiPlugin', 
      'manage_options', 
      'myplugin-top-level-page'
    );

    // Esta es la primera página que se muestra al hacer clic en el menú
    add_submenu_page(
      'myplugin-top-level-page', 
      'Página Principal de MiPlugin',
      'Página Principal de MiPlugin', 
      'manage_options', 
      'myplugin-top-level-page', 
      'myplugin_top_level_page_callback'
     );

     // Esta es la página oculta
     add_submenu_page(
      null, 
      'Página de Detalles de MiPlugin',
      'Página de Detalles de MiPlugin', 
      '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', // como se definió en la página oculta
                'id' => $id
            ),
            admin_url('admin.php')
        );

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

function myplugin_details_page_callback () {
    // Esta función es para mostrar la página oculta (html y php)
}

Estás utilizando dos funciones adicionales del Core, así que para referencia:

24 feb 2014 00:57:36
Comentarios

Gracias por tu respuesta. Sin embargo, necesito crear dos páginas separadas. Te daré un ejemplo. En el administrador de WordPress, si haces clic en ENTRADAS, verás una lista de entradas de tu sitio. Para cada entrada, puedes hacer clic en EDITAR para ver los detalles de esa entrada en particular. Los detalles de la entrada solo están vinculados a través de la lista de entradas. Además, el postID se pasa a esta página de edición para que pueda mostrar la entrada correcta. Estoy haciendo lo mismo pero para un plugin, como describí en mi pregunta.

Greeso Greeso
24 feb 2014 01:06:59

Tu solución no era 100% precisa, pero fue lo suficientemente cercana como para inspirarme a encontrar la solución correcta. Modificaré tu respuesta para reflejar la solución adecuada. Gracias.

Greeso Greeso
24 feb 2014 06:53:35
0

Es mejor agregar otro parámetro en la URL y llamarlo "action" y, según la acción, renderizar una plantilla diferente para cada acción.

Beneficio: Mantendrá el menú abierto (activo). En la solución anterior, no mantiene el menú abierto para un menú oculto ya que técnicamente estamos eliminando el padre de un submenú.

11 oct 2018 08:14:04