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.

(Foto von Pat Whelen auf Unsplash)

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