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_init
para hacer el procesamiento necesario; sin embargo, parece que create_invoice
nunca 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_invoice
se pasa a través de la solicitud. Sin embargo, en edit.php create_invoice
nunca 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-page
para 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-page
parte 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_invoice
se pasa a través de la solicitud. Sin embargo, en edit.phpcreate_invoice
nunca se imprime.exit;
llamada despuésecho "<pre>" . print_r($_REQUEST, true) . "</pre>";
load-*
: eladmin_action_*
(admin_action_create_invoice
en su caso). Se llama justo después delload-*
enlace y solo cuando se activa la acción masiva personalizada.Debe usar
bulk_actions
filtros cuando elWP_Screen
objeto está definido. Me gusta esto:fuente