Attivare un'azione personalizzata quando si preme il pulsante delle impostazioni
Questo è il mio primo plugin WordPress e sto incontrando molte difficoltà nel farlo funzionare. Funziona quasi bene ma non riesco a trovare un modo per realizzare questa cosa specifica.
In pratica ho la mia pagina di impostazioni personalizzata per il mio plugin, salva tutto senza problemi, ma la domanda è: come posso far sì che l'altro pulsante (all'interno della stessa pagina delle impostazioni) attivi, in questo caso, un'azione di sincronizzazione.
Perché il mio plugin dopo essere stato configurato attiva un'altra azione che crea/aggiorna i record in una tabella, ma la prima volta ho bisogno di eseguire una sincronizzazione per creare/aggiornare i record dai vecchi post di WordPress.
Modifica:
Codice sorgente del plugin su wsd-parse-api.

Hai bisogno di un secondo form
con admin_url('admin-post.php')
come azione del form. Poi puoi agganciarti a admin_post_custom_action
per eseguire la tua azione.
Codice di esempio:
add_action( 'admin_post_wpse_79898', 'wpse_79898_test' );
function wpse_79898_test() {
if ( isset ( $_GET['test'] ) )
echo esc_html( $_GET['test'] );
die( __FUNCTION__ );
}
Nella tua pagina delle impostazioni:
<form action="<?php echo admin_url( 'admin-post.php' ); ?>">
<input type="hidden" name="action" value="wpse_79898">
<input type="text" name="test" value="">
<?php submit_button( 'Invia' ); ?>
</form>
Aggiornamento
Ecco un esempio piuttosto esteso. Mostra:
- azioni di sicurezza di base (nonce, escaping),
- come registrare e utilizzare il callback,
- come reindirizzare alla pagina originale, funziona anche per plugin attivati in rete,
- come mostrare un messaggio personalizzato basato su una lista bianca di valori consentiti.
L'esempio che ho usato qui – aggiornare un'opzione – non dovrebbe essere usato per plugin attivati solo per un sito. Per i plugin attivati in rete però è piuttosto utile, perché non c'è un'API delle opzioni per quelli.
Dovrei aggiungere commenti, ma sono troppo pigro. :) Scriverò un post sul blog su questo e aggiornerò la risposta più tardi con un link.
<?php
/* Plugin Name: demo admin-post */
add_action( 'wp_loaded', array ( WPSE_79898_Admin_Post_Demo::get_instance(), 'register' ) );
class WPSE_79898_Admin_Post_Demo
{
/**
* Istanza del plugin.
*
* @see get_instance()
* @type object
*/
protected static $instance = NULL;
protected $action = 'wpse_79898';
protected $option_name = 'wpse_79898';
protected $page_id = NULL;
/**
* Accedi all'istanza di lavoro di questo plugin
*
* @wp-hook wp_loaded
* @return oggetto di questa classe
*/
public static function get_instance()
{
NULL === self::$instance and self::$instance = new self;
return self::$instance;
}
public function register()
{
add_action( 'admin_menu', array ( $this, 'add_menu' ) );
add_action( "admin_post_$this->action", array ( $this, 'admin_post' ) );
}
public function add_menu()
{
$page_id = add_options_page(
'Demo Admin Post',
'Demo Admin Post',
'manage_options',
'admin-post-demo',
array ( $this, 'render_options_page' )
);
add_action( "load-$page_id", array ( $this, 'parse_message' ) );
}
public function parse_message()
{
if ( ! isset ( $_GET['msg'] ) )
return;
$text = FALSE;
if ( 'updated' === $_GET['msg'] )
$this->msg_text = 'Aggiornato!';
if ( 'deleted' === $_GET['msg'] )
$this->msg_text = 'Eliminato!';
if ( $this->msg_text )
add_action( 'admin_notices', array ( $this, 'render_msg' ) );
}
public function render_msg()
{
echo '<div class="' . esc_attr( $_GET['msg'] ) . '"><p>'
. $this->msg_text . '</p></div>';
}
public function render_options_page()
{
$option = esc_attr( stripslashes( get_option( $this->option_name ) ) );
$redirect = urlencode( remove_query_arg( 'msg', $_SERVER['REQUEST_URI'] ) );
$redirect = urlencode( $_SERVER['REQUEST_URI'] );
?><h1><?php echo $GLOBALS['title']; ?></h1>
<form action="<?php echo admin_url( 'admin-post.php' ); ?>" method="POST">
<input type="hidden" name="action" value="<?php echo $this->action; ?>">
<?php wp_nonce_field( $this->action, $this->option_name . '_nonce', FALSE ); ?>
<input type="hidden" name="_wp_http_referer" value="<?php echo $redirect; ?>">
<label for="<?php echo $this->option_name; ?>">Inserisci del testo:</label>
<input type="text" name="<?php echo $this->option_name;
?>" id="<?php echo $this->option_name;
?>" value="<?php echo $option; ?>">
<?php submit_button( 'Invia' ); ?>
</form>
<?php
}
public function admin_post()
{
if ( ! wp_verify_nonce( $_POST[ $this->option_name . '_nonce' ], $this->action ) )
die( 'Nonce non valido.' . var_export( $_POST, true ) );
if ( isset ( $_POST[ $this->option_name ] ) )
{
update_option( $this->option_name, $_POST[ $this->option_name ] );
$msg = 'updated';
}
else
{
delete_option( $this->option_name );
$msg = 'deleted';
}
if ( ! isset ( $_POST['_wp_http_referer'] ) )
die( 'Manca il target.' );
$url = add_query_arg( 'msg', $msg, urldecode( $_POST['_wp_http_referer'] ) );
wp_safe_redirect( $url );
exit;
}
}

add_action
dovrebbe ricevere una funzione che accetta un argomento di default. La tua non ne accetta nessuno. WordPress passa un argomento alla tua funzione che stai ignorando? Quale argomento sta passando?
