Custom bulk_action

16

J'aimerais ajouter une action en bloc personnalisée à un type de publication personnalisé. Je suis tombé sur le filtre bulk_actions-screenid , qui, selon sa documentation , ferait exactement ce que je souhaite. . Cependant, après environ deux heures de débogage, j'ai trouvé le commentaire suivant // This filter can currently only be used to remove actions. à la ligne 278 de class-wp-list-table.php - super!

J'ai pensé que je pourrais le pirater en utilisant jQuery pour injecter l'action en option

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

Cela fonctionne. L'action apparaît maintenant dans le menu des actions en bloc. Je pensais pouvoir ajouter une logique à admin_init pour effectuer le traitement nécessaire. Cependant, il semble que create_invoice ne soit jamais publié. Y a-t-il quelque chose que je fais de travers?

=== UPDATE ===

J'ai mis à jour le code pour utiliser le crochet load-* . Lorsque j'applique l'action en bloc sur users.php, je vois que create_invoice est transmis à la requête. Cependant, sur edit.php, create_invoice n’est jamais imprimé.

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');
    
posée v0idless 29.09.2011 - 17:06

3 réponses

2

Je pense que la dernière version majeure justifie une nouvelle réponse à cette question, compte tenu de la popularité de cette question.

Depuis WordPress 4.7 (publié en décembre 2016), il est possible d'ajouter des actions en bloc personnalisées sans utiliser JavaScript.

Le filtre bulk_actions-{$screen} (par exemple bulk_actions-edit-page pour la vue d'ensemble des pages) vous permet désormais d'ajouter des actions en bloc personnalisées. De plus, une nouvelle action appelée handle_bulk_actions-{$screen} (par exemple, handle_bulk_actions-edit-page ) vous permet de gérer l’exécution de l’action.

Tout cela est très bien expliqué dans cet article de blog . Par exemple, supposons que nous voulions ajouter une action en bloc pour envoyer par courrier électronique les titres des éléments sélectionnés dans la vue d'ensemble des pages. Nous pourrions le faire comme ceci:

Pour un petit exemple, nous ajoutons une action au menu déroulant des actions en bloc et y ajoutons une fonction de gestionnaire.

Ajout de l'action en bloc au menu déroulant:

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

Ajout d'un gestionnaire pour l'action en bloc:

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 );
    
réponse donnée engelen 31.01.2017 - 15:23
9

Le filtre bulk_actions-* ne vous permet pas d’ajouter des actions en bloc personnalisées, car il est difficile d’ajouter un gestionnaire pour cette action. Mise à jour du Codex.

Je suggérerais d'utiliser l'action load-* au lieu de admin_init . Notez que vous devez effectuer toutes les vérifications de sécurité telles que check_ajax_referrer () et current_user_can ().

    
réponse donnée scribu 29.09.2011 - 17:25
0

Vous devez utiliser les filtres bulk_actions lorsque l'objet WP_Screen est défini. comme ceci:

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' );
    }
}    
    
réponse donnée Themesfa 18.05.2018 - 15:10

Lire d'autres questions sur les étiquettes