Massa_azione personalizzata


17

Vorrei aggiungere un'azione collettiva personalizzata a un tipo di post personalizzato. Mi sono imbattuto nel filtro bulk_actions-screenid, che secondo la sua documentazione , farebbe esattamente quello che desidero . Tuttavia, dopo circa due ore di debug ho trovato il seguente commento // This filter can currently only be used to remove actions.sulla riga 278 di class-wp-list-table.php - fantastico!

Ho pensato di poterlo hackerare usando jQuery per iniettare l'azione come opzione

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

Questo funziona L'azione ora appare nel menu delle azioni collettive. Ero convinto di poter aggiungere un po 'di logica admin_initper eseguire l'elaborazione necessaria, tuttavia sembra che create_invoicenon sia mai stato pubblicato. C'è qualcosa che sto facendo di sbagliato?

=== AGGIORNAMENTO ===

Ho aggiornato il codice per utilizzare l' load-*hook. Quando applico l'azione in blocco su users.php - vedo che create_invoiceviene passata attraverso la richiesta. Tuttavia, su edit.php create_invoicenon viene mai stampato.

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
Può essere questa risposta aiuterà qualcuno in futuro. Ecco un modo per farlo: Aggiungi un'azione in blocco personalizzata di WordPress
Ayoub

Il collegamento nel commento precedente è stato modificato. Puoi ancora leggere l'articolo qui .
morfico

1
Sembra che questo sarà risolto presto in wordpress. Il biglietto core.trac.wordpress.org/ticket/16031 era appena chiuso alla fine di ottobre '16.
Denise Draper,

Risposte:


2

Penso che l'ultima versione importante meriti una nuova risposta a questa domanda, considerando la popolarità di questa domanda.

Da WordPress 4.7 (rilasciato a dicembre 2016) è possibile aggiungere azioni collettive personalizzate senza utilizzare JavaScript.

Il filtro bulk_actions-{$screen}(ad es. bulk_actions-edit-pagePer la panoramica delle pagine) ora consente di aggiungere azioni collettive personalizzate. Inoltre, una nuova azione chiamata handle_bulk_actions-{$screen}(ad es. handle_bulk_actions-edit-page) Consente di gestire l'esecuzione dell'azione.

Tutto questo è spiegato abbastanza bene in questo post del blog . Ad esempio, supponiamo di voler aggiungere un'azione in blocco per inviare via e-mail i titoli degli elementi selezionati nella panoramica delle pagine. Potremmo farlo in questo modo:

Per un piccolo esempio, in cui aggiungiamo un'azione al menu a discesa delle azioni collettive e vi aggiungiamo una funzione di gestione.

Aggiunta dell'azione in blocco al menu a discesa:

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

Aggiunta di un gestore per l'azione in blocco:

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

Questa azione del gestore non funziona per me. Sto usando WordPress 4.7.2. Apprezzerei qualsiasi aiuto su questo. add_action( 'handle_bulk_actions-edit-page', 'wpse29822_page_bulk_actions_handle', 10, 3 );
Maria Daniel Deepak,

Cosa non funziona @MariaDanielDeepak? Per me funziona benissimo su 4.7.2. Alcune cose da considerare: (1) Il callback è per la panoramica "Pagine" nell'amministratore (in quanto la edit-pageparte è il suo ID schermo) (2) L'azione non verrà eseguita se non viene selezionata alcuna pagina (vale a dire provare a fare il azione collettiva su un set di pagine vuoto)
engelen,

Apprezzo il tuo commento Ho aggiunto la spiegazione completa di ciò che non funziona nel forum di WordPress .
Maria Daniel Deepak,

9

Il bulk_actions-*filtro non ti consente di aggiungere azioni in blocco personalizzate proprio perché è complicato aggiungere un gestore per quell'azione. Aggiornato il codice.

Suggerirei di utilizzare l' load-*azione anziché admin_init. Nota che devi fare tutti i controlli di sicurezza come check_ajax_referrer () e current_user_can ().


Grazie! Il load-*gancio sembra funzionare. Inoltre, grazie per l'aggiornamento del codice e la riapertura del ticket trac.
v0idless,

1
Potrei aver prematuramente accettato la risposta. Ho aggiornato il codice per utilizzare l' load-*hook. Quando applico l'azione in blocco su users.php - vedo che create_invoiceviene passata attraverso la richiesta. Tuttavia, su edit.php create_invoicenon viene mai stampato.
v0idless,

Prova ad aggiungere una exit;chiamata dopoecho "<pre>" . print_r($_REQUEST, true) . "</pre>";
scribu,

1
Penso che ci sia un gancio d'azione migliore di load-*: il admin_action_*( admin_action_create_invoicenel tuo caso). Viene chiamato subito dopo l' load-*hook e solo quando viene attivata l'azione in blocco personalizzata.
Fabien Quatravaux,

0

È necessario utilizzare i bulk_actionsfiltri quando l' WP_Screenoggetto è definito. come questo:

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' );
    }
}    
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.