Niestandardowe działanie zbiorcze

17

Chciałbym dodać niestandardową akcję zbiorczą do niestandardowego typu postu. Natknąłem się na filtr bulk_actions-screenid, który zgodnie z jego dokumentacją działałby dokładnie tak, jak chciałbym . Jednak po około dwóch godzinach debugowania znalazłem następujący komentarz // This filter can currently only be used to remove actions.w wierszu 278 klasy-wp-list-table.php - świetnie!

Pomyślałem, że mogę go zhakować, używając jQuery do wstrzyknięcia akcji jako opcji

/**
 * 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
}

To działa. Akcja pojawi się teraz w menu akcji zbiorczych. Przyjąłem założenie, że mógłbym dodać trochę logiki admin_initdo niezbędnego przetwarzania - wydaje się jednak, że create_invoicenigdy nie jest wysyłany. Czy coś robię źle?

=== AKTUALIZACJA ===

Zaktualizowałem kod, aby użyć load-*haka. Kiedy zastosuję akcję zbiorczą na users.php - widzę, że create_invoicejest przekazywana przez żądanie. Jednak na edit.php create_invoicenigdy nie jest drukowany.

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');
v0idless
źródło
1
Być może ta odpowiedź pomoże komuś w przyszłości. Oto sposób, aby to zrobić: Dodaj niestandardową akcję
masową
Link w poprzednim komentarzu zmienił się. Nadal możesz przeczytać artykuł tutaj .
morfatyczny
1
Wygląda na to, że wkrótce zostanie to naprawione w wordpress. Bilet core.trac.wordpress.org/ticket/16031 został właśnie zamknięty pod koniec października '16.
Denise Draper,

Odpowiedzi:

2

Myślę, że najnowsze główne wydanie uzasadnia nową odpowiedź na to pytanie, biorąc pod uwagę popularność tego pytania.

Od wersji WordPress 4.7 (wydanej w grudniu 2016 r.) Można dodawać niestandardowe akcje zbiorcze bez użycia JavaScript.

Filtr bulk_actions-{$screen}(np. bulk_actions-edit-pagePrzegląd stron) umożliwia teraz dodawanie niestandardowych akcji zbiorczych. Ponadto nowa akcja o nazwie handle_bulk_actions-{$screen}(np. handle_bulk_actions-edit-page) Pozwala obsłużyć wykonanie akcji.

Wszystko to wyjaśniono całkiem dobrze w tym poście na blogu . Załóżmy na przykład, że chcemy dodać akcję zbiorczą, aby wysłać e-mailem tytuły wybranych pozycji w przeglądzie stron. Możemy to zrobić w następujący sposób:

Dla małego przykładu, w którym dodajemy akcję do listy rozwijanej akcji zbiorczych i dodajemy do niej funkcję modułu obsługi.

Dodawanie akcji zbiorczej do menu rozwijanego:

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' );

Dodanie modułu obsługi dla akcji zbiorczej:

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
źródło
Ta akcja modułu obsługi nie działa dla mnie. Korzystam z WordPress 4.7.2. Byłbym wdzięczny za wszelką pomoc w tym zakresie. add_action( 'handle_bulk_actions-edit-page', 'wpse29822_page_bulk_actions_handle', 10, 3 );
Maria Daniel Deepak
Co nie działa @MariaDanielDeepak? Dla mnie działa dobrze w wersji 4.7.2. Kilka rzeczy do rozważenia: (1) Oddzwanianie dotyczy przeglądu „Strony” w adminie (ponieważ edit-pageczęść jest jego identyfikatorem ekranowym) (2) Akcja nie zostanie wykonana, jeśli żadna strona nie zostanie wybrana (tj. Próba wykonania akcja zbiorcza na pustym zbiorze stron)
engelen
Doceniam twój komentarz. Dodałem pełne wyjaśnienie tego, co nie działa na forum WordPress .
Maria Daniel Deepak
9

bulk_actions-*Filtr nie pozwalają na dodawanie niestandardowych działań masowych właśnie dlatego, że jest to trudne do obsługi następnie dodać do tego działania. Zaktualizowano kodeks.

Sugerowałbym użycie load-*akcji zamiast admin_init. Pamiętaj, że musisz wykonać wszystkie kontrole bezpieczeństwa, takie jak check_ajax_referrer () i current_user_can ().

scribu
źródło
Dzięki! load-*Hak wydaje się działać. Dziękujemy również za aktualizację kodeksu i ponowne otwarcie biletu trac.
v0idless
1
Być może przedwcześnie zaakceptowałem odpowiedź. Zaktualizowałem kod, aby użyć load-*haka. Kiedy zastosuję akcję zbiorczą na users.php - widzę, że create_invoicejest przekazywana przez żądanie. Jednak na edit.php create_invoicenigdy nie jest drukowany.
v0idless
Spróbuj dodać exit;rozmowę poecho "<pre>" . print_r($_REQUEST, true) . "</pre>";
scribu,
1
Myślę, że jest lepszy hak akcji niż load-*: admin_action_*( admin_action_create_invoicew twoim przypadku). Jest on wywoływany tuż po zakończeniu przechwytywania load-*i tylko po uruchomieniu niestandardowej akcji zbiorczej.
Fabien Quatravaux
0

Musisz użyć bulk_actionsfiltrów, gdy WP_Screenobiekt jest zdefiniowany. lubię to:

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
źródło