htmlcss.fr Des tutos ou tutoriels Wordpress, html, php ou javascript.

Actions groupées ou bulk actions avec wordpress

A

Depuis WordPress 4.7 il y a trois « filter » qui nous permettent de prendre en main facilement la mise en place des actions groupées ou bulk actions depuis le backoffice, un traitement par lot quoi.
Concrètement ca ressemble à ça

Je me suis donc fait une petite class que je vous donne ici pour ajouter une ou plusieurs actions groupées sur vos écrans rapidement.

Comment ça fonctionne

Il faut initialiser la class avec deux variables: $sreen et $actions.

$ba = new BulkAction('edit-inscription', $actions);

La variable screen

Les actions groupée peuvent être ajouter dans plusieurs écrans dans l administration de WordPress. Voici les valeurs possibles :

  • edit-post: l’écran d’édition des ‘post’ 
  • edit-page: l’écran d’édition des ‘page’
  • edit-<post-type-name>: l’écran d’édition des custom post type
  • edit-<custom-taxonomy>: l’écran d’édition des custom taxonomy
  • edit-comments: l’écran d’édition des commentaires
  • plugins: l’écran d’édition des plugins
  • users: l’écran d’édition des users
  • upload: Media library list (ne fonctionne qu’en vue liste, pas en vue grille)

La variable actions

Cette variable est un tableau où vous devez déclarer trois choses:

  • slug: le nom technique de l action à réaliser
  • name: le nom lisible dans le select des actions
  • function: l’action à réaliser, elle prend en paramètre l’id du ‘post’

Par exemple pour initialiser deux actions sur un custom post type ‘inscription », ça donne ceci:

$actions = [
  [
    'slug' => 'validate',
    'name' => 'Valider',
    'function' => function($id) {
      // le code de ce que tu veux faire, ici un exemple basic avec ACF
      update_field('sac', 'ça valide !', $id);
    },
  ],[
    'slug' => 'invalidate',
    'name' => 'Invalider',
    'function' => function($id) {
      // le code de ce que tu veux faire, ici un exemple basic avec ACF
      update_field('sac', 'ça valide pas !', $id);
    },
  ],
];
$ba_inscription = new BulkAction('edit-inscription', $actions);

Ajouter la class bulk actions dans votre thème

Avant toutes choses, vous devez ajouter le fichier dans votre thème WordPress en insérant cette ligne dans votre fichier functions.php ( et en plaçant le fichier bulk_action.php à la racine du thème ).

require_once 'bulk_action.php'; 

Ensuite collez y le code suivant:

<?php
class BulkAction{
  function __construct($screen, $actions)
  {
    $this->screen = $screen;
    $this->actions = $actions;
    // sert à netoyer les urls si on utilise plusieurs actions à la suite
    $this->query_args_to_remove = [];
    foreach ($this->actions as $custom_action) {
      $this->query_args_to_remove[] = $custom_action['slug'];
    }

    // on ajoute les fonction à la liste dans le select
    add_filter('bulk_actions-'.$this->screen, function ($bulk_actions) {
      foreach ($this->actions as $action) {
        $bulk_actions[$action['slug']] = $action['name'];
      }
      return $bulk_actions;
    });

    // l'action à executé
    add_filter('handle_bulk_actions-'.$this->screen, function($redirect_url, $action, $post_ids) {
      $redirect_url = remove_query_arg($this->query_args_to_remove, false);
      foreach ($this->actions as $custom_action) {
        if ($action === $custom_action['slug']) {
          foreach ($post_ids as $post_id) {
            $custom_action['function']($post_id);
            $redirect_url = add_query_arg($custom_action['slug'], count($post_ids), $redirect_url);
          }
        }
      }
      return $redirect_url;
    }, 10, 3);

    // affichage du message
    add_action('admin_notices', function() {
      foreach ($this->actions as $key => $custom_action) {
        if (!empty($_REQUEST[$custom_action['slug']])) {
          $num_changed = (int) $_REQUEST[$custom_action['slug']];
          echo '<div class="notice notice-success is-dismissable"><p>Action '.$custom_action['name'].' sur '.$num_changed.' articles réussie.</p></div>';
        }
      }
    });
  }
}

Voilà, maintenant vous pouvez invoquer les démons du 7eme cercle avec du sang de poulet vivant ! Joie !
En ce qui me concerne, je vais me coucher, bien bonne nuit à vous.

htmlcss.fr Des tutos ou tutoriels Wordpress, html, php ou javascript.

François Riant

Je m’appelle François Riant. Je travail dans les métiers du web depuis 2006. Mon expérience m’a amené à changer plusieurs fois de technologie.

Aujourd’hui je cherche à partager mon expérience et j’y trouve du de plaisir. Je travail actuellement chez W2P Digital.
Je ne prends donc pas de mission en freelance.

Si vous avez une remarque ou une question; vous pouvez me joindre sur francois.riant@gmail.com