PluginProbe
WANotifier for Forms and Actions / trunk
WANotifier for Forms and Actions vtrunk
3.1.1 3.1.0 3.0.4 2.7.10 2.7.11 2.7.12 2.7.13 2.7.2 2.7.3 2.7.4 2.7.5 2.7.6 2.7.7 2.7.8 2.7.9 3.0.0 3.0.1 3.0.2 3.0.3 trunk 0.1.0 0.1.1 1.0.0 1.0.1 1.0.2 All 67 releases
notifier / libraries / action-scheduler / classes / migration / Controller.php

Controller.php in WANotifier for Forms and Actions trunk, at libraries/action-scheduler/classes/migration/Controller.php

252 lines 6.4 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2
3 namespace Action_Scheduler\Migration;
4
5 use ActionScheduler_DataController;
6 use ActionScheduler_LoggerSchema;
7 use ActionScheduler_StoreSchema;
8 use Action_Scheduler\WP_CLI\ProgressBar;
9
10 /**
11 * Class Controller
12 *
13 * The main plugin/initialization class for migration to custom tables.
14 *
15 * @package Action_Scheduler\Migration
16 *
17 * @since 3.0.0
18 *
19 * @codeCoverageIgnore
20 */
21 class Controller {
22 /**
23 * Instance.
24 *
25 * @var self
26 */
27 private static $instance;
28
29 /**
30 * Scheduler instance.
31 *
32 * @var Action_Scheduler\Migration\Scheduler
33 */
34 private $migration_scheduler;
35
36 /**
37 * Class name of the store object.
38 *
39 * @var string
40 */
41 private $store_classname;
42
43 /**
44 * Class name of the logger object.
45 *
46 * @var string
47 */
48 private $logger_classname;
49
50 /**
51 * Flag to indicate migrating custom store.
52 *
53 * @var bool
54 */
55 private $migrate_custom_store;
56
57 /**
58 * Controller constructor.
59 *
60 * @param Scheduler $migration_scheduler Migration scheduler object.
61 */
62 protected function __construct( Scheduler $migration_scheduler ) {
63 $this->migration_scheduler = $migration_scheduler;
64 $this->store_classname = '';
65 }
66
67 /**
68 * Set the action store class name.
69 *
70 * @param string $class Classname of the store class.
71 *
72 * @return string
73 */
74 public function get_store_class( $class ) {
75 if ( \ActionScheduler_DataController::is_migration_complete() ) {
76 return \ActionScheduler_DataController::DATASTORE_CLASS;
77 } elseif ( \ActionScheduler_Store::DEFAULT_CLASS !== $class ) {
78 $this->store_classname = $class;
79 return $class;
80 } else {
81 return 'ActionScheduler_HybridStore';
82 }
83 }
84
85 /**
86 * Set the action logger class name.
87 *
88 * @param string $class Classname of the logger class.
89 *
90 * @return string
91 */
92 public function get_logger_class( $class ) {
93 \ActionScheduler_Store::instance();
94
95 if ( $this->has_custom_datastore() ) {
96 $this->logger_classname = $class;
97 return $class;
98 } else {
99 return \ActionScheduler_DataController::LOGGER_CLASS;
100 }
101 }
102
103 /**
104 * Get flag indicating whether a custom datastore is in use.
105 *
106 * @return bool
107 */
108 public function has_custom_datastore() {
109 return (bool) $this->store_classname;
110 }
111
112 /**
113 * Set up the background migration process.
114 *
115 * @return void
116 */
117 public function schedule_migration() {
118 $logging_tables = new ActionScheduler_LoggerSchema();
119 $store_tables = new ActionScheduler_StoreSchema();
120
121 /*
122 * In some unusual cases, the expected tables may not have been created. In such cases
123 * we do not schedule a migration as doing so will lead to fatal error conditions.
124 *
125 * In such cases the user will likely visit the Tools > Scheduled Actions screen to
126 * investigate, and will see appropriate messaging (this step also triggers an attempt
127 * to rebuild any missing tables).
128 *
129 * @see https://github.com/woocommerce/action-scheduler/issues/653
130 */
131 if (
132 ActionScheduler_DataController::is_migration_complete()
133 || $this->migration_scheduler->is_migration_scheduled()
134 || ! $store_tables->tables_exist()
135 || ! $logging_tables->tables_exist()
136 ) {
137 return;
138 }
139
140 $this->migration_scheduler->schedule_migration();
141 }
142
143 /**
144 * Get the default migration config object
145 *
146 * @return ActionScheduler\Migration\Config
147 */
148 public function get_migration_config_object() {
149 static $config = null;
150
151 if ( ! $config ) {
152 $source_store = $this->store_classname ? new $this->store_classname() : new \ActionScheduler_wpPostStore();
153 $source_logger = $this->logger_classname ? new $this->logger_classname() : new \ActionScheduler_wpCommentLogger();
154
155 $config = new Config();
156 $config->set_source_store( $source_store );
157 $config->set_source_logger( $source_logger );
158 $config->set_destination_store( new \ActionScheduler_DBStoreMigrator() );
159 $config->set_destination_logger( new \ActionScheduler_DBLogger() );
160
161 if ( defined( 'WP_CLI' ) && WP_CLI ) {
162 $config->set_progress_bar( new ProgressBar( '', 0 ) );
163 }
164 }
165
166 return apply_filters( 'action_scheduler/migration_config', $config ); // phpcs:ignore WordPress.NamingConventions.ValidHookName.UseUnderscores
167 }
168
169 /**
170 * Hook dashboard migration notice.
171 */
172 public function hook_admin_notices() {
173 if ( ! $this->allow_migration() || \ActionScheduler_DataController::is_migration_complete() ) {
174 return;
175 }
176 add_action( 'admin_notices', array( $this, 'display_migration_notice' ), 10, 0 );
177 }
178
179 /**
180 * Show a dashboard notice that migration is in progress.
181 */
182 public function display_migration_notice() {
183 wp_admin_notice(
184 __( 'Action Scheduler migration in progress. The list of scheduled actions may be incomplete.', 'action-scheduler' ),
185 array(
186 'type' => 'warning',
187 'paragraph_wrap' => true,
188 )
189 );
190 }
191
192 /**
193 * Add store classes. Hook migration.
194 */
195 private function hook() {
196 add_filter( 'action_scheduler_store_class', array( $this, 'get_store_class' ), 100, 1 );
197 add_filter( 'action_scheduler_logger_class', array( $this, 'get_logger_class' ), 100, 1 );
198 add_action( 'init', array( $this, 'maybe_hook_migration' ) );
199 add_action( 'wp_loaded', array( $this, 'schedule_migration' ) );
200
201 // Action Scheduler may be displayed as a Tools screen or WooCommerce > Status administration screen.
202 add_action( 'load-tools_page_action-scheduler', array( $this, 'hook_admin_notices' ), 10, 0 );
203 add_action( 'load-woocommerce_page_wc-status', array( $this, 'hook_admin_notices' ), 10, 0 );
204 }
205
206 /**
207 * Possibly hook the migration scheduler action.
208 */
209 public function maybe_hook_migration() {
210 if ( ! $this->allow_migration() || \ActionScheduler_DataController::is_migration_complete() ) {
211 return;
212 }
213
214 $this->migration_scheduler->hook();
215 }
216
217 /**
218 * Allow datastores to enable migration to AS tables.
219 */
220 public function allow_migration() {
221 if ( ! \ActionScheduler_DataController::dependencies_met() ) {
222 return false;
223 }
224
225 if ( null === $this->migrate_custom_store ) {
226 $this->migrate_custom_store = apply_filters( 'action_scheduler_migrate_data_store', false );
227 }
228
229 return ( ! $this->has_custom_datastore() ) || $this->migrate_custom_store;
230 }
231
232 /**
233 * Proceed with the migration if the dependencies have been met.
234 */
235 public static function init() {
236 if ( \ActionScheduler_DataController::dependencies_met() ) {
237 self::instance()->hook();
238 }
239 }
240
241 /**
242 * Singleton factory.
243 */
244 public static function instance() {
245 if ( ! isset( self::$instance ) ) {
246 self::$instance = new static( new Scheduler() );
247 }
248
249 return self::$instance;
250 }
251 }
252