Bulk_action khusus

17

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_inituntuk melakukan pemrosesan yang diperlukan - namun, tampaknya create_invoicetidak 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_invoicediteruskan melalui permintaan. Namun, pada edit.php create_invoicetidak 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');
tidak ada
sumber
1
Mungkin jawaban ini akan membantu seseorang di masa depan. Berikut adalah cara untuk melakukannya: Tambahkan Tindakan Massal Kustom WordPress
Ayoub
Tautan dalam komentar sebelumnya telah berubah. Anda masih dapat membaca artikel di sini .
morphatic
1
Sepertinya ini akan segera diperbaiki di wordpress. Tiket core.trac.wordpress.org/ticket/16031 hanya ditutup pada akhir Oktober '16.
Denise Draper

Jawaban:

2

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-pageUntuk ikhtisar halaman) sekarang memungkinkan Anda untuk menambahkan tindakan massal kustom. Selanjutnya, tindakan baru yang disebut handle_bulk_actions-{$screen}(misalnya handle_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:

function wpse29822_page_bulk_actions( $actions ) {
    // Add custom bulk action
    $actions['my-action-handle'] = __( 'My Custom Bulk Action' );
    return $actions;
}
add_action( 'bulk_actions-edit-page', 'wpse29822_page_bulk_actions' );

Menambahkan pawang untuk tindakan massal:

function wpse29822_page_bulk_actions_handle( $redirect_to, $doaction, $post_ids ) {
    // Check whether action that user wants to perform is our custom action
    if ( $doaction == 'my-action-handle' ) {
        // Do stuff
    }
    return $redirect_to;
}
add_action( 'handle_bulk_actions-edit-page', 'wpse29822_page_bulk_actions_handle', 10, 3 );
engelen
sumber
Tindakan pawang ini tidak berhasil untuk saya. Saya menggunakan WordPress 4.7.2. Saya sangat menghargai bantuan apa pun dalam hal ini. add_action( 'handle_bulk_actions-edit-page', 'wpse29822_page_bulk_actions_handle', 10, 3 );
Maria Daniel Deepak
Apa yang tidak berhasil @MariaDanielDeepak? Ini berfungsi dengan baik pada 4.7.2 untuk saya. Beberapa hal yang perlu dipertimbangkan: (1) Callback adalah untuk ikhtisar "Halaman" di admin (karena edit-pagebagiannya adalah layar id) (2) Tindakan tidak akan dieksekusi jika tidak ada halaman yang dipilih (yaitu mencoba melakukan aksi massal pada set halaman kosong)
engelen
Saya menghargai komentar Anda. Saya telah menambahkan penjelasan lengkap tentang apa yang tidak berfungsi di forum WordPress .
Maria Daniel Deepak
9

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-alih admin_init. Perhatikan bahwa Anda harus melakukan semua pemeriksaan keamanan seperti check_ajax_referrer () dan current_user_can ().

scribu
sumber
Terima kasih! The load-*kait muncul untuk dapat bekerja. Juga, terima kasih telah memperbarui kodeks dan membuka kembali tiket trac.
v0idless
1
Saya mungkin telah menerima jawabannya sebelum waktunya. Saya memperbarui kode untuk menggunakan load-*kail. Ketika saya menerapkan tindakan massal pada users.php - saya lihat create_invoicediteruskan melalui permintaan. Namun, pada edit.php create_invoicetidak pernah dicetak.
v0idless
Coba tambahkan exit;panggilan setelahecho "<pre>" . print_r($_REQUEST, true) . "</pre>";
scribu
1
Saya pikir ada hook tindakan yang lebih baik daripada load-*: admin_action_*( admin_action_create_invoicedalam kasus Anda). Ini disebut tepat setelah load-*hook, dan hanya ketika tindakan massal kustom dipicu.
Fabien Quatravaux
0

Anda harus menggunakan bulk_actionsfilter saat WP_Screenobjek ditentukan. seperti ini:

add_action( 'current_screen', 'custom_bulk_actions' );
function custom_bulk_actions() {
    if( current_user_can( 'administrator' ) {
        add_filter( 'bulk_actions-edit-post'       , 'register_custom_bulk_actions' );
        add_filter( 'handle_bulk_actions-edit-post', 'custom_bulk_action_handler', 10, 3 );
        add_action( 'admin_notices'                , 'custom_bulk_action_admin_notice' );
    }
}    
Themesfa
sumber