Bulk_action personalizado

17

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 a documentação , faria exatamente como eu queria . 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!

Imaginei que poderia cortá-lo usando 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 no pressuposto de que poderia adicionar alguma lógica admin_initpara fazer o processamento necessário - no entanto, parece que create_invoicenunca é publicado. Existe algo que estou fazendo errado?

=== ATUALIZAÇÃO ===

Eu atualizei o código para usar o load-*gancho. Quando aplico a ação em massa no users.php - vejo que create_invoiceé passada pela solicitação. No entanto, no edit.php create_invoicenunca é 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');
v0idless
fonte
1
Pode ser que esta resposta ajude alguém no futuro. Aqui está uma maneira de fazê-lo: Adicionar uma ação em massa WordPress personalizado
Ayoub
O link no comentário anterior foi alterado. Você ainda pode ler o artigo aqui .
morphatic
1
Parece que isso será corrigido no wordpress em breve. O ticket core.trac.wordpress.org/ticket/16031 acabou de ser fechado no final de outubro de 16.
Denise Draper

Respostas:

2

Eu acho que o último grande lançamento merece uma nova resposta para 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-pagepara a visão geral das páginas) agora permite adicionar 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.

Tudo isso é explicado muito bem nesta postagem do blog . Por exemplo, digamos que queremos adicionar uma ação em massa para enviar por email os títulos dos itens selecionados na visão geral das páginas. Poderíamos fazer assim:

Para um pequeno exemplo, onde adicionamos uma ação ao menu suspenso de ações em massa e adicionamos uma função de manipulador a ele.

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 );
Engelen
fonte
Essa ação do manipulador não funciona para mim. Estou usando o WordPress 4.7.2. Eu apreciaria qualquer ajuda sobre isso. add_action( 'handle_bulk_actions-edit-page', 'wpse29822_page_bulk_actions_handle', 10, 3 );
Maria Daniel Deepak
O que não está funcionando @MariaDanielDeepak? Está funcionando bem na 4.7.2 para mim. Algumas coisas a considerar: (1) O retorno de chamada é para a visão geral de "Páginas" no administrador (como a edit-pageparte é seu ID de tela) (2) A ação não será executada se nenhuma página for selecionada (ou seja, tentar fazer o ação em massa em um conjunto vazio de páginas)
engelen
Agradeço seu comentário. Adicionei a explicação completa do que não está funcionando no fórum do WordPress .
Maria Daniel Deepak
9

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

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

scribu
fonte
Obrigado! O load-*gancho parece estar funcionando. Além disso, obrigado por atualizar o codex e reabrir o ticket trac.
precisa saber é o seguinte
1
Eu posso ter aceitado prematuramente a resposta. Eu atualizei o código para usar o load-*gancho. Quando aplico a ação em massa no users.php - vejo que create_invoiceé passada pela solicitação. No entanto, no edit.php create_invoicenunca é impresso.
v0idless
Tente adicionar uma exit;chamada depoisecho "<pre>" . print_r($_REQUEST, true) . "</pre>";
scribu
1
Eu acho que há um gancho de ação melhor do que load-*: o admin_action_*( admin_action_create_invoiceno seu caso). É chamado logo após o load-*gancho e somente quando a ação em massa personalizada é acionada.
Fabien Quatravaux
0

Você deve usar bulk_actionsfiltros quando o WP_Screenobjeto estiver definido. como isso:

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' );
    }
}    
Themesfa
fonte