Memicu tindakan khusus saat tombol pengaturan ditekan

8

Ini adalah plugin wordpress pertama saya dan saya menjalankan banyak masalah untuk membuatnya bekerja, itu hampir berfungsi dengan baik tetapi saya tidak menemukan cara untuk mencapai hal spesifik ini.

Pada dasarnya saya memiliki halaman pengaturan kustom saya untuk plugin saya, itu menyimpan semua tanpa masalah sama sekali, tetapi pertanyaannya adalah, bagaimana saya bisa tombol saya yang lain (di dalam halaman pengaturan yang sama) untuk memicu, dalam hal ini, tindakan sinkronisasi .

Karena plugin saya setelah dikonfigurasi itu memicu tindakan lain yang membuat / memperbarui catatan di atas meja, tetapi pertama kali saya perlu menjalankan sinkronisasi untuk membuat / memperbarui catatan dari posting lama wordpress.

Edit:

Kode sumber plugin pada wsd-parse-api .

norman784
sumber
Bisakah Anda memposting kode Anda?
s_ha_dum
tidak benar-benar diperlukan, karena sekarang sedikit rumit (dipisahkan dalam banyak file, dll). Tetapi jawaban toscho tepat seperti yang saya inginkan. Salam
norman784
menambahkan repo github dari plugin!
norman784
Wow, betapa berharganya waktu manusia ketika orang menjelek-jelekkan omong kosong semacam ini? Pertanyaan ini tidak masuk akal.
Jim Maguire

Jawaban:

14

Anda perlu yang kedua formdengan admin_url('admin-post.php')sebagai tindakan formulir. Kemudian Anda dapat terhubung ke admin_post_custom_actionuntuk melakukan tindakan Anda.

Kode sampel:

add_action( 'admin_post_wpse_79898', 'wpse_79898_test' );

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

    die( __FUNCTION__ );
}

Di halaman pengaturan Anda:

<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>

Memperbarui

Ini adalah contoh yang agak panjang. Itu menunjukkan:

  • tindakan keamanan dasar (nonces, melarikan diri),
  • cara mendaftar dan menggunakan panggilan balik,
  • cara mengarahkan kembali ke halaman asli, ini berfungsi bahkan untuk plugin yang diaktifkan jaringan,
  • cara menampilkan pesan khusus berdasarkan daftar putih nilai yang diizinkan.

Contoh yang saya gunakan di sini - memperbarui opsi - tidak boleh digunakan untuk plugin yang diaktifkan untuk situs saja. Untuk plugin yang diaktifkan jaringan meskipun ini cukup berguna, karena tidak ada opsi API untuk itu.

Saya harus menambahkan komentar, tetapi saya terlalu malas. :) Saya akan menulis posting blog tentang ini, dan memperbarui jawabannya nanti dengan tautan.

<?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;
    }
}
fuxia
sumber
1
berfungsi, sekarang bagaimana saya mengarahkan kembali ke halaman pengaturan yang sama dan ada fungsi untuk menampilkan pesan flash seperti yang ditampilkan setelah simpan ...
norman784
1
@ norman784 Lihat pembaruan saya.
fuxia
1
bagus, sekarang saya perlu menulis ulang plugin saya! xD dan gunakan OOP. Terima kasih
norman784