Attiva un'azione personalizzata quando si preme il pulsante di impostazione


8

Questo è il mio primo plugin per wordpress e ho molti problemi a farlo funzionare, quasi funziona bene ma non trovo il modo di realizzare questa cosa specifica.

Fondamentalmente ho la mia pagina di impostazioni personalizzate per il mio plugin, salva tutto senza alcun problema, ma la domanda è: come posso fare con l'altro mio pulsante (all'interno della stessa pagina di impostazione) per attivare, in questo caso, un'azione di sincronizzazione .

Poiché il mio plug-in dopo la configurazione ha innescato un'altra azione che crea / aggiorna i record su una tabella, ma la prima volta che devo eseguire una sincronizzazione per creare / aggiornare i record dai vecchi post del wordpress.

Modificare:

Codice sorgente del plugin su wsd-parse-api .


Puoi pubblicare il tuo codice per favore?
s_ha_dum,

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

aggiunto repository github del plugin!
Norman784

Wow, quanto è inutile il tempo umano quando le persone votano questo tipo di incomprensioni? Questa domanda ha senso zero.
Jim Maguire,

Risposte:


14

È necessario un secondo formcon admin_url('admin-post.php')come azione del modulo. Quindi puoi collegarti admin_post_custom_actionper 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( 'Send' ); ?>
</form>

Aggiornare

Ecco un esempio piuttosto esteso. Mostra:

  • azioni di sicurezza di base (nonces, escape),
  • come registrarsi e utilizzare il callback,
  • come reindirizzare alla pagina originale, funziona anche con plugin attivati ​​dalla rete,
  • come mostrare un messaggio personalizzato basato su una lista bianca di valori consentiti.

L'esempio che ho usato qui - l'aggiornamento di un'opzione - non dovrebbe essere usato solo per plugin attivati ​​sul posto. Per i plug-in attivati ​​dalla rete, tuttavia, questo è abbastanza utile, perché non ci sono opzioni API per quelli.

Dovrei aggiungere commenti, ma sono troppo pigro. :) Scriverò un post sul blog su questo e aggiornerò la risposta in seguito con un link.

<?php
/* Plugin Name: admin-post demo */

add_action( 'wp_loaded', array ( WPSE_79898_Admin_Post_Demo::get_instance(), 'register' ) );

class WPSE_79898_Admin_Post_Demo
{
    /**
     * Plugin instance.
     *
     * @see get_instance()
     * @type object
     */
    protected static $instance = NULL;

    protected $action     = 'wpse_79898';
    protected $option_name     = 'wpse_79898';
    protected $page_id = NULL;

    /**
     * Access this plugin’s working instance
     *
     * @wp-hook wp_loaded
     * @return  object of this class
     */
    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(
            'Admin Post Demo',
            'Admin Post Demo',
            '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 = 'Updated!';

        if ( 'deleted' === $_GET['msg'] )
            $this->msg_text = 'Deleted!';

        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; ?>">Enter some text:</label>
            <input type="text" name="<?php echo $this->option_name;
                ?>" id="<?php echo $this->option_name;
                ?>" value="<?php echo $option; ?>">
            <?php submit_button( 'Send' ); ?>
        </form>
        <?php
    }

    public function admin_post()
    {
        if ( ! wp_verify_nonce( $_POST[ $this->option_name . '_nonce' ], $this->action ) )
            die( 'Invalid nonce.' . 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( 'Missing target.' );

        $url = add_query_arg( 'msg', $msg, urldecode( $_POST['_wp_http_referer'] ) );

        wp_safe_redirect( $url );
        exit;
    }
}

1
funziona, ora come lo reindirizzo alla stessa pagina di impostazione e c'è una funzione per visualizzare un messaggio flash proprio come quello che mostra dopo il salvataggio ...
Norman784

1
@ norman784 Vedi il mio aggiornamento.
fuxia

1
bello, ora ho bisogno di riscrivere il mio plugin! xD e usa OOP. Grazie
norman784
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.