¿Cómo crear y enlazar a una página de administración para un plugin?

30 nov 2010, 12:42:38
Vistas: 13.5K
Votos: 8

OK Código Completo:

<?php

//comprobar si el usuario es un administrador o no.
if (is_admin()) {


function wpsc_display_products_seo(){
global $wpdb;
$productList = $wpdb->get_results("SELECT * FROM " . WPSC_TABLE_PRODUCT_LIST . " ORDER BY name ASC");
echo  get_admin_page_parent(); 

$path = 'admin.php?page=wpsc_product_seo_details';
$url = admin_url($path);


?>
<h2><?php _e('Lista de Productos','wpsc'); ?></h2>
<p>A continuación se muestra una lista de productos. Seleccione un producto para editar sus propiedades SEO.</p>
    <table>
        <tr>
            <td></td>
            <td>Nombre del Producto</td>
            <td>Título Meta</td>
            <td>Descripción Meta</td>
            <td>Editar</td>
        </tr>
    </table>

    <table>
        <?php if($productList) : ?>
            <?php foreach($productList as $product) : ?>
                <?php $meta = getProductMeta($product->id); ?>
                <tr style="background:#fff;">
                    <td width="200"><?php echo $product->name; ?></td>
                    <td width="300"><?php getVal($meta, 'meta_title'); ?></td>
                    <td width="200"><?php getVal($meta, 'meta_description'); ?></td>
                    <td width="200"><?php getVal($meta, 'meta_keywords'); ?></td>
                    <td width="200"><a href="<?php echo $url; ?>">Editar</a></td>
                </tr>
            <?php endforeach; ?>
        <?php endif; ?>
    </table>

<?php

}

function wpsc_product_seo_details()
{
    echo "<h2>Hola</h2>";
}

function getProductMeta($id)
{
    global $wpdb;
    $meta = $wpdb->get_results("SELECT * FROM " . WPSC_TABLE_PRODUCT_META . " WHERE product_id = $id");
    if($meta)
    {
        return $meta;
    } else {
        return null;
    }
}

function getVal($RS, $key)
{
    if($RS)
    {
        if (property_exists($RS, $key))
        {
            return $RS->$key;
        } 
    }
    return null;

}




    function wpsc_add_seo_admin_pages($page_hooks, $base_page) {
        $page_hooks[] =  add_submenu_page($base_page, __('SEO Para Productos','wpsc'),  __('SEO Para Productos','wpsc'), 7, 'wpsc-module-seo', 'wpsc_display_products_seo');
        return $page_hooks;
    }
    add_filter('wpsc_additional_pages', 'wpsc_add_seo_admin_pages',10, 2);
}

?>

PUBLICACIÓN ANTERIOR

Hola chicos,

Actualmente estoy escribiendo un plugin para mi cliente en WordPress. El problema que tengo es que cuando un usuario hace clic en editar para cambiar un registro, no estoy seguro de cómo crear el enlace de administración para hacer esto.

es decir,

<a href="<?php echo get_bloginfo('url'); ?>/wp-admin/admin.php?page=wpsc_product_seo_details">Editar</a>


function wpsc_product_seo_details()
{
    echo "<h2>Hola</h2>";
}

Sé que mi marcado para la etiqueta probablemente esté mal, pero solo estaba probando. ¿Necesito registrar un hook para hacer esto?

6
Comentarios

Rarst, copiaste parte del marcado de la página cuando ajustaste la pregunta, solo te lo comento.. ;)

t31os t31os
30 nov 2010 13:03:22

No fui yo. Así era la pregunta original. Solo intenté aclarar el título (lo que parece que requerirá un segundo intento).

Rarst Rarst
30 nov 2010 13:10:27

Por el prefijo de la función, parece algo construido sobre el plugin WP e-Commerce?..

Rarst Rarst
30 nov 2010 13:29:11

@Steve: ¿Tu problema es que no sabes cuándo/cómo llamar a wpsc_product_seo_details()? ¿Lo agregaste a tu menú de alguna manera?

Jan Fabry Jan Fabry
30 nov 2010 13:30:46

Ok, lo resolví. Simplemente usé la misma URL y agregué una condición a la función que se llama desde el menú. Gracias por toda tu ayuda.

User User
30 nov 2010 13:46:18

Ok, viendo tu solución ahora estoy completamente perdido. :) ¿Podrías por favor renombrar tu pregunta para describir con precisión el problema y el contexto? Así otros podrán beneficiarse de esto en el futuro.

Rarst Rarst
30 nov 2010 13:49:24
Mostrar los 1 comentarios restantes
Todas las respuestas a la pregunta 4
3

No estoy seguro de lo que estás intentando hacer.

Los enlaces de administración se pueden crear convenientemente con la función admin_url(), así:

$path = 'admin.php?page=wpsc_product_seo_details';
$url = admin_url($path);
$link = "<a href='{$url}'>Editar</a>";
echo $link;

¿Con qué exactamente tienes problemas?

30 nov 2010 12:54:31
Comentarios

Cuando hago clic en el enlace, aparece: No tienes permisos suficientes para acceder a esta página.

User User
30 nov 2010 12:57:37

Lo siento, probablemente no lo estoy explicando muy bien. Tengo un elemento de submenú que, al hacer clic, muestra una lista de productos. Tengo un botón de edición junto a cada producto y cuando el administrador hace clic en ese botón, va a la URL mencionada anteriormente y llama a la función relevante (para poder hacer un formulario de edición de producto, etc.)

User User
30 nov 2010 13:01:33

¿Los productos son qué técnicamente, tipos de entrada personalizados? ¿Cuál es exactamente el enlace de edición? Todavía no estoy seguro, pero echa un vistazo a edit_post_link() que genera enlaces de edición para entradas individuales.

Rarst Rarst
30 nov 2010 13:06:24
1

¿Tienes problemas creando la página de administración?

add_action( 'admin_menu', 'wpse4677_admin_menu' );
function wpse4677_admin_menu()
{
    add_options_page(
        'Título de página WPSE 4677', // Título de la página
        'Título del elemento de menú WPSE 4677', // Título del menú
        'manage_options', // Capacidad mínima para ver esta página
        'wpse4677-page-identifier', // Identificador único
        'wpse4677_page_content' // Función de callback para obtener los contenidos
    );
}

function wpse4677_page_content()
{
    echo '<div class="wrap">';
    echo '<h2>¡Bienvenido a mi página!</h2>';
    echo '</div>';
}
30 nov 2010 12:57:45
Comentarios

¡He actualizado el bloque de código en mi publicación original! - Espero que esto ayude, estoy seguro de que vas a decir "WTF"

User User
30 nov 2010 13:13:59
6

Algo de información para agregar a la discusión, y esto puede ser útil más adelante...

Cuando estás en la página de un plugin, varias variables del administrador están configuradas, puedes construir una URL base a partir de esas variables y generar enlaces desde allí, asumiendo que quieres que apunten a la página actual del plugin...

global $pagenow, $plugin_page;
$this_page = add_query_arg( 'page', $plugin_page, admin_url( $pagenow ) );
/* 
   Ejemplo de URL
   themes.php?page=custom-background 

   $pagenow     - themes.php
   $plugin_page - custom-background

*/

Si deseas agregar tus propias variables de consulta a esa URL, simplemente agrégalas a la variable creada anteriormente usando add_query_arg...

$edit_link = add_query_arg( 'edit_id', $id, $this_page );
/*
   Solo un ejemplo, $id debería venir de tu código
   y $edit_link generado apropiadamente para cada resultado que muestres
*/

Debería funcionar en teoría al menos, no probé el código, pero no veo razón por la que no funcionaría... :)

30 nov 2010 16:54:45
Comentarios

Quiero señalar que el retorno de la función add page no funcionará. No es el nombre de la página, es un identificador de pantalla más complejo que va en la variable global $hook_suffix. También puedes pasar un array asociativo como primer argumento a add_query_arg() en lugar de llamar varias veces.

Rarst Rarst
5 jul 2011 19:48:53

No estoy seguro de seguir a Rarst, ¿qué es exactamente lo que no funcionará? Si el código no hace lo que se pretendía, entonces eliminaré la respuesta (el código que no funciona sirve de poco).

t31os t31os
6 jul 2011 13:05:52

Me refería a esta parte $my_hook = add_xxxx_page en los comentarios del código, $my_hook no funcionará como reemplazo de $plugin_page porque son cosas diferentes. El código en sí es sólido y funciona.

Rarst Rarst
6 jul 2011 13:39:08

Nunca sugerí que fuera un reemplazo, solo que podrías referirte a $my_hook en lugar de esa variable, porque usualmente contienen el mismo valor. No estoy seguro de cómo difieren, revisa cómo se llena $plugin_page (wp-admin/admin.php), luego mira cómo se crea ese valor de menú.

t31os t31os
6 jul 2011 14:24:38

Lo siento, no entiendo. ¿Estás sugiriendo que son iguales o no? ¿Qué significa referirse en lugar de la variable? El retorno de add_*_page() es $page_type . '_page_' . $plugin_name, no veo cómo eso puede terminar siendo igual a $plugin_page.

Rarst Rarst
6 jul 2011 15:54:12

Sí, tienes razón, lo siento, madrugada, el cerebro no había arrancado del todo... jeje... olvida mis comentarios anteriores.. ;) Eliminaré esa parte de la respuesta.

t31os t31os
6 jul 2011 16:26:07
Mostrar los 1 comentarios restantes
1

¡Resuelto!

Intenté complicar demasiado las cosas cuando un simple condicional hubiera sido suficiente en la función principal llamada desde la página.

function wpsc_display_products_seo(){

    if($_GET['pid'] != "") 
    {
        renderProductForm();
    } else {
        renderProductList();
    }

}
30 nov 2010 13:47:24
Comentarios

¿por qué no publicaste todo el código?

Francisco Corrales Morales Francisco Corrales Morales
6 feb 2014 17:44:54