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');
v0idless
fuente
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 );
Engelen
fuente
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 ().

scribu
fuente
¡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' );
    }
}    
Temasfa
fuente