Gostaria de adicionar uma ação em massa personalizada a um tipo de postagem personalizado. Me deparei com o filtro bulk_actions-screenid
, que , de acordo com a documentação , faria exatamente como eu queria . No entanto, após cerca de duas horas de depuração, encontrei o seguinte comentário // This filter can currently only be used to remove actions.
na linha 278 de class-wp-list-table.php - ótimo!
Imaginei que poderia cortá-lo usando jQuery para injetar a ação como uma opção
/**
* 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
}
Isso funciona. A ação agora aparece no menu de ações em massa. Eu estava no pressuposto de que poderia adicionar alguma lógica admin_init
para fazer o processamento necessário - no entanto, parece que create_invoice
nunca é publicado. Existe algo que estou fazendo errado?
=== ATUALIZAÇÃO ===
Eu atualizei o código para usar o load-*
gancho. Quando aplico a ação em massa no users.php - vejo que create_invoice
é passada pela solicitação. No entanto, no edit.php create_invoice
nunca é impresso.
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');
fonte
Respostas:
Eu acho que o último grande lançamento merece uma nova resposta para essa pergunta, considerando a popularidade dessa pergunta.
Desde o WordPress 4.7 (lançado em dezembro de 2016), é possível adicionar ações em massa personalizadas sem usar JavaScript.
O filtro
bulk_actions-{$screen}
(por exemplo,bulk_actions-edit-page
para a visão geral das páginas) agora permite adicionar ações em massa personalizadas. Além disso, uma nova ação chamadahandle_bulk_actions-{$screen}
(por exemplohandle_bulk_actions-edit-page
) permite que você lide com a execução da ação.Tudo isso é explicado muito bem nesta postagem do blog . Por exemplo, digamos que queremos adicionar uma ação em massa para enviar por email os títulos dos itens selecionados na visão geral das páginas. Poderíamos fazer assim:
Para um pequeno exemplo, onde adicionamos uma ação ao menu suspenso de ações em massa e adicionamos uma função de manipulador a ele.
Adicionando a ação em massa ao menu suspenso:
Adicionando um manipulador para a ação em massa:
fonte
add_action( 'handle_bulk_actions-edit-page', 'wpse29822_page_bulk_actions_handle', 10, 3 );
edit-page
parte é seu ID de tela) (2) A ação não será executada se nenhuma página for selecionada (ou seja, tentar fazer o ação em massa em um conjunto vazio de páginas)O
bulk_actions-*
filtro não permite adicionar ações em massa personalizadas precisamente porque é complicado adicionar um manipulador para essa ação. Atualizado o Codex.Eu sugeriria usar a
load-*
ação em vez deadmin_init
. Observe que você deve fazer todas as verificações de segurança como check_ajax_referrer () e current_user_can ().fonte
load-*
gancho parece estar funcionando. Além disso, obrigado por atualizar o codex e reabrir o ticket trac.load-*
gancho. Quando aplico a ação em massa no users.php - vejo quecreate_invoice
é passada pela solicitação. No entanto, no edit.phpcreate_invoice
nunca é impresso.exit;
chamada depoisecho "<pre>" . print_r($_REQUEST, true) . "</pre>";
load-*
: oadmin_action_*
(admin_action_create_invoice
no seu caso). É chamado logo após oload-*
gancho e somente quando a ação em massa personalizada é acionada.Você deve usar
bulk_actions
filtros quando oWP_Screen
objeto estiver definido. como isso:fonte