WordPress: Eigene Sammelaktionen (Bulk-Actions) definieren

2016-10-20_16-37-31

Hinweis: Dieser Beitrag beschreibt ein Feature, das erst in Version 4.7 verfügbar ist (geplanter Veröffentlichungstermin: 6. Dezember 2016).

Bisher war es schwierig, eigene Sammelaktionen in WordPress hinzuzufügen. Version 4.7 hat einen Hook erhalten, mit dem man einfach die Sammelaktionen erweitern kann.

add_action('bulk_actions-{screen_id}', 'my_bulk_action');

Hook anlegen

Als Beispiel nehme ich die Beiträge-Seite, dementsprechend sind die Variablen benannt.

add_filter( 'bulk_actions-edit-post', 'register_my_bulk_actions' );

function register_my_bulk_actions($bulk_actions) {
  $bulk_actions['my_bulk_action'] = __( 'My Bulk Action', 'domain');
  $bulk_actions['my_other_bulk_action'] = __( 'My Other Bulk Action', 'domain');
  return $bulk_actions;
}

Man kann mehr als eine Sammelaktion in dieser Funktion definieren, denn hier passiert nichts anderes, als dass dem Feld $bulk_actions ein weiteres Element zugefügt wird. Man muss lediglich darauf achten, dass man unterschiedliche Elementschlüssel und, sinnvollerweise, unterschiedliche Anzeigetexte verwendet.

Die Screen-IDs

Die „Screen-ID“ einer Seite kann mit diesem Code ermittelt werden:

$screen = get_current_screen();
var_dump($screen);

Die folgende Tabelle listet die IDs der wichtigsten Seiten auf:

[table id=2 /]

Callback-Funktion definieren

Zur Übersicht erst einmal die gesamte Funktion:

add_filter( 'handle_bulk_actions-edit-post', 'my_bulk_action_handler', 10, 3 );

function my_bulk_action_handler( $redirect_to, $action_name, $post_ids ) {

  if ( 'my_bulk_action' === $action_name ) {
    foreach ( $post_ids as $post_id ) {
      $post = get_post($post_id);
      // $post bearbeiten.
      wp_update_post($post);
  }
  $redirect_to = add_query_arg( 'bulk_posts_processed', count( $post_ids ), $redirect_to );
  return $redirect_to;
}

  elseif ( 'my_other_bulk_action' === $action_name ) {
    foreach ( $post_ids as $post_id ) {
      $post_meta = get_post_meta($post_id);
      // $post_meta bearbeiten
      update_post_meta($post_meta);
    }
    $redirect_to = add_query_arg( 'other_bulk_posts_precessed', count(   $post_ids ), $redirect_to );
    return $redirect_to;
  }
  else
    return $redirect_to;
}

Wie oben beschrieben, kann man mehr als eine eigene Sammelaktionen definieren, aber nur eine Aktion-Callback-Funktion. In dieser Funktion muss man deshalb zunächst abfragen, welche Sammelaktion ausgewählt wurde (Zeilen 3 und 12).
Als nächstes werden die Beiträge mit einer foreach -Schleife jeweils einzeln abgearbeitet. In dieser Schleife man z.B. mit get_post() oder get_post_meta() den jeweiligen Beitrag laden und bearbeiten.
Anschließend werden die die geänderten Daten mit wp_update_post($post) oder update_post_meta($post) zurück in die Datenbank geschrieben.
Die Variable $redirect_to gibt an, zu welcher URI der Browser wechselt, nachdem die Sammelaktion abgeschlossen ist, in unserem Fall …/wp-admin/edit.php?paged=1 . Wir wollen allerdings nicht die Seite ändern, zu der der Browser geleitet wird, sondern die Variable benutzen, um einen Wert zu übergeben. Mit der Funktion add_query_arg() fügen wir ein Argument zu der URL hinzu, der die Anzahl der bearbeiteten Beiträge angibt: …/wp-admin/edit.php?paged=1&bulk_posts_processed=1 (Zeilen 11 und 21).

Erfolgsmeldung ausgeben

Nach Abschluss der Sammelaktion kann eine Erfolgsmeldung („admin notice“) mittels der Aktion admin_notices ausgeben werden. Der zweite Parameter muss den Textstring enthalten, den wir im Filter bulk_actions-{screen-id} definiert haben.

add_action( 'admin_notices', 'my_bulk_action_admin_notice' );
function my_bulk_action_admin_notice() {
if ( ! empty( $_REQUEST['bulk_posts_processed'] ) ) {
$posts_count = intval( $_REQUEST['bulk_posts_processed'] );
printf( '
' . _n( 'Processed %s post.', 'Processed %s posts.', $posts_count, 'add_asterix' ) . '
', $posts_count ); } }

Die Anzahl der bearbeiteten Elemente können wir über den URL-Parameter bulk_posts_processed  ermitteln, den wir vorher mit $redirect_to = add_query_arg() hinzugefügt haben.

Trivia

Zum Schluss ein kleiner Fun Fact: Das entsprechende Ticket (https://core.trac.wordpress.org/ticket/16031“ title=“Linkificator: https://core.trac.wordpress.org/ticket/16031„>https://core.trac.wordpress.org/ticket/16031“ target=“_blank“>#16031) wurde vor sechs Jahren eröffnet, also 2010, da waren wir bei WordPress v3.0.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.