`"-U+U=+#-UPUA+#-U`UA"-UU<$-UpUH!#-UpHX$-Up0HP,'-U0[H##-U@P "]G`"-U@+^=+#-U0P^A+#-U `^A"-U0^<$-U0 ^H!#-U _H!#-U H!#-U H!#-U jH`"-U+k=+#-UPkA+#-U`kA"-U@k<$-U@ kH`"-U+l=+#-UpPlA+#-U``lA"-UPl<$-UP0 lHX$-U 0lH##-U`oG`"-U+p=+#-UPpA+#-U`pA"-Upp<$-Up`pH!#-U`qH!#-U`rH!#-U`H`"-U+t=+#-UPtA+#-U`tA"-Ut<$-UP`tH`"-U@+u=+#-U0PuA+#-U `uA"-Uu<$-U`uHX$-U`0uH##-UxG`"-U+y=+#-UPyA+#-U`yA"-Uy<$-UpyH!#-U`pzH!#-U`p{H`"-U`+|=+#-UPP|A+#-U@`|A"-U|<$-U|H`"-U+}=+#-UP}A+#-U`}A"-U}<$-U}H`"-U+=+#-UPA+#-U`A"-U<s#-UPG0K$-U@HX$-U0H##-U G`"-U+=+#-UPA+#-U`A"-U<$-UH!#-UH`"-U+=+#-UPA+#-U`A"-U <$-U `H`"-UP,=+#-U@PA+#-U0`A"-U0<$-U0H&-UH!#-UHX$-U0H"'-U0`"-U`,=+#-UPAp"-UP#-UP`.`"-U@,=+#-U0PA"-Up<$-Up#-U`4`#-U`+##-UG`"-U,=+#-UPA+#-U`A"-U<$-U`H!#-UP`H!#-UP`H`"-UP ,=+#-U@PA+#-U0`A"-U<$-UH`"-U(,=+#-UPA+#-U`A"-U<$-UH`"-U0,=+#-UPA+#-Up`A"-U<s#-U@G[ static::PHASE_MIGRATION_NOT_REQUIRED, static::PHASE_MIGRATION_COMPLETE ] ); } /** * Check if we should allow a reverse migration action to occur. There is an expiration period of time for how long * we allow someone to reverse. * * @since 6.0.0 * * @return bool * * @throws \Exception */ public function should_allow_reverse_migration() { // If we have not migrated yet, don't block reversing. if ( ! $this->is_migrated() ) { return true; } // Missing our timestamp for some reason? if ( ! $this->get( 'complete_timestamp' ) ) { return true; } $current_date = ( new \DateTime( 'now', wp_timezone() ) ); $date_completed = ( new \DateTime( 'now', wp_timezone() ) )->setTimestamp( $this->get( 'complete_timestamp' ) ); // 8 day old expiration $expires_in_seconds = 8 * 24 * 60 * 60; // If time for our reverse migration has expired return ( $current_date->format( 'U' ) - $expires_in_seconds ) < $date_completed->format( 'U' ); } /** * Returns whether there is work being done. Does not only check for an in progress migration. * * @since 6.0.0 * * @return bool Whether some worker actions are in flight. */ public function is_running() { $states = [ self::PHASE_MIGRATION_IN_PROGRESS, self::PHASE_PREVIEW_IN_PROGRESS, self::PHASE_CANCEL_IN_PROGRESS, self::PHASE_REVERT_IN_PROGRESS, self::PHASE_MIGRATION_FAILURE_IN_PROGRESS, ]; return in_array( $this->get_phase(), $states, true ); } /** * Checks the phases we want to lock out access to certain features. * * @since 6.0.0 * * @return bool Whether we should lock the site for maintenance mode. */ public function should_lock_for_maintenance() { $states = [ self::PHASE_MIGRATION_IN_PROGRESS, self::PHASE_CANCEL_IN_PROGRESS, self::PHASE_REVERT_IN_PROGRESS, self::PHASE_MIGRATION_FAILURE_IN_PROGRESS, ]; return in_array( $this->get_phase(), $states, true ); } /** * Returns whether the migration is required or not. * * @since 6.0.0 * * @return bool Whether the migration is required or not. */ public function is_required() { $phase = $this->get_phase(); if ( in_array( $phase, [ self::PHASE_MIGRATION_NOT_REQUIRED, self::PHASE_MIGRATION_COMPLETE ], true ) ) { return false; } return true; } /** * Returns the current migration phase the site is in. * * @since 6.0.0 * * @return string The current migration phase the site is in. */ public function get_phase() { return $this->data['phase']; } /** * Returns a value for a specific data key or nested data key. * * @since 6.0.0 * * @param string ...$keys A set of one or more indexes to get the * value of. * * @return mixed|null The value of the requested index, or nested indexed, or `null` * if not defined. */ public function get( ...$keys ) { return Arr::get( $this->data, $keys, null ); } /** * Set a value for the migration state. * * @since 6.0.0 * * @param ...$keys string The key(s) of the value to store. * @param $value mixed The value to store. */ public function set( ...$keys ) { $value = array_pop( $keys ); $this->data = Arr::set( $this->data, $keys, $value ); } /** * Save our current state. * * @since 6.0.0 */ public function save() { // This will return `false` on failure to save and if the value is the same, not indicative of a failure. update_option( self::STATE_OPTION_KEY, $this->data ); } /** * Returns whether the current phase is a migration dry-run or not. * * @since 6.0.2 * * @return bool Whether the current phase is a migration dry-run or not. */ public function is_dry_run(): bool { $phase = $this->get_phase(); switch($phase) { case State::PHASE_REVERT_COMPLETE: case State::PHASE_CANCEL_COMPLETE: case State::PHASE_PREVIEW_PROMPT: case State::PHASE_PREVIEW_IN_PROGRESS: case State::PHASE_MIGRATION_FAILURE_COMPLETE: return true; default: return false; } } }