Hành động tùy chỉnh kích hoạt khi nhấn nút cài đặt


8

Đây là plugin wordpress đầu tiên của tôi và tôi đang gặp nhiều rắc rối khiến nó hoạt động, nó gần như hoạt động tốt nhưng tôi không tìm ra cách nào để thực hiện điều cụ thể này.

Về cơ bản tôi đã có trang cài đặt tùy chỉnh cho plugin của mình, nó lưu tất cả mà không gặp rắc rối nào, nhưng câu hỏi là, làm thế nào tôi có thể nút khác của tôi (trong cùng một trang cài đặt) để kích hoạt, trong trường hợp này, một hành động đồng bộ hóa .

Bởi vì plugin của tôi sau khi được định cấu hình, nó kích hoạt một hành động khác tạo / cập nhật các bản ghi trên bảng, nhưng lần đầu tiên tôi cần chạy đồng bộ hóa để tạo / cập nhật các bản ghi từ các bài đăng cũ của wordpress.

Biên tập:

Plugin mã nguồn trên wsd-parse-api .


Bạn có thể gửi mã của bạn xin vui lòng?
s_ha_dum

không thực sự cần thiết, bởi vì bây giờ nó hơi phức tạp (được phân tách trong nhiều tệp, v.v.). Nhưng câu trả lời toscho là chính xác mà tôi muốn. Trân trọng
Norman784

thêm github repo của plugin!
Norman784

Wow, thời gian của con người là vô giá trị như thế nào khi con người nâng cao loại vô nghĩa này? Câu hỏi này không có ý nghĩa.
Jim Maguire

Câu trả lời:


14

Bạn cần một giây formvới admin_url('admin-post.php')hành động như hình thức. Sau đó, bạn có thể móc vào admin_post_custom_actionđể thực hiện hành động của bạn.

Mã mẫu:

add_action( 'admin_post_wpse_79898', 'wpse_79898_test' );

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

    die( __FUNCTION__ );
}

Trong trang cài đặt của bạn:

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

Cập nhật

Đây là một ví dụ khá mở rộng. Nó cho thấy:

  • hành động bảo mật cơ bản (nonces, thoát),
  • Làm thế nào để đăng ký và sử dụng gọi lại,
  • Cách chuyển hướng trở lại trang gốc, cách này hoạt động ngay cả đối với các plugin được kích hoạt mạng,
  • cách hiển thị thông báo tùy chỉnh dựa trên danh sách trắng các giá trị được phép.

Ví dụ tôi đã sử dụng ở đây - cập nhật một tùy chọn - không nên được sử dụng cho các plugin được kích hoạt chỉ trên trang web. Đối với các plugin được kích hoạt mạng mặc dù điều này khá hữu ích, vì không có API tùy chọn nào cho các plugin đó.

Tôi nên thêm ý kiến, nhưng tôi quá lười biếng. :) Tôi sẽ viết một bài đăng trên blog về điều này, và cập nhật câu trả lời sau với một liên kết.

<?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
nó hoạt động, bây giờ làm thế nào tôi chuyển hướng nó trở lại cùng một trang cài đặt và có một chức năng hiển thị một thông báo flash giống như thông báo hiển thị sau khi lưu ...
Norman784

1
@ Norman784 Xem cập nhật của tôi.
fuxia

1
thật tuyệt, bây giờ tôi cần viết lại plugin của mình! xD và sử dụng OOP. Cảm ơn
Norman784
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.