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_init
do niezbędnego przetwarzania - wydaje się jednak, że create_invoice
nigdy 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_invoice
jest przekazywana przez żądanie. Jednak na edit.php create_invoice
nigdy 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');
źródło
Odpowiedzi:
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-page
Przegląd stron) umożliwia teraz dodawanie niestandardowych akcji zbiorczych. Ponadto nowa akcja o nazwiehandle_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:
Dodanie modułu obsługi dla akcji zbiorczej:
źródło
add_action( 'handle_bulk_actions-edit-page', 'wpse29822_page_bulk_actions_handle', 10, 3 );
edit-page
część 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)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 zamiastadmin_init
. Pamiętaj, że musisz wykonać wszystkie kontrole bezpieczeństwa, takie jak check_ajax_referrer () i current_user_can ().źródło
load-*
Hak wydaje się działać. Dziękujemy również za aktualizację kodeksu i ponowne otwarcie biletu trac.load-*
haka. Kiedy zastosuję akcję zbiorczą na users.php - widzę, żecreate_invoice
jest przekazywana przez żądanie. Jednak na edit.phpcreate_invoice
nigdy nie jest drukowany.exit;
rozmowę poecho "<pre>" . print_r($_REQUEST, true) . "</pre>";
load-*
:admin_action_*
(admin_action_create_invoice
w twoim przypadku). Jest on wywoływany tuż po zakończeniu przechwytywaniaload-*
i tylko po uruchomieniu niestandardowej akcji zbiorczej.Musisz użyć
bulk_actions
filtrów, gdyWP_Screen
obiekt jest zdefiniowany. lubię to:źródło