bulk_action personalizado

16

Gostaria de adicionar uma ação em massa personalizada a um tipo de postagem personalizado. Me deparei com o filtro bulk_actions-screenid , que, de acordo com sua documentação , faria exatamente o que eu desejasse No entanto, após cerca de duas horas de depuração, encontrei o seguinte comentário // This filter can currently only be used to remove actions. na linha 278 de class-wp-list-table.php - ótimo!

Eu imaginei que poderia hackeá-lo usando o jQuery para injetar a ação como uma opção

/**
 * 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
}

Isso funciona. A ação agora aparece no menu de ações em massa. Eu estava supondo que poderia adicionar alguma lógica em admin_init para fazer o processamento necessário - no entanto, parece que create_invoice nunca é postado. Há algo que estou fazendo errado?

=== UPDATE ===

Eu atualizei o código para usar o gancho load-* . Quando eu aplico a ação em massa em users.php - vejo create_invoice passado pela solicitação. No entanto, em edit.php create_invoice nunca é impresso.

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');
    
por v0idless 29.09.2011 / 17:06

3 respostas

2

Acho que o último lançamento importante garante uma nova resposta a essa pergunta, considerando a popularidade dessa pergunta.

Desde o WordPress 4.7 (lançado em dezembro de 2016), é possível adicionar ações em massa personalizadas sem usar JavaScript.

O filtro bulk_actions-{$screen} (por exemplo, bulk_actions-edit-page para a visão geral das páginas) agora permite que você adicione ações em massa personalizadas. Além disso, uma nova ação chamada handle_bulk_actions-{$screen} (por exemplo, handle_bulk_actions-edit-page ) permite que você lide com a execução da ação.

Isso tudo é explicado muito bem em esta postagem no blog . Por exemplo, digamos que queremos adicionar uma ação em massa para enviar por e-mail os títulos dos itens selecionados na visão geral das páginas. Nós poderíamos fazer assim:

Para um pequeno exemplo, onde adicionamos uma ação à lista suspensa de ações em massa e adicionamos uma função de manipulador a ela.

Adicionando a ação em massa ao menu suspenso:

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

Adicionando um manipulador para a ação em massa:

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 );
    
por engelen 31.01.2017 / 15:23
9

O filtro bulk_actions-* não permite adicionar ações em massa personalizadas, pois é complicado adicionar um manipulador para essa ação. Atualizou o Codex.

Sugiro usar a ação load-* em vez de admin_init . Observe que você precisa fazer todas as verificações de segurança como check_ajax_referrer () e current_user_can ().

    
por scribu 29.09.2011 / 17:25
0

Você deve usar bulk_actions filters quando WP_Screen object for definido. assim:

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