Declanșează o acțiune personalizată când se apasă butonul de setări

9 ian. 2013, 20:21:39
Vizualizări: 39.7K
Voturi: 11

Acesta este primul meu plugin WordPress și întâmpin multe probleme în a-l face să funcționeze, funcționează aproape bine dar nu găsesc o modalitate de a realiza acest lucru specific.

În principiu, am pagina mea personalizată de setări pentru plugin, salvează totul fără probleme, dar întrebarea este cum pot face ca celălalt buton (din aceeași pagină de setări) să declanșeze, în acest caz, o acțiune de sincronizare.

Deoarece plugin-ul meu, după ce este configurat, declanșează o altă acțiune care creează/actualizează înregistrări într-un tabel, dar prima dată trebuie să rulez o sincronizare pentru a crea/actualiza înregistrările din postările vechi ale WordPress-ului.

Editare:

Codul sursă al plugin-ului pe wsd-parse-api.

3
Comentarii

Poți să postezi codul tău, te rog?

s_ha_dum s_ha_dum
9 ian. 2013 21:09:17

Nu este chiar necesar, pentru că e puțin complex acum (împărțit în mai multe fișiere, etc). Dar răspunsul lui toscho a fost exact ceea ce voiam. Salutări

norman784 norman784
9 ian. 2013 21:13:46

am adăugat repository-ul de github al plugin-ului!

norman784 norman784
9 ian. 2013 21:52:32
Toate răspunsurile la întrebare 1
5
19

Ai nevoie de un al doilea form cu admin_url('admin-post.php') ca acțiune a formularului. Apoi poți folosi hook-ul admin_post_custom_action pentru a executa acțiunea ta.

Cod exemplu:

add_action( 'admin_post_wpse_79898', 'wpse_79898_test' );

function wpse_79898_test() {
    if ( isset ( $_GET['test'] ) )
        echo esc_html( $_GET['test'] );

    die( __FUNCTION__ );
}

În pagina de setări:

<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( 'Trimite' ); ?>
</form>

Actualizare

Iată un exemplu mai extins. Acesta arată:

  • acțiuni de bază de securitate (nonces, escaping),
  • cum să înregistrezi și să folosești callback-ul,
  • cum să redirecționezi înapoi la pagina originală, funcționează chiar și pentru plugin-uri activate la nivel de rețea,
  • cum să afișezi un mesaj personalizat bazat pe o listă albă de valori permise.

Exemplul folosit aici – actualizarea unei opțiuni – nu ar trebui utilizat pentru plugin-uri activate doar pe un singur site. Pentru plugin-urile activate la nivel de rețea, acest lucru este destul de util, deoarece nu există o API de opțiuni pentru acestea.

Ar trebui să adaug comentarii, dar sunt prea leneș. :) Voi scrie un articol pe blog despre asta și voi actualiza răspunsul mai târziu cu 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
{
    /**
     * Instanța pluginului.
     *
     * @see get_instance()
     * @type object
     */
    protected static $instance = NULL;

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

    /**
     * Accesează instanța de lucru a acestui plugin
     *
     * @wp-hook wp_loaded
     * @return  object al acestei clase
     */
    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 = 'Actualizat!';

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

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

    public function admin_post()
    {
        if ( ! wp_verify_nonce( $_POST[ $this->option_name . '_nonce' ], $this->action ) )
            die( 'Nonce invalid.' . 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( 'Lipsește ținta.' );

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

        wp_safe_redirect( $url );
        exit;
    }
}
9 ian. 2013 20:29:32
Comentarii

super, acum trebuie să rescriu pluginul meu! xD și să folosesc OOP. Mulțumesc

norman784 norman784
9 ian. 2013 23:28:26

Sunt gata pentru postarea pe blog.

lmat - Reinstate Monica lmat - Reinstate Monica
9 iun. 2020 01:07:44

add_action ar trebui să primească o funcție care implicit acceptă un argument. Funcția ta nu acceptă niciun argument. WordPress trimite vreun argument funcției tale pe care îl ignori? Ce argument trimite?

lmat - Reinstate Monica lmat - Reinstate Monica
9 iun. 2020 01:19:20

@LimitedAtonementNu există nicio astfel de cerință în ceea ce privește argumentele.

fuxia fuxia
9 iun. 2020 07:08:27

Răspuns foarte util. Mulțumesc!

AidanCurran AidanCurran
7 mai 2021 00:53:22