web-dev-qa-db-fra.com

Bulk_action personnalisé

J'aimerais ajouter une action en bloc personnalisée à un type de publication personnalisé. Je suis tombé sur le filtre bulk_actions-screenidqui, 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 marche. L'action apparaît maintenant dans le menu des actions en bloc. Je pensais pouvoir ajouter une logique dans 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 mal?

=== UPDATE ===

J'ai mis à jour le code pour utiliser le hook load-*. Lorsque j'applique l'action en bloc sur users.php - je vois que create_invoice est transmis via la demande. 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');
17
v0idless

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 s’explique assez bien 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 );
1
engelen

Le filtre bulk_actions-* ne vous permet pas d'ajouter des actions en bloc personnalisées précisément parce qu'il est délicat d'ajouter ensuite un gestionnaire pour une telle 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 ().

9
scribu

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

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