Me gustaría agregar una acción masiva personalizada a un tipo de publicación personalizada. Encontré el filtro bulk_actions-screenid, que según su documentación , haría exactamente lo que quisiera . Sin embargo, después de aproximadamente dos horas de depuración encontré el siguiente comentario // This filter can currently only be used to remove actions.en la línea 278 de class-wp-list-table.php - ¡genial!
Pensé que podría hackearlo usando jQuery para inyectar la acción como una opción
/**
* 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
}
Esto funciona. La acción ahora aparece en el menú de acciones masivas. Supuse que podría agregar algo de lógica admin_initpara hacer el procesamiento necesario; sin embargo, parece que create_invoicenunca se publica. ¿Hay algo que estoy haciendo mal?
=== ACTUALIZACIÓN ===
Actualicé el código para usar el load-*gancho. Cuando aplico la acción masiva en users.php: veo que create_invoicese pasa a través de la solicitud. Sin embargo, en edit.php create_invoicenunca se imprime.
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');
fuente

Respuestas:
Creo que el último lanzamiento importante garantiza una nueva respuesta a esta pregunta, teniendo en cuenta la popularidad de esta pregunta.
Desde WordPress 4.7 (lanzado en diciembre de 2016) es posible agregar acciones masivas personalizadas sin usar JavaScript.
El filtro
bulk_actions-{$screen}(por ejemplo,bulk_actions-edit-pagepara la descripción general de las páginas) ahora le permite agregar acciones masivas personalizadas. Además, una nueva acción llamadahandle_bulk_actions-{$screen}(por ejemplohandle_bulk_actions-edit-page) le permite manejar la ejecución de la acción.Todo esto se explica bastante bien en esta publicación de blog . Por ejemplo, supongamos que queremos agregar una acción masiva para enviar por correo electrónico los títulos de los elementos seleccionados en la descripción general de las páginas. Podríamos hacerlo así:
Para un pequeño ejemplo, donde agregamos una acción al menú desplegable de acciones masivas y le agregamos una función de controlador.
Agregar la acción masiva al menú desplegable:
Agregar un controlador para la acción masiva:
fuente
add_action( 'handle_bulk_actions-edit-page', 'wpse29822_page_bulk_actions_handle', 10, 3 );edit-pageparte es su ID de pantalla) (2) La acción no se ejecutará si no se seleccionan páginas (es decir, intentar hacer el acción masiva en un conjunto de páginas vacío)El
bulk_actions-*filtro no le permite agregar acciones masivas personalizadas precisamente porque es difícil agregar un controlador para esa acción. Actualizado el Codex.Sugeriría usar la
load-*acción en lugar deadmin_init. Tenga en cuenta que debe realizar todas las comprobaciones de seguridad como check_ajax_referrer () y current_user_can ().fuente
load-*gancho parece estar funcionando. Además, gracias por actualizar el códice y reabrir el ticket de trac.load-*gancho. Cuando aplico la acción masiva en users.php: veo quecreate_invoicese pasa a través de la solicitud. Sin embargo, en edit.phpcreate_invoicenunca se imprime.exit;llamada despuésecho "<pre>" . print_r($_REQUEST, true) . "</pre>";load-*: eladmin_action_*(admin_action_create_invoiceen su caso). Se llama justo después delload-*enlace y solo cuando se activa la acción masiva personalizada.Debe usar
bulk_actionsfiltros cuando elWP_Screenobjeto está definido. Me gusta esto:fuente