WordPress: Eigene Sammelaktionen (Bulk-Actions) definieren

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 hinzu zu fü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');

Die Screen-IDs

Seite$screen_idDatei
Mediathekuploadupload.php
Kommentareedit-commentsedit-comments.php
Schlagwörteredit-post_tagedit-tags.php
Pluginspluginsplugins.php
Linkslink-managerlink-manager.php
Benutzerusersusers.php
Beiträgeedit-postedit.php
Seitenedit-pageedit.php
themes-networknetwork/site-themes.php
network/themes
network/users
network/site-users
network/sites

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 Aktion 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.

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 Aktions-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 gä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 . 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 .

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 ermitteln, den wir vorher mit $redirect_to = add_query_arg()  hinzugefügt haben.

Trivia

Zum Schluss ein kleiner Fun Fact: Das entsprechende Ticket (#16031) wurde vor sechs Jahren eröffnet, also 2010, da waren wir bei WordPress v3.0.


Comments

Leave a Reply

Your email address will not be published. Required fields are marked *

To respond on your own website, enter the URL of your response which should contain a link to this post’s permalink URL. Your response will then appear (possibly after moderation) on this page. Want to update or remove your response? Update or delete your post and re-enter your post’s URL again. (Find out more about Webmentions.)