Acción granel personalizada


17

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');

1
Puede ser que esta respuesta ayude a alguien en el futuro. Aquí hay una manera de hacerlo: Agregue una acción masiva personalizada de WordPress
— Ayoub

El enlace en el comentario anterior ha cambiado. Todavía puedes leer el artículo aquí .
— morfático

1
Parece que esto se solucionará pronto en WordPress. El boleto core.trac.wordpress.org/ticket/16031 se cerró a fines de octubre '16.
— Denise Draper

Respuestas:


2

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 llamada handle_bulk_actions-{$screen}(por ejemplo handle_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:

function wpse29822_page_bulk_actions( $actions ) {
    // Add custom bulk action
    $actions['my-action-handle'] = __( 'My Custom Bulk Action' );
    return $actions;
}
add_action( 'bulk_actions-edit-page', 'wpse29822_page_bulk_actions' );

Agregar un controlador para la acción masiva:

function wpse29822_page_bulk_actions_handle( $redirect_to, $doaction, $post_ids ) {
    // Check whether action that user wants to perform is our custom action
    if ( $doaction == 'my-action-handle' ) {
        // Do stuff
    }
    return $redirect_to;
}
add_action( 'handle_bulk_actions-edit-page', 'wpse29822_page_bulk_actions_handle', 10, 3 );

Esta acción de controlador no funciona para mí. Estoy usando WordPress 4.7.2. Le agradecería cualquier ayuda en esto. add_action( 'handle_bulk_actions-edit-page', 'wpse29822_page_bulk_actions_handle', 10, 3 );
— Maria Daniel Deepak

¿Qué no funciona @MariaDanielDeepak? Funciona bien en 4.7.2 para mí. Algunas cosas a tener en cuenta: (1) La devolución de llamada es para la descripción general de "Páginas" en el administrador (ya que la 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)
— engelen

Agradezco tu comentario. He agregado la explicación completa de lo que no funciona en el foro de WordPress .
— Maria Daniel Deepak

9

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 de admin_init. Tenga en cuenta que debe realizar todas las comprobaciones de seguridad como check_ajax_referrer () y current_user_can ().


¡Gracias! El load-*gancho parece estar funcionando. Además, gracias por actualizar el códice y reabrir el ticket de trac.
— v0idless

1
Puede que haya aceptado prematuramente la respuesta. 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.
— v0idless

Intente agregar una exit;llamada despuésecho "<pre>" . print_r($_REQUEST, true) . "</pre>";
— scribu

1
Creo que hay un mejor gancho de acción que load-*: el admin_action_*( admin_action_create_invoiceen su caso). Se llama justo después del load-*enlace y solo cuando se activa la acción masiva personalizada.
— Fabien Quatravaux

0

Debe usar bulk_actionsfiltros cuando el WP_Screenobjeto está definido. Me gusta esto:

add_action( 'current_screen', 'custom_bulk_actions' );
function custom_bulk_actions() {
    if( current_user_can( 'administrator' ) {
        add_filter( 'bulk_actions-edit-post'       , 'register_custom_bulk_actions' );
        add_filter( 'handle_bulk_actions-edit-post', 'custom_bulk_action_handler', 10, 3 );
        add_action( 'admin_notices'                , 'custom_bulk_action_admin_notice' );
    }
}    
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.