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

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

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 ().


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' );
    }
}    
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.