¿Cómo crear y enlazar a una página de administración para un plugin?
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?

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?

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

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.)

¿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.

¿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>';
}

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... :)

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.

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).

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.

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ú.

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
.

¡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();
}
}
