Come creare e collegare la pagina di amministrazione per un plugin?
OK Codice Completo:
<?php
//verifica se l'utente è un amministratore o meno
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 Prodotti','wpsc'); ?></h2>
<p>Di seguito è riportato un elenco di prodotti. Seleziona un prodotto per modificarne le proprietà SEO.</p>
<table>
<tr>
<td></td>
<td>Nome Prodotto</td>
<td>Meta Title</td>
<td>Meta Description</td>
<td>Modifica</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; ?>">Modifica</a></td>
</tr>
<?php endforeach; ?>
<?php endif; ?>
</table>
<?php
}
function wpsc_product_seo_details()
{
echo "<h2>Ciao</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 Per Prodotti','wpsc'), __('SEO Per Prodotti','wpsc'), 7, 'wpsc-module-seo', 'wpsc_display_products_seo');
return $page_hooks;
}
add_filter('wpsc_additional_pages', 'wpsc_add_seo_admin_pages',10, 2);
}
?>
POST PRECEDENTE
Ciao a tutti,
Attualmente sto scrivendo un plugin per il mio cliente in WordPress. Il problema che sto riscontrando è che quando un utente clicca su modifica per cambiare un record non sono sicuro di come creare il link di amministrazione per fare questo.
cioè:
<a href="<?php echo get_bloginfo('url'); ?>/wp-admin/admin.php?page=wpsc_product_seo_details">Modifica</a>
function wpsc_product_seo_details()
{
echo "<h2>Ciao</h2>";
}
So che il mio markup per il tag è probabilmente sbagliato ma stavo solo facendo dei test. Ho bisogno di registrare un hook per fare questo.

Non sono sicuro di cosa tu stia cercando di fare.
I link di amministrazione possono essere creati comodamente con la funzione admin_url()
, in questo modo:
$path = 'admin.php?page=wpsc_product_seo_details';
$url = admin_url($path);
$link = "<a href='{$url}'>Modifica</a>";
echo $link;
Con cosa esattamente hai problemi?

Quando clicco sul link, ottengo: Non hai i permessi sufficienti per accedere a questa pagina.

Scusami probabilmente non mi sto spiegando molto bene. Ho una voce del sottomenu che, quando la clicchi, mostra un elenco di prodotti. Accanto a ogni prodotto c'è un pulsante di modifica e quando l'amministratore clicca su quel pulsante va all'URL sopra e chiama la funzione rilevante (così posso fare un modulo di modifica prodotto ecc.)

I prodotti sono cosa tecnicamente, custom post types? Qual è esattamente il link di modifica? Non sono ancora sicuro, ma dai un'occhiata a edit_post_link()
che genera link di modifica per i singoli post.

Hai problemi creando la pagina di amministrazione?
add_action( 'admin_menu', 'wpse4677_admin_menu' );
function wpse4677_admin_menu()
{
add_options_page(
'Titolo pagina WPSE 4677', // Titolo della pagina
'Titolo voce menu WPSE 4677', // Titolo nel menu
'manage_options', // Capacità minima per visualizzare questa pagina
'wpse4677-page-identifier', // Identificativo univoco
'wpse4677_page_content' // Funzione callback per ottenere i contenuti
);
}
function wpse4677_page_content()
{
echo '<div class="wrap">';
echo '<h2>Benvenuto nella mia pagina!</h2>';
echo '</div>';
}

Alcune informazioni da aggiungere alla discussione, che potrebbero esserti utili in seguito...
Quando sei nella pagina di un plugin, vengono impostate diverse variabili di amministrazione. Puoi costruire un URL base da queste variabili e generare link da lì, assumendo che tu voglia che puntino alla pagina del plugin corrente.
global $pagenow, $plugin_page;
$this_page = add_query_arg( 'page', $plugin_page, admin_url( $pagenow ) );
/*
Esempio di URL
themes.php?page=custom-background
$pagenow - themes.php
$plugin_page - custom-background
*/
Se vuoi aggiungere i tuoi query var a quell'URL, aggiungili semplicemente alla variabile creata sopra usando add_query_arg
...
$edit_link = add_query_arg( 'edit_id', $id, $this_page );
/*
Solo un esempio, $id dovrebbe provenire dal tuo codice
e $edit_link generato appropriatamente per ogni risultato che visualizzi
*/
Dovrebbe funzionare almeno in teoria, non ho testato il codice, ma non vedo motivi per cui non dovrebbe funzionare.. :)

Voglio far notare che il valore restituito dalla funzione add page non funzionerà. Non è il nome della pagina, ma un identificatore di schermata più complesso che va nella variabile globale $hook_suffix
. Puoi anche passare un array associativo come primo argomento a add_query_arg()
invece di chiamarlo più volte.

Non sono sicuro di aver capito Rarst, cosa esattamente non funzionerà? Se il codice non fa ciò per cui era destinato, allora rimuoverò la risposta (il codice che non funziona serve a poco).

Mi riferivo a questa parte $my_hook = add_xxxx_page
nei commenti del codice, $my_hook
non funzionerà come sostituto di $plugin_page
perché sono cose diverse. Il codice in sé è corretto e funzionante.

Non ho mai suggerito che fosse una sostituzione, solo che potresti fare riferimento a $my_hook
al posto di quella variabile, perché di solito contengono lo stesso valore. Non sono sicuro di come siano diversi, dai un'occhiata a come viene riempito $plugin_page
(wp-admin/admin.php), poi guarda come viene creato quel valore del menu.

Scusa, non capisco. Stai suggerendo che sono uguali o no? Cosa significa fare riferimento al posto della variabile? Il ritorno di add_*_page()
è $page_type . '_page_' . $plugin_name
, non vedo come possa finire per essere uguale a $plugin_page
.
