bulk_action personalizado

16

Me gustaría agregar una acción masiva personalizada a un tipo de publicación personalizada. Encontré el filtro bulk_actions-screenid , que, de acuerdo con su documentación , haría exactamente lo que deseo . 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!

Me di cuenta de que podría hackearlo utilizando 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 a admin_init para realizar 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 gancho load-* . 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');
    
pregunta v0idless 29.09.2011 - 17:06

3 respuestas

2

Creo que el último lanzamiento importante merece una nueva respuesta a esta pregunta, considerando 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 el resumen 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, digamos 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' );

Adición de 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 );
    
respondido por el engelen 31.01.2017 - 15:23
9

El filtro bulk_actions-* 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 acción load-* en lugar de admin_init . Tenga en cuenta que debe realizar todas las comprobaciones de seguridad, como check_ajax_referrer () y current_user_can ().

    
respondido por el scribu 29.09.2011 - 17:25
0

Debe usar los filtros bulk_actions cuando se define el objeto WP_Screen . de esta manera:

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' );
    }
}    
    
respondido por el Themesfa 18.05.2018 - 15:10

Lea otras preguntas en las etiquetas