Saya ingin menambahkan tindakan massal kustom ke jenis posting kustom. Saya menemukan filter bulk_actions-screenid
, yang menurut dokumentasinya , akan melakukan persis seperti yang saya inginkan . Namun, setelah sekitar dua jam debug, saya menemukan komentar berikut // This filter can currently only be used to remove actions.
pada baris 278 dari class-wp-list-table.php - hebat!
Saya pikir saya bisa meretasnya dengan menggunakan jQuery untuk menyuntikkan tindakan sebagai opsi
/**
* Hack to add a custom bulk action.
*/
public function admin_footer() {
if($_GET['post_type'] != self::POST_TYPE) return;
?>
<script type="text/javascript">
jQuery(document).ready(function() {
jQuery('<option>').val('create_invoice').text('Bill').appendTo("select[name='action']");
});
</script>
<?php
}
Ini bekerja. Tindakan sekarang muncul di menu tindakan massal. Saya berada di bawah asumsi saya kemudian dapat menambahkan beberapa logika admin_init
untuk melakukan pemrosesan yang diperlukan - namun, tampaknya create_invoice
tidak pernah diposting. Apakah ada yang salah yang saya lakukan?
=== UPDATE ===
Saya memperbarui kode untuk menggunakan load-*
kail. Ketika saya menerapkan tindakan massal pada users.php - saya lihat create_invoice
diteruskan melalui permintaan. Namun, pada edit.php create_invoice
tidak pernah dicetak.
function a39x2_admin_footer() {
?>
<script type="text/javascript">
jQuery(document).ready(function() {
jQuery('<option>').val('create_invoice').text('Bill').appendTo("select[name='action']");
jQuery('<option>').val('create_invoice').text('Bill').appendTo("select[name='action2']");
});
</script>
<?php
}
add_action('admin_footer', 'a39x2_admin_footer');
function a39x2_load() {
echo "<pre>" . print_r($_REQUEST, true) . "</pre>";
}
add_action('load-edit.php', 'a39x2_load');
add_action('load-users.php', 'a39x2_load');
sumber
Jawaban:
Saya pikir rilis utama terbaru menjamin jawaban baru untuk pertanyaan ini, mengingat popularitas pertanyaan ini.
Sejak WordPress 4.7 (dirilis Desember 2016) dimungkinkan untuk menambahkan tindakan massal kustom tanpa menggunakan JavaScript.
Filter
bulk_actions-{$screen}
(mis.bulk_actions-edit-page
Untuk ikhtisar halaman) sekarang memungkinkan Anda untuk menambahkan tindakan massal kustom. Selanjutnya, tindakan baru yang disebuthandle_bulk_actions-{$screen}
(misalnyahandle_bulk_actions-edit-page
) memungkinkan Anda untuk menangani eksekusi tindakan.Ini semua dijelaskan dengan cukup baik di posting blog ini . Sebagai contoh, katakanlah kita ingin menambahkan tindakan massal untuk mengirim email judul-judul dari item yang dipilih pada ikhtisar halaman. Kita bisa melakukannya seperti ini:
Sebagai contoh kecil, di mana kita menambahkan aksi ke dropdown tindakan massal dan menambahkan fungsi handler ke dalamnya.
Menambahkan tindakan massal ke dropdown:
Menambahkan pawang untuk tindakan massal:
sumber
add_action( 'handle_bulk_actions-edit-page', 'wpse29822_page_bulk_actions_handle', 10, 3 );
edit-page
bagiannya adalah layar id) (2) Tindakan tidak akan dieksekusi jika tidak ada halaman yang dipilih (yaitu mencoba melakukan aksi massal pada set halaman kosong)The
bulk_actions-*
filter tidak memungkinkan Anda untuk menambahkan tindakan massal kustom justru karena itu sulit untuk kemudian menambahkan handler untuk tindakan itu. Diperbarui pada Codex.Saya sarankan menggunakan
load-*
tindakan alih-alihadmin_init
. Perhatikan bahwa Anda harus melakukan semua pemeriksaan keamanan seperti check_ajax_referrer () dan current_user_can ().sumber
load-*
kait muncul untuk dapat bekerja. Juga, terima kasih telah memperbarui kodeks dan membuka kembali tiket trac.load-*
kail. Ketika saya menerapkan tindakan massal pada users.php - saya lihatcreate_invoice
diteruskan melalui permintaan. Namun, pada edit.phpcreate_invoice
tidak pernah dicetak.exit;
panggilan setelahecho "<pre>" . print_r($_REQUEST, true) . "</pre>";
load-*
:admin_action_*
(admin_action_create_invoice
dalam kasus Anda). Ini disebut tepat setelahload-*
hook, dan hanya ketika tindakan massal kustom dipicu.Anda harus menggunakan
bulk_actions
filter saatWP_Screen
objek ditentukan. seperti ini:sumber