From eb221dd670883c95106620739bd9214a0d1b2415 Mon Sep 17 00:00:00 2001
From: Erick Hitter <git-contrib@ethitter.com>
Date: Sun, 26 May 2019 11:59:09 -0700
Subject: [PATCH] Begin adding bulk actions

---
 ...lass-wp-revisions-control-bulk-actions.php | 105 ++++++++++++++++++
 inc/class-wp-revisions-control.php            |   7 +-
 wp-revisions-control.php                      |   1 +
 3 files changed, 112 insertions(+), 1 deletion(-)
 create mode 100644 inc/class-wp-revisions-control-bulk-actions.php

diff --git a/inc/class-wp-revisions-control-bulk-actions.php b/inc/class-wp-revisions-control-bulk-actions.php
new file mode 100644
index 0000000..b8563ba
--- /dev/null
+++ b/inc/class-wp-revisions-control-bulk-actions.php
@@ -0,0 +1,105 @@
+<?php
+/**
+ * Bulk actions.
+ *
+ * @package WP_Revisions_Control
+ */
+
+/**
+ * Class WP_Revisions_Control_Bulk_Actions.
+ */
+class WP_Revisions_Control_Bulk_Actions {
+	/**
+	 * Supported post types.
+	 *
+	 * @var array
+	 */
+	protected $post_types;
+
+	/**
+	 * Custom bulk actions.
+	 *
+	 * @var array
+	 */
+	protected $actions;
+
+	/**
+	 * Constructor.
+	 *
+	 * @param array $post_types Supported post types.
+	 */
+	public function __construct( $post_types ) {
+		if ( empty( $post_types ) || ! is_array( $post_types ) ) {
+			return;
+		}
+
+		$this->post_types = $post_types;
+		$this->register_actions();
+
+		add_action( 'load-edit.php', array( $this, 'setup' ) );
+	}
+
+	/**
+	 * Register custom actions.
+	 */
+	protected function register_actions() {
+		$actions     = array();
+		$action_base = 'wp_rev_ctl_bulk_';
+
+		$actions[ $action_base . 'purge_excess' ] = __( 'Purge excess revisions', 'wp_revisions_control' );
+		$actions[ $action_base . 'purge_all' ]    = __( 'Purge ALL revisions', 'wp_revisions_control' );
+
+		$this->actions = $actions;
+	}
+
+	/**
+	 * Register various hooks.
+	 */
+	public function setup() {
+		$screen = get_current_screen();
+
+		if ( null === $screen ) {
+			return;
+		}
+
+		$post_types = array_keys( $this->post_types );
+
+		if ( ! in_array( $screen->post_type, $post_types, true ) ) {
+			return;
+		}
+
+		if ( 'edit' !== $screen->base ) {
+			return;
+		}
+
+		add_filter( 'bulk_actions-' . $screen->id, array( $this, 'add_actions' ) );
+		add_filter( 'handle_bulk_actions-' . $screen->id, array( $this, 'handle_action' ), 10, 3 );
+	}
+
+	/**
+	 * Add our actions.
+	 *
+	 * @param string[] $actions Array of available actions.
+	 * @return array
+	 */
+	public function add_actions( $actions ) {
+		return array_merge( $actions, $this->actions );
+	}
+
+	/**
+	 * Handle our bulk actions.
+	 *
+	 * @param string $redirect_to Redirect URL.
+	 * @param string $action      Bulk action being taken.
+	 * @param array  $ids         Object IDs to manipulate.
+	 * @return string
+	 */
+	public function handle_action( $redirect_to, $action, $ids ) {
+		if ( ! array_key_exists( $action, $this->actions ) ) {
+			return $redirect_to;
+		}
+
+		// TODO: implement and add a query string to trigger a message.
+		return $redirect_to;
+	}
+}
diff --git a/inc/class-wp-revisions-control.php b/inc/class-wp-revisions-control.php
index 7386ff0..2d556ad 100644
--- a/inc/class-wp-revisions-control.php
+++ b/inc/class-wp-revisions-control.php
@@ -125,12 +125,14 @@ class WP_Revisions_Control {
 	 * Plugin title is intentionally not translatable.
 	 */
 	public function action_admin_init() {
+		$post_types = $this->get_post_types();
+
 		// Plugin setting section.
 		register_setting( $this->settings_page, $this->settings_section, array( $this, 'sanitize_options' ) );
 
 		add_settings_section( $this->settings_section, 'WP Revisions Control', array( $this, 'settings_section_intro' ), $this->settings_page );
 
-		foreach ( $this->get_post_types() as $post_type => $name ) {
+		foreach ( $post_types as $post_type => $name ) {
 			add_settings_field( $this->settings_section . '-' . $post_type, $name, array( $this, 'field_post_type' ), $this->settings_page, $this->settings_section, array( 'post_type' => $post_type ) );
 		}
 
@@ -138,6 +140,9 @@ class WP_Revisions_Control {
 		add_action( 'add_meta_boxes', array( $this, 'action_add_meta_boxes' ), 10, 2 );
 		add_action( 'wp_ajax_' . $this->settings_section . '_purge', array( $this, 'ajax_purge' ) );
 		add_action( 'save_post', array( $this, 'action_save_post' ) );
+
+		// Bulk actions.
+		new WP_Revisions_Control_Bulk_Actions( $post_types );
 	}
 
 	/**
diff --git a/wp-revisions-control.php b/wp-revisions-control.php
index 1b09aca..0bf1b26 100644
--- a/wp-revisions-control.php
+++ b/wp-revisions-control.php
@@ -30,4 +30,5 @@
  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
  */
 
+require_once __DIR__ . '/inc/class-wp-revisions-control-bulk-actions.php';
 require_once __DIR__ . '/inc/class-wp-revisions-control.php';
-- 
GitLab