$ _POST yêu cầu biểu mẫu với bài đăng của quản trị viên


10

Tôi đã thử sử dụng một biểu mẫu với đánh dấu sau bằng hành động admin-post.php

<form method='post' action='admin-post.php'>

Tôi đang sử dụng hook hành động được Wordpress đề xuất để tiến hành các tham số $ _POST và nó hoạt động tốt. Tuy nhiên sau khi thực hiện, tôi nhận được một trang trống và không chuyển hướng trở lại trang bổ trợ. Tất nhiên tôi có thể đặt chuyển hướng tùy chỉnh với người giới thiệu, nhưng đó có phải là hành vi bình thường không?

Cách giải quyết là sử dụng action=""và nhận yêu cầu trong mã plugin thông thường của tôi.


3
Nếu bạn sử dụng admin-post.phpadmin_posthành động, bạn cần chuyển hướng trở lại trang plugin của mình.
cybmeta

Thông tin đó nên được thêm vào codex. Tôi không chắc về điều này.
Rubberducker 5/2/2015

1
Nếu bạn gửi biểu mẫu đến admin-post.php, admin.post.php là nơi người dùng đến. Chỉ cần xem nội dung của tệp đó để biết rằng nó không in bất cứ thứ gì, chỉ cần kiểm tra cookie xác thực và chạy các chức năng được nối đến admin_inittrước và admin_postsau.
cybmeta

1
wp_redirectkhông hoạt động khi đăng mẫu với admin-post. Nó sẽ đưa ra lỗi rằng các tiêu đề đã được gửi, vì vậy đây dường như là một phương pháp vô giá trị để đăng một biểu mẫu và cố gắng chuyển hướng ở đâu đó sau đó.
Solomon Closson

Câu trả lời:


19

Có thể hơi muộn nhưng tôi đã vấp phải điều này khi tôi gặp vấn đề khi tìm ra nó nên nghĩ rằng tôi sẽ cung cấp những gì tôi tìm ra cho những người tương lai.

Tôi đã tìm thấy các nguyên tắc cơ bản là có một đầu vào ẩn được đặt tên actionvà giá trị của nó là một định danh bộ tùy chỉnh. Ví dụ

<input name='action' type="hidden" value='custom_form_submit'>

Với đầu vào này, và hành động biểu mẫu của bạn trỏ đến admin-post.phpmột hành động có thể được đặt. Chúng tôi thiết lập hành động này bằng cách sử dụng admin_post_custom_form_submit.

Để làm cho mọi thứ phức tạp hơn, chúng ta có thể sử dụng một wp_nonce_fieldthứ mà tôi nghĩ là một thứ bảo mật cơ bản. Về cơ bản, nó thêm một giá trị $ _POST ngẫu nhiên. Đủ công bằng.

Tiếp theo, chúng tôi muốn thiết lập hành động của mình như vậy:

add_action('admin_post_custom_form_submit','our_custom_form_function');

Vì vậy, khi có một biểu mẫu được gửi đến admin-post.phpvà có một giá trị hành động của custom_form_submithàm our_custom_form_functionsẽ được gọi! : D

function our_custom_form_function(){
    //print_r($_POST);
    //you can access $_POST, $GET and $_REQUEST values here. 
    wp_redirect(admin_url('admin.php?page=your_custom_page_where_form_is'));
   //apparently when finished, die(); is required. 
}

Bây giờ bạn nói bạn nhận được một trang trắng. Điều này là do chúng ta cần chuyển hướng trở lại hình thức của chúng tôi. Tôi đã sử dụng một đơn giảnwp_redirect()

Hy vọng điều này đã có ích :) Tôi sẽ cố gắng tìm ra cách tôi có thể thực hiện một số xác nhận và đưa lỗi trở lại biểu mẫu chuyển hướng của chúng tôi. Tôi nghĩ ý tưởng đơn giản nhất là tạo ra một $_GETgiá trị và thấy rằng trên trang của chúng tôi nhưng nó không tuyệt vời phải không?

Tôi cũng thấy rằng một khi đã gửi $_POSTsẽ bị xóa !! DX Điều này có lẽ là để làm với chuyển hướng. Tôi sẽ có một google và xem những gì tôi có thể tìm thấy: d

Hy vọng điều này đã giúp :)

CẬP NHẬT

Tôi đã thực hiện thêm một số công việc và nhận ra cách thực sự duy nhất để trả về các giá trị là sử dụng biến $ _GET. Bằng cách này bạn có thể nhập lại bất kỳ giá trị bài. Chỉ cần đừng quên sử dụng urlencode()để đảm bảo rằng các ký tự đặc biệt như '@', v.v.

Tôi đã có nhiều hơn một trang với những gì tôi đang làm việc vì vậy tôi đã thực hiện 2 chuyển hướng khác nhau đến các trang khác nhau và bao gồm các lỗi, v.v. Việc kiểm tra cho họ trên mẫu của tôi.

Một chức năng tiện dụng khác. http_build_request()có thể biến mảng thành mảng 'url an toàn' để bạn có thể gửi chúng qua các yêu cầu $ _GET, v.v.


Hi bro cảm ơn điều này đang làm việc cho tôi ..! Nhưng có một vấn đề là ở đó, làm thế nào tôi có thể đặt lỗi thành admin.php?page=your_custom_page_where_form_is tôi đã sử dụng add_settings_error()cho lỗi hiển thị nhưng nó không hiển thị bất kỳ lỗi nào vì trang đang chuyển hướng ..! bạn có thể vui lòng giúp tôi về điều đó ..? cảm ơn
Bhasta Hirani

Xin chào @BhastaHirani Tôi không thực sự sử dụng wordpress nữa nhưng tôi đoán bạn sẽ cần phải xác thực trước khi gọi hàm wp_redirect và có một câu lệnh if để nói rằng xác thực của bạn đã được thông qua trước khi chuyển hướng. Hi vọng điêu nay co ich?
bashleigh

Sau khi gửi biểu mẫu, tôi muốn hiển thị thông báo thành công trong 'admin.php? page = your_custom_page_where_form_is' làm sao có thể?
Rijo

@Rijo đã thử tiếng vang?
bashleigh

Mỗi phương pháp có trường hợp sử dụng riêng của nó. Phương pháp này, chuyển dữ liệu trong URL thông qua $_GET. Điều này sẽ tốt cho một số thông tin cơ bản, như có thể hiển thị tên hoặc email của họ hoặc để chuyển một ?success=truelá cờ kích hoạt thông điệp thành công của bạn. Tuy nhiên, nó sẽ không hoạt động để trả về một lượng lớn dữ liệu từ việc gửi biểu mẫu, trường hợp sử dụng, họ gửi biểu mẫu và nó trả về dữ liệu từ API.
lội

4

Trước khi chuyển hướng, bạn có thể lưu bất kỳ lỗi xác thực và gửi giá trị tạm thời. Các giá trị này sẽ tồn tại sau khi chuyển hướng url.

Đây chính xác là cách WP core thực hiện nó cho API Cài đặt khi trả về lỗi.

Vì thế:

dữ liệu mẫu -validate

lưu trữ dữ liệu bài đăng tạm thời với set_transient ()

- lưu trữ bất kỳ lỗi nào thoáng qua

-chuyển đổi để hình thành đầu ra

-kiểm tra lỗi trong thoáng qua

Tải các giá trị bài vào các trường mẫu từ thoáng qua

Bạn có thể sử dụng một phiên hoặc API tùy chọn thay vì tạm thời.

Bây giờ, tôi đã thử nghiệm nhiều cách khác nhau để xử lý việc gửi biểu mẫu cả trên lối vào và trên quản trị viên. Tôi không chắc admin_post_ {action} hoàn toàn thuận tiện vì cần phải duy trì dữ liệu và lỗi trong quá trình chuyển hướng. Sử dụng hook init hoặc admin_init để kiểm tra việc gửi biểu mẫu có thể dễ dàng hơn. Bạn cũng có thể chỉ cần đăng biểu mẫu của bạn trở lại cùng một trang và xử lý việc gửi biểu mẫu trước khi biểu mẫu được hiển thị.


Lưu ý: set_transient()có độ dài tối đa là 172 ký tự. Đây là một tùy chọn hợp lý nếu bạn không hoặc không thể sử dụng các biến GET và nó không có nhiều dữ liệu. AFAIK, Wordpress không sử dụng phiên (theo mặc định) vì vậy đối với plugin, điều này có thể không phù hợp. API tùy chọn sẽ là một lựa chọn tồi tệ. - Tùy chọn cuối cùng nếu bạn cần nhấn API và trả lại một lượng lớn dữ liệu, là POST cho chính trang web / trang đó. - Điều admin-post.phpnày có giới hạn và có lẽ không phải là lựa chọn đúng đắn nếu bạn cần trả lại một lượng lớn dữ liệu.
lội

2

Câu trả lời ngắn gọn là bạn phải thực hiện tất cả công việc: lưu dữ liệu đầu vào của người dùng trong cơ sở dữ liệu, kiểm tra lỗi hoặc thành công và chuyển hướng bất cứ nơi nào bạn muốn khi kết thúc.

Nếu bạn muốn chuyển hướng đến biểu mẫu một lần nữa, bạn có thể sử dụng một trường được tạo bởi wp_nonce()bao gồm trong $_POSTmảng được gửi bởi biểu mẫu của bạn:$_POST['_wp_http_referer']

Cuối cùng, bạn có thể chuyển hướng và gửi thành công hoặc thông báo lỗi sử dụng wp_safe_redirect(), esc_url_raw()add_query_arg().

add_action( 'admin_post_my-action', 'my_save_form_function' );
add_action( 'admin_post_nopriv_my-action', 'my_save_form_function' );
function my_save_form_function() {
    if ( ! empty( $_POST['_wp_http_referer'] ) ) {
        $form_url = esc_url_raw( wp_unslash( $_POST['_wp_http_referer'] ) );
    } else {
        $form_url = home_url( '/' );
    }
    if ( isset( $_POST['name'] )
        && isset( $_POST['description'] )
        && isset( $_POST['my-nonce'] )
        && wp_verify_nonce(
            sanitize_text_field( wp_unslash( $_POST['my-nonce'] ) ),
            'my-action'
        )
        ) {

        // Save your form data...

        //All  works fine ?
        wp_safe_redirect(
            esc_url_raw(
                add_query_arg( 'my_status', 'success', $form_url )
            )
        );
        exit();
    } else {
        wp_safe_redirect(
            esc_url_raw(
                add_query_arg( 'my_status', 'error', $form_url )
            )
        );
        exit();
    }
}
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.