Bulk_action personnalisé

17

Je voudrais ajouter une action groupée 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 veux . 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.sur la ligne 278 de class-wp-list-table.php - super!

J'ai pensé que je pouvais 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 d'actions groupées. J'étais dans l'hypothèse que je pourrais alors ajouter de la logique admin_initpour faire le traitement nécessaire - cependant, il semble que ce create_invoicene soit jamais publié. Y a-t-il quelque chose que je fais mal?

=== MISE À JOUR ===

J'ai mis à jour le code pour utiliser le load-*crochet. Lorsque j'applique l'action en masse sur users.php - je vois que create_invoicela demande est transmise. Cependant, sur edit.php create_invoicen'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');
v0idless
la source
1
Peut-être que cette réponse aidera quelqu'un à l'avenir. Voici une façon de le faire: Ajouter une action en bloc personnalisée WordPress
Ayoub
Le lien dans le commentaire précédent a changé. Vous pouvez toujours lire l'article ici .
morphatique
1
Il semble que cela sera bientôt corrigé dans wordpress. Le ticket core.trac.wordpress.org/ticket/16031 vient de fermer fin octobre '16.
Denise Draper

Réponses:

2

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

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

Le filtre bulk_actions-{$screen}(par exemple bulk_actions-edit-pagepour l'aperçu des pages) vous permet désormais d'ajouter des actions groupées 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 assez bien expliqué dans cet article de blog . Par exemple, supposons que nous souhaitons ajouter une action groupée pour envoyer par e-mail les titres des éléments sélectionnés dans l'aperçu des pages. Nous pourrions le faire comme ceci:

Pour un petit exemple, où nous ajoutons une action à la liste déroulante d'actions en masse et y ajoutons une fonction de gestionnaire.

Ajout de l'action groupée à la liste déroulante:

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 groupée:

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
la source
Cette action de gestionnaire ne fonctionne pas pour moi. J'utilise WordPress 4.7.2. J'apprécierais toute aide à ce sujet. add_action( 'handle_bulk_actions-edit-page', 'wpse29822_page_bulk_actions_handle', 10, 3 );
Maria Daniel Deepak
Qu'est-ce qui ne fonctionne pas @MariaDanielDeepak? Cela fonctionne bien sur 4.7.2 pour moi. Quelques points à considérer: (1) Le rappel est pour la vue d'ensemble "Pages" dans l'admin (car la edit-pagepartie est son id d'écran) (2) L'action ne sera pas exécutée si aucune page n'est sélectionnée (c'est-à-dire en essayant de faire le action
groupée
J'apprécie votre commentaire. J'ai ajouté l'explication complète de ce qui ne fonctionne pas sur le forum WordPress .
Maria Daniel Deepak
9

Le bulk_actions-*filtre ne vous permet pas d'ajouter des actions groupées personnalisées précisément parce qu'il est difficile d'ajouter ensuite un gestionnaire pour cette action. Mise à jour du Codex.

Je suggère d'utiliser l' load-*action au lieu de admin_init. Notez que vous devez effectuer tous les contrôles de sécurité comme check_ajax_referrer () et current_user_can ().

scribu
la source
Merci! Le load-*crochet semble fonctionner. Merci également d'avoir mis à jour le codex et de rouvrir le ticket trac.
v0idless
1
J'ai peut-être prématurément accepté la réponse. J'ai mis à jour le code pour utiliser le load-*crochet. Lorsque j'applique l'action en masse sur users.php - je vois que create_invoicela demande est transmise. Cependant, sur edit.php create_invoicen'est jamais imprimé.
v0idless
Essayez d'ajouter un exit;appel aprèsecho "<pre>" . print_r($_REQUEST, true) . "</pre>";
scribu
1
Je pense qu'il y a un meilleur crochet d'action que load-*: le admin_action_*( admin_action_create_invoicedans votre cas). Il est appelé juste après le load-*hook et uniquement lorsque l'action groupée personnalisée est déclenchée.
Fabien Quatravaux
0

Vous devez utiliser des bulk_actionsfiltres lorsque l' WP_Screenobjet 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' );
    }
}    
Themesfa
la source