{"id":538,"date":"2016-10-19T14:30:06","date_gmt":"2016-10-19T12:30:06","guid":{"rendered":"http:\/\/elektroelch.de\/draft\/?p=538"},"modified":"2016-10-20T16:08:01","modified_gmt":"2016-10-20T14:08:01","slug":"wordpress-eigene-sammelaktionen-bulk-actions-definieren","status":"publish","type":"post","link":"https:\/\/elektroelch.de\/drafts\/2016\/10\/19\/wordpress-eigene-sammelaktionen-bulk-actions-definieren\/","title":{"rendered":"WordPress: Eigene Sammelaktionen (Bulk-Actions) definieren"},"content":{"rendered":"<p><strong>Hinweis:<\/strong> Dieser Beitrag beschreibt ein Feature, das erst in Version 4.7 verf\u00fcgbar ist (geplanter Ver\u00f6ffentlichungstermin: 6. Dezember 2016).<\/p>\n<p>Bisher war es schwierig, eigene Sammelaktionen in WordPress hinzu zu f\u00fcgen. Version 4.7 hat einen Hook erhalten, mit dem man einfach die Sammelaktionen erweitern kann.<\/p>\n<pre class=\"\" lang=\"php\">add_action('bulk_actions-{screen_id}', 'my_bulk_action');<\/pre>\n<h3>Die Screen-IDs<\/h3>\n<p>[table id=1 \/]<\/p>\n<h3>Hook anlegen<\/h3>\n<p>Als Beispiel nehme ich die Beitr\u00e4ge-Seite, dementsprechend sind die Variablen benannt.<\/p>\n<pre class=\"\" lang=\"php\">add_filter( 'bulk_actions-edit-post', 'register_my_bulk_actions' );\r\n\r\nfunction register_my_bulk_actions($bulk_actions) {\r\n  $bulk_actions['my_bulk_action'] = __( 'My Bulk Action', 'domain');\r\n  $bulk_actions['my_other_bulk_action'] = __( 'My Other Bulk Action', 'domain');\r\n  return $bulk_actions;\r\n}\r\n<\/pre>\n<p>Man kann mehr als eine Aktion in dieser Funktion definieren, denn hier passiert nichts anderes, als dass dem Feld\u00a0<span class=\"lang:default decode:true crayon-inline \">$bulk_actions<\/span>\u00a0 ein weiteres Element zugef\u00fcgt wird. Man muss lediglich darauf achten, dass man unterschiedliche Elementschl\u00fcssel und, sinnvollerweise, unterschiedliche Anzeigetexte verwendet.<\/p>\n<h3>Callback-Funktion definieren<\/h3>\n<p>Zur \u00dcbersicht erst einmal die gesamte Funktion:<\/p>\n<pre class=\"\" lang=\"php\">add_filter( 'handle_bulk_actions-edit-post', 'my_bulk_action_handler', 10, 3 );\r\n\r\nfunction my_bulk_action_handler( $redirect_to, $action_name, $post_ids ) {\r\n\r\n  if ( 'my_bulk_action' === $action_name ) {\r\n    foreach ( $post_ids as $post_id ) {\r\n      $post = get_post($post_id);\r\n      \/\/ $post bearbeiten.\r\n      wp_update_post($post);\r\n  }\r\n  $redirect_to = add_query_arg( 'bulk_posts_processed', count( $post_ids ), $redirect_to );\r\n  return $redirect_to;\r\n}\r\n\r\n  elseif ( 'my_other_bulk_action' === $action_name ) {\r\n    foreach ( $post_ids as $post_id ) {\r\n      $post_meta = get_post_meta($post_id);\r\n      \/\/ $post_meta bearbeiten\r\n      update_post_meta($post_meta);\r\n    }\r\n    $redirect_to = add_query_arg( 'other_bulk_posts_precessed', count(   $post_ids ), $redirect_to );\r\n    return $redirect_to;\r\n  }\r\n  else\r\n    return $redirect_to;\r\n}\r\n<\/pre>\n<p>Wie oben beschrieben, kann man mehr als eine eigene Sammelaktionen definieren, aber nur eine Aktions-Callback-Funktion. In dieser Funktion muss man deshalb zun\u00e4chst abfragen, welche Sammelaktion ausgew\u00e4hlt wurde (Zeilen 3 und 12).<br \/>\nAls n\u00e4chstes werden die Beitr\u00e4ge mit einer <span class=\"lang:default decode:true crayon-inline \">foreach<\/span>\u00a0-Schleife jeweils einzeln abgearbeitet. In dieser Schleife man z.B. mit <a href=\"https:\/\/developer.wordpress.org\/reference\/functions\/get_post\/\" target=\"_blank\">get_post()<\/a> oder <a href=\"https:\/\/developer.wordpress.org\/reference\/functions\/get_post_meta\/\" target=\"_blank\">get_post_meta()<\/a> den jeweiligen Beitrag laden und bearbeiten.<br \/>\nAnschlie\u00dfend werden die die g\u00e4nderten Daten mit <span class=\"lang:default decode:true crayon-inline \">wp_update_post($post)<\/span>\u00a0 oder <span class=\"lang:default decode:true crayon-inline \">update_post_meta($post)<\/span>\u00a0 zur\u00fcck in die Datenbank geschrieben.<br \/>\nDie Variable <span class=\"lang:default decode:true crayon-inline \">$redirect_to<\/span>\u00a0 gibt an, zu welcher URI der Browser wechselt, nachdem die Sammelaktion abgeschlossen ist, in unserem Fall <span class=\"lang:default decode:true crayon-inline \">&#8230;\/wp-admin\/edit.php?paged=1<\/span>\u00a0. Mit der Funktion<span class=\"lang:default decode:true crayon-inline \"> add_query_arg()<\/span>\u00a0 f\u00fcgen wir ein Argument zu der URL hinzu, der die Anzahl der bearbeiteten Beitr\u00e4ge angibt: <span class=\"lang:default decode:true crayon-inline \">&#8230;\/wp-admin\/edit.php?paged=1&amp;bulk_posts_processed=1<\/span> .<\/p>\n<h3>Erfolgsmeldung ausgeben<\/h3>\n<p>Nach Abschluss der Sammelaktion kann eine Erfolgsmeldung (&#8220;admin notice&#8221;) mittels der Aktion <span class=\"lang:default decode:true crayon-inline \">admin_notices<\/span>\u00a0 ausgeben werden. Der zweite Parameter muss den Textstring enthalten, den wir im Filter <span class=\"lang:default decode:true crayon-inline \">bulk_actions-{screen-id}<\/span>\u00a0 definiert haben.<\/p>\n<pre class=\"lang:php decode:true\">add_action( 'admin_notices', 'my_bulk_action_admin_notice' );\r\n\r\nfunction my_bulk_action_admin_notice() {\r\n\tif ( ! empty( $_REQUEST['bulk_posts_processed'] ) ) {\r\n\t\t$posts_count = intval( $_REQUEST['bulk_posts_processed'] );\r\n\t\tprintf( '\r\n<div id=\"message\" class=\"updated fade\">' . _n( 'Processed %s post.', 'Processed %s posts.', $posts_count, 'add_asterix' ) . '<\/div>\r\n', $posts_count ); \r\n  } \r\n}\r\n<\/pre>\n<p>Die Anzahl der bearbeiteten Elemente k\u00f6nnen wir \u00fcber den URL-Parameter ermitteln, den wir vorher mit <span class=\"lang:default decode:true crayon-inline\">$redirect_to = add_query_arg()<\/span>\u00a0 hinzugef\u00fcgt haben.<\/p>\n<h3>Trivia<\/h3>\n<p>Zum Schluss ein kleiner <em>Fun Fact<\/em>: Das entsprechende Ticket (<a href=\"https:\/\/core.trac.wordpress.org\/ticket\/16031\" target=\"_blank\">#16031<\/a>) wurde vor sechs Jahren er\u00f6ffnet, also 2010, da waren wir bei WordPress v3.0.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Hinweis: Dieser Beitrag beschreibt ein Feature, das erst in Version 4.7 verf\u00fcgbar ist (geplanter Ver\u00f6ffentlichungstermin: 6. Dezember 2016). Bisher war es schwierig, eigene Sammelaktionen in WordPress hinzu zu f\u00fcgen. Version 4.7 hat einen Hook erhalten, mit dem man einfach die Sammelaktionen erweitern kann. add_action(&#8216;bulk_actions-{screen_id}&#8217;, &#8216;my_bulk_action&#8217;); Die Screen-IDs [table id=1 \/] Hook anlegen Als Beispiel nehme [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"webmentions_disabled_pings":false,"webmentions_disabled":false,"activitypub_content_warning":"","activitypub_content_visibility":"","activitypub_max_image_attachments":4,"activitypub_interaction_policy_quote":"anyone","activitypub_status":"","footnotes":""},"categories":[1],"tags":[],"class_list":["post-538","post","type-post","status-publish","format-standard","hentry","category-allgemein"],"_links":{"self":[{"href":"https:\/\/elektroelch.de\/drafts\/wp-json\/wp\/v2\/posts\/538","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/elektroelch.de\/drafts\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/elektroelch.de\/drafts\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/elektroelch.de\/drafts\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/elektroelch.de\/drafts\/wp-json\/wp\/v2\/comments?post=538"}],"version-history":[{"count":54,"href":"https:\/\/elektroelch.de\/drafts\/wp-json\/wp\/v2\/posts\/538\/revisions"}],"predecessor-version":[{"id":588,"href":"https:\/\/elektroelch.de\/drafts\/wp-json\/wp\/v2\/posts\/538\/revisions\/588"}],"wp:attachment":[{"href":"https:\/\/elektroelch.de\/drafts\/wp-json\/wp\/v2\/media?parent=538"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/elektroelch.de\/drafts\/wp-json\/wp\/v2\/categories?post=538"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/elektroelch.de\/drafts\/wp-json\/wp\/v2\/tags?post=538"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}