Bagaimana cara terbaik menangani tindakan halaman plugin khusus?

21

Saya terus-menerus mengalami gangguan yang sama, jadi saya pikir saya akan melihat apakah ada ide atau pengalaman di luar sana ...

Saya telah membuat plugin yang menggunakan halaman admin itu sendiri. Itu harus. Sekarang saya telah memilah-milah hal-hal WP_List_Table (), saya harus mengatakan itu bagus ... tapi ....

Halaman plugin khusus selalu dimuat seolah- admin.php?page=...olah saya tidak ingin memuatnya dari direktori plugin secara langsung, yang tidak saya lakukan. Sekarang jika saya melakukan 'tindakan' dari halaman itu, saya perlu memprosesnya dan kemudian mengarahkan kembali ke halaman tanpa parameter tindakan. Tidak masalah jika saya melakukan GET atau POST, sungguh.

Pada semua halaman internal WP melakukan ini pada halaman yang sama, memeriksa apakah ada tindakan, jika demikian memprosesnya dan kemudian mengalihkan ke dirinya sendiri tanpa tindakan. Ini dimungkinkan, karena pada halaman-halaman admin-headerini belum dimuat.

Jika Anda mencoba melakukannya di halaman Anda sendiri, setengah dari antarmuka admin telah dikirim ke browser, jadi pengalihan tidak mungkin lagi. Jelas, solusinya adalah POST / DAPATKAN langsung ke halaman lain, muat kerangka WP itu, lakukan pemrosesan dan kemudian arahkan kembali ke halaman asli ... tapi ... itu agak mengganggu, karena ... asli saya Halaman dimuat melalui callback, jadi itu berjalan dalam metode kelas saya. Itu indah.

Jika saya memuat halaman terpisah, saya harus secara manual memasukkan wp-load.phpdan berada di luar kelas saya, yang menjengkelkan, dan dalam kasus khusus saya mengganggu saya terutama, karena saya hanya instanciating kelas plugin saya secara anonim sehingga tidak ada yang dapat mengaksesnya dari luar.

Jadi setelah cerita panjang ini ... apakah ada yang datang dengan solusi yang baik untuk memuat halaman lain melalui panggilan balik tanpa seluruh antarmuka admin sudah diatur di sekitarnya?

(Saya tahu solusinya ... saya dapat mengaitkan fungsi ke dalam load-....yang memeriksa parameter tindakan dan melakukan pemrosesan dan redirect. Tapi saya ingin tahu apakah ada cara yang lebih baik.)

Terima kasih.

wyrfel
sumber
Mengapa ini ditandai [plugin-wp-pagenavi]? [plugin-development]tentu diterima di sini.
Jan Fabry
@ Jan Fabry: Tidak yakin untuk apa plugin-wp-pagenavi... saya berasumsi itu untuk hal-hal yang menyangkut korelasi antara plugin dan menu admin. Karena pertanyaan saya terkait dengan itu, saya memilih tag itu.
wyrfel
WP-PageNavi adalah plugin dengan navigasi paging yang lebih maju untuk front-end. Anda bisa menggunakannya di [admin-menu]sini, tapi saya rasa itu tidak ada hubungannya dengan itu. Saya mengubah tag sesuai keinginan saya, tentu saja Anda bisa mengeditnya lagi.
Jan Fabry
@ Jan Fabry: Terima kasih atas penandaan-ulangnya ... belum terlalu familiar dengan seluruh kelompok tag, (cukup jelas).
wyrfel

Jawaban:

28

Sebagai aturan praktis, Anda harus menggunakan permintaan POST untuk sebagian besar tindakan, untuk memastikan mereka tidak dieksekusi secara tidak sengaja . Tetapi ini juga merupakan praktik yang baik untuk mengalihkan ke halaman normal setelah permintaan POST, untuk mencegah eksekusi duplikat ketika pengguna me-refresh halaman.

Jadi alirannya seperti ini:

  1. Halaman plugin Anda dengan formulir POST, yang dikirimkan ke
  2. Halaman yang menangani permintaan, yang dialihkan ke
  3. Halaman plugin Anda, yang menunjukkan hasil tindakan

Halaman tengah tidak harus menjadi halaman plugin Anda. Ini berarti bahwa Anda dapat menggunakan "generik POST handler" yang disertakan tiga tahun lalu, yang 'admin_action_' . $_REQUEST['action']kait diadmin.php .

Contoh pengguna adalah plugin Akismet . Jika Anda ingin menggunakannya dengan andal, Anda harus mengirim admin.phplangsung , bukan ke halaman lain yang kebetulan disertakan admin.php.

Berikut ini adalah contoh yang sangat mendasar tentang bagaimana menggunakannya:

add_action( 'admin_action_wpse10500', 'wpse10500_admin_action' );
function wpse10500_admin_action()
{
    // Do your stuff here

    wp_redirect( $_SERVER['HTTP_REFERER'] );
    exit();
}

add_action( 'admin_menu', 'wpse10500_admin_menu' );
function wpse10500_admin_menu()
{
    add_management_page( 'WPSE 10500 Test page', 'WPSE 10500 Test page', 'administrator', 'wpse10500', 'wpse10500_do_page' );
}

function wpse10500_do_page()
{
?>
<form method="POST" action="<?php echo admin_url( 'admin.php' ); ?>">
    <input type="hidden" name="action" value="wpse10500" />
    <input type="submit" value="Do it!" />
</form>
<?php
}
Jan Fabry
sumber
Hei, saya akan melihat kode lagi, saya jelas tidak melihat itu, tetapi hanya untuk mengkonfirmasi ... jadi apa yang Anda katakan adalah bahwa jika saya memanggil admin.php langsung tanpa parameter halaman, ia akan melompati semua halaman memuat dan hanya melakukan inisialisasi dan menjalankan hook? Itu akan luar biasa ... ish (saya masih tidak mengerti mengapa mereka tidak memasang kait sebelum memuat halaman).
wyrfel
@wyrfel: Ya, menelepon admin.phplangsung adalah "trik" yang diajarkan oleh sumber Akismet kepada saya. Anda benar ketika Anda menampilkan formulir dan ingin menampilkannya lagi jika terjadi kesalahan: maka akan mudah jika tujuan adalah halaman plugin Anda tetapi kait di suatu tempat di awal (sehingga Anda bisa mengarahkan ulang jika berhasil, atau menampilkan formulir lagi dengan pesan kesalahan jika tidak). Mungkin menyarankannya di tiket Trac?
Jan Fabry
Saya akan mengajukan tiket. Sebagai solusinya, saya menemukan 'load-<pagehook>'kait untuk bekerja ... itu disebut sebelum halaman dimuat ... tetapi admin_action_...konsepnya tampak jauh lebih baik dan lebih spesifik. Juga, pada catatan, pesan kesalahan masih bermasalah jika Anda melakukan POST dan tidak ingin memposting ulang saat memuat ulang, tapi itu topik yang berbeda.
wyrfel
@wyrfel: Mengapa pesan kesalahan masih bermasalah? Jika ada pesan kesalahan, tetap di halaman dan tampilkan formulir lagi dengan pesan (tentu saja penyegaran tidak masuk akal di sini - tetapi juga tidak ada salahnya, karena kesalahan akan tetap ada dan tidak ada tindakan akan dieksekusi). Jika tidak ada kesalahan, jalankan tindakan dan arahkan ke halaman ikhtisar "aman". Ini akan berhasil - jika admin_action_kail akan dipindahkan sebelum pemuat laman plugin.
Jan Fabry
Ok ... saya berpikir terlalu rumit.
wyrfel
3

Saya mendekati ini sedikit berbeda dengan hanya menambahkan noheader = true ke url tindakan pada halaman tempat pengguna mengirimkan tindakan.

Pawang saya kemudian melakukan tindakan (mis. Biasanya tambah, perbarui atau hapus) kemudian selesai dengan wp_redirect () ke tindakan halaman berikutnya (mis. Tambahkan halaman -> edit halaman, hapus halaman -> halaman daftar, edit halaman -> edit halaman ). Saya juga menyampaikan pesan pada URL sehingga saya dapat menampilkan status seperti pembaruan berhasil atau gagal.

Pendekatan ini membuat semua tindakan: daftar, tambahkan, edit, hapus, hapus massal, dll di kelas yang sama dan dengan siput admin yang sama sehingga sangat mudah untuk mempertahankan dan memahami.

Russell Jamieson
sumber
Bung, kau jenius! Saya telah berjuang selama dua hari berturut-turut dan tampaknya yang saya butuhkan adalah bagian "noheader = true". Terima kasih!
r00m
0

Pendekatan lain yang berbeda adalah menambahkan bidang input tersembunyi ke formulir:

<input type="hidden" name="page" value="your-page-slug" />

Dengan cara ini, WordPress tampaknya menangani pengalihan secara otomatis.

simonthesorcerer
sumber