Я хотел бы добавить пользовательское массовое действие к пользовательскому типу записи. Я наткнулся на фильтр bulk_actions-screenid
, который, согласно его документации , будет работать именно так, как я хочу . Однако примерно после двух часов отладки я нашел следующий комментарий// This filter can currently only be used to remove actions.
к строке 278 class-wp-list-table.php - отлично!
Я подумал, что смогу взломать его, используя jQuery для добавления действия в качестве опции
/**
* 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
}
Это работает. Действие теперь появляется в меню массовых действий. Я предполагал, что смогу добавить некоторую логику admin_init
для выполнения необходимой обработки - однако, похоже, что create_invoice
она никогда не публикуется. Я что-то не так делаю?
=== ОБНОВЛЕНИЕ ===
Я обновил код, чтобы использовать load-*
хук. Когда я применяю массовое действие к users.php - я вижу, create_invoice
что передается через запрос. Тем не менее, на edit.php create_invoice
никогда не печатается.
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');
источник
Ответы:
Я думаю, что последний крупный релиз требует нового ответа на этот вопрос, учитывая популярность этого вопроса.
Начиная с WordPress 4.7 (выпущен в декабре 2016 года), можно добавлять собственные массовые действия без использования JavaScript.
Фильтр
bulk_actions-{$screen}
(например,bulk_actions-edit-page
для обзора страниц) теперь позволяет добавлять настраиваемые массовые действия. Кроме того, новое действие, называемоеhandle_bulk_actions-{$screen}
(напримерhandle_bulk_actions-edit-page
), позволяет вам управлять выполнением действия.Все это довольно хорошо объяснено в этом посте . Например, скажем, мы хотим добавить массовое действие, чтобы отправить заголовки выбранных элементов в обзоре страниц по электронной почте. Мы могли бы сделать это так:
Для небольшого примера, где мы добавляем действие в выпадающий список массовых действий и добавляем к нему функцию-обработчик.
Добавление массового действия в выпадающий список:
Добавление обработчика для массового действия:
источник
add_action( 'handle_bulk_actions-edit-page', 'wpse29822_page_bulk_actions_handle', 10, 3 );
edit-page
часть является идентификатором экрана). (2) Действие не будет выполнено, если не выбрано ни одной страницы (т.е. попытка выполнить массовое действие на пустом наборе страниц)bulk_actions-*
Фильтр не позволяет добавлять пользовательские массовые действия именно потому , что это сложно , то добавить обработчик для этого действия. Обновлен Кодекс.Я бы предложил использовать
load-*
действие вместоadmin_init
. Обратите внимание, что вы должны выполнить все проверки безопасности, такие как check_ajax_referrer () и current_user_can ().источник
load-*
Крюк , кажется, работает. Также спасибо за обновление кодекса и повторное открытие трейк-билета.load-*
хук. Когда я применяю массовое действие к users.php - я вижу,create_invoice
что передается через запрос. Тем не менее, на edit.phpcreate_invoice
никогда не печатается.exit;
вызов послеecho "<pre>" . print_r($_REQUEST, true) . "</pre>";
load-*
:admin_action_*
(admin_action_create_invoice
в вашем случае). Он вызывается сразу послеload-*
перехвата и только когда запускается настраиваемое массовое действие.Вы должны использовать
bulk_actions
фильтры, когдаWP_Screen
объект определен. как это:источник