Attivare un'azione personalizzata quando si preme il pulsante delle impostazioni

9 gen 2013, 20:21:39
Visualizzazioni: 39.7K
Voti: 11

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.

3
Commenti

Puoi postare il tuo codice per favore?

s_ha_dum s_ha_dum
9 gen 2013 21:09:17

Non è davvero necessario, perché è un po' complesso ora (separato in molti file, ecc). Ma la risposta di toscho era esattamente quello che volevo. Saluti

norman784 norman784
9 gen 2013 21:13:46

ho aggiunto il repository github del plugin!

norman784 norman784
9 gen 2013 21:52:32
Tutte le risposte alla domanda 1
5
19

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;
    }
}
9 gen 2013 20:29:32
Commenti

ottimo, ora devo riscrivere il mio plugin! xD e usare OOP. Grazie

norman784 norman784
9 gen 2013 23:28:26

Sono pronto per il post del blog.

lmat - Reinstate Monica lmat - Reinstate Monica
9 giu 2020 01:07:44

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?

lmat - Reinstate Monica lmat - Reinstate Monica
9 giu 2020 01:19:20

@LimitedAtonementNon esiste alcun requisito relativo agli argomenti.

fuxia fuxia
9 giu 2020 07:08:27

Risposta molto utile. Grazie!

AidanCurran AidanCurran
7 mag 2021 00:53:22