PluginProbe
Autoptimize / 3.1.2
Autoptimize v3.1.2
2.2.2 2.3.0 2.3.1 2.3.2 2.3.3 2.3.4 2.4.0 2.4.1 2.4.2 2.4.3 2.4.4 2.5.0 2.5.1 2.6.0 2.6.1 2.6.2 2.7.0 2.7.1 2.7.2 2.7.3 2.7.4 2.7.5 2.7.6 2.7.7 2.7.8 All 107 releases
autoptimize / classes / autoptimizeVersionUpdatesHandler.php

autoptimizeVersionUpdatesHandler.php in Autoptimize 3.1.2, at classes/autoptimizeVersionUpdatesHandler.php

301 lines 12.1 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2 /**
3 * Handles version updates and should only be instantiated in autoptimize.php if/when needed.
4 */
5
6 if ( ! defined( 'ABSPATH' ) ) {
7 exit;
8 }
9
10 class autoptimizeVersionUpdatesHandler
11 {
12 /**
13 * The current major version string.
14 *
15 * @var string
16 */
17 protected $current_major_version = null;
18
19 public function __construct( $current_version )
20 {
21 $this->current_major_version = substr( $current_version, 0, 3 );
22 }
23
24 /**
25 * Runs all needed upgrade procedures (depending on the
26 * current major version specified during class instantiation)
27 */
28 public function run_needed_major_upgrades()
29 {
30 $major_update = false;
31
32 switch ( $this->current_major_version ) {
33 case '1.6':
34 $this->upgrade_from_1_6();
35 $major_update = true;
36 // No break, intentionally, so all upgrades are ran during a single request...
37 case '1.7':
38 $this->upgrade_from_1_7();
39 $major_update = true;
40 // No break, intentionally, so all upgrades are ran during a single request...
41 case '1.9':
42 $this->upgrade_from_1_9();
43 $major_update = true;
44 // No break, intentionally, so all upgrades are ran during a single request...
45 case '2.2':
46 $this->upgrade_from_2_2();
47 $major_update = true;
48 // No break, intentionally, so all upgrades are ran during a single request...
49 case '2.4':
50 if ( autoptimizeOptionWrapper::get_option( 'autoptimize_version', 'none' ) == '2.4.2' ) {
51 $this->upgrade_from_2_4_2();
52 }
53 $this->upgrade_from_2_4();
54 $major_update = false;
55 // No break, intentionally, so all upgrades are ran during a single request...
56 case '2.7':
57 $this->upgrade_from_2_7();
58 $major_update = true;
59 // No break, intentionally, so all upgrades are ran during a single request...
60 case '2.8':
61 // nothing.
62 case '2.9':
63 if ( version_compare( autoptimizeOptionWrapper::get_option( 'autoptimize_version', 'none' ), '2.9.999', 'lt' ) ) {
64 $this->upgrade_from_2_9_before_compatibility();
65 }
66 $major_update = false;
67 // No break, intentionally, so all upgrades are ran during a single request...
68 case '3.0':
69 // nothing.
70 case '3.1':
71 $this->upgrade_from_3_1();
72 $major_update = false;
73 }
74
75 if ( true === $major_update ) {
76 $this->on_major_version_update();
77 }
78 }
79
80 /**
81 * Checks specified version against the one stored in the database under `autoptimize_version` and performs
82 * any major upgrade routines if needed.
83 * Updates the database version to the specified $target if it's different to the one currently stored there.
84 *
85 * @param string $target Target version to check against (ie., the currently running one).
86 */
87 public static function check_installed_and_update( $target )
88 {
89 $db_version = autoptimizeOptionWrapper::get_option( 'autoptimize_version', 'none' );
90 if ( $db_version !== $target ) {
91 if ( 'none' === $db_version ) {
92 add_action( 'admin_notices', 'autoptimizeMain::notice_installed' );
93 } else {
94 $updater = new self( $db_version );
95 $updater->run_needed_major_upgrades();
96 }
97
98 // Versions differed, upgrades happened if needed, store the new version.
99 autoptimizeOptionWrapper::update_option( 'autoptimize_version', $target );
100 }
101 }
102
103 /**
104 * Called after any major version update (and it's accompanying upgrade procedure)
105 * has happened. Clears cache and sets an admin notice.
106 */
107 protected function on_major_version_update()
108 {
109 // The transients guard here prevents stale object caches from busting the cache on every request.
110 if ( false == get_transient( 'autoptimize_stale_option_buster' ) ) {
111 set_transient( 'autoptimize_stale_option_buster', 'Mamsie & Liessie zehhe: ZWIJH!', HOUR_IN_SECONDS );
112 autoptimizeCache::clearall();
113 add_action( 'admin_notices', 'autoptimizeMain::notice_updated' );
114 }
115 }
116
117 /**
118 * From back in the days when I did not yet consider multisite.
119 */
120 private function upgrade_from_1_6()
121 {
122 // If user was on version 1.6.x, force advanced options to be shown by default.
123 autoptimizeOptionWrapper::update_option( 'autoptimize_show_adv', '1' );
124
125 // And remove old options.
126 $to_delete_options = array(
127 'autoptimize_cdn_css',
128 'autoptimize_cdn_css_url',
129 'autoptimize_cdn_js',
130 'autoptimize_cdn_js_url',
131 'autoptimize_cdn_img',
132 'autoptimize_cdn_img_url',
133 'autoptimize_css_yui',
134 );
135 foreach ( $to_delete_options as $del_opt ) {
136 delete_option( $del_opt );
137 }
138 }
139
140 /**
141 * Forces WP 3.8 dashicons in CSS exclude options when upgrading from 1.7 to 1.8
142 *
143 * @global $wpdb
144 */
145 private function upgrade_from_1_7()
146 {
147 if ( ! is_multisite() ) {
148 $css_exclude = autoptimizeOptionWrapper::get_option( 'autoptimize_css_exclude' );
149 if ( empty( $css_exclude ) ) {
150 $css_exclude = 'admin-bar.min.css, dashicons.min.css';
151 } elseif ( false === strpos( $css_exclude, 'dashicons.min.css' ) ) {
152 $css_exclude .= ', dashicons.min.css';
153 }
154 autoptimizeOptionWrapper::update_option( 'autoptimize_css_exclude', $css_exclude );
155 } else {
156 global $wpdb;
157 $blog_ids = $wpdb->get_col( "SELECT blog_id FROM $wpdb->blogs" );
158 $original_blog_id = get_current_blog_id();
159 foreach ( $blog_ids as $blog_id ) {
160 switch_to_blog( $blog_id );
161 $css_exclude = autoptimizeOptionWrapper::get_option( 'autoptimize_css_exclude' );
162 if ( empty( $css_exclude ) ) {
163 $css_exclude = 'admin-bar.min.css, dashicons.min.css';
164 } elseif ( false === strpos( $css_exclude, 'dashicons.min.css' ) ) {
165 $css_exclude .= ', dashicons.min.css';
166 }
167 autoptimizeOptionWrapper::update_option( 'autoptimize_css_exclude', $css_exclude );
168 }
169 switch_to_blog( $original_blog_id );
170 }
171 }
172
173 /**
174 * 2.0 will not aggregate inline CSS/JS by default, but we want users
175 * upgrading from 1.9 to keep their inline code aggregated by default.
176 *
177 * @global $wpdb
178 */
179 private function upgrade_from_1_9()
180 {
181 if ( ! is_multisite() ) {
182 autoptimizeOptionWrapper::update_option( 'autoptimize_css_include_inline', 'on' );
183 autoptimizeOptionWrapper::update_option( 'autoptimize_js_include_inline', 'on' );
184 } else {
185 global $wpdb;
186 $blog_ids = $wpdb->get_col( "SELECT blog_id FROM $wpdb->blogs" );
187 $original_blog_id = get_current_blog_id();
188 foreach ( $blog_ids as $blog_id ) {
189 switch_to_blog( $blog_id );
190 autoptimizeOptionWrapper::update_option( 'autoptimize_css_include_inline', 'on' );
191 autoptimizeOptionWrapper::update_option( 'autoptimize_js_include_inline', 'on' );
192 }
193 switch_to_blog( $original_blog_id );
194 }
195 }
196
197 /**
198 * 2.3 has no "remove google fonts" in main screen, moved to "extra"
199 *
200 * @global $wpdb
201 */
202 private function upgrade_from_2_2()
203 {
204 if ( ! is_multisite() ) {
205 $this->do_2_2_settings_update();
206 } else {
207 global $wpdb;
208 $blog_ids = $wpdb->get_col( "SELECT blog_id FROM $wpdb->blogs" );
209 $original_blog_id = get_current_blog_id();
210 foreach ( $blog_ids as $blog_id ) {
211 switch_to_blog( $blog_id );
212 $this->do_2_2_settings_update();
213 }
214 switch_to_blog( $original_blog_id );
215 }
216 }
217
218 /**
219 * Helper for 2.2 autoptimize_extra_settings upgrade to avoid duplicate code
220 */
221 private function do_2_2_settings_update()
222 {
223 $nogooglefont = autoptimizeOptionWrapper::get_option( 'autoptimize_css_nogooglefont', '' );
224 $ao_extrasetting = autoptimizeOptionWrapper::get_option( 'autoptimize_extra_settings', '' );
225 if ( ( $nogooglefont ) && ( empty( $ao_extrasetting ) ) ) {
226 autoptimizeOptionWrapper::update_option( 'autoptimize_extra_settings', autoptimizeConfig::get_ao_extra_default_options() );
227 }
228 delete_option( 'autoptimize_css_nogooglefont' );
229 }
230
231 /**
232 * 2.4.2 introduced too many cronned ao_cachecheckers, make this right
233 */
234 private function upgrade_from_2_4_2() {
235 // below code by Thomas Sjolshagen (http://eighty20results.com/)
236 // as found on https://www.paidmembershipspro.com/deleting-oldextra-cron-events/.
237 $jobs = _get_cron_array();
238
239 // Remove all ao_cachechecker cron jobs (for now).
240 foreach ( $jobs as $when => $job ) {
241 $name = key( $job );
242
243 if ( false !== strpos( $name, 'ao_cachechecker' ) ) {
244 unset( $jobs[ $when ] );
245 }
246 }
247
248 // Save the data.
249 _set_cron_array( $jobs );
250 }
251
252 /**
253 * Migrate imgopt options from autoptimize_extra_settings to autoptimize_imgopt_settings
254 */
255 private function upgrade_from_2_4() {
256 $extra_settings = autoptimizeOptionWrapper::get_option( 'autoptimize_extra_settings', '' );
257 $imgopt_settings = autoptimizeOptionWrapper::get_option( 'autoptimize_imgopt_settings', '' );
258 if ( empty( $imgopt_settings ) && ! empty( $extra_settings ) ) {
259 $imgopt_settings = autoptimizeConfig::get_ao_imgopt_default_options();
260 if ( array_key_exists( 'autoptimize_extra_checkbox_field_5', $extra_settings ) ) {
261 $imgopt_settings['autoptimize_imgopt_checkbox_field_1'] = $extra_settings['autoptimize_extra_checkbox_field_5'];
262 }
263 if ( array_key_exists( 'autoptimize_extra_select_field_6', $extra_settings ) ) {
264 $imgopt_settings['autoptimize_imgopt_select_field_2'] = $extra_settings['autoptimize_extra_select_field_6'];
265 }
266 autoptimizeOptionWrapper::update_option( 'autoptimize_imgopt_settings', $imgopt_settings );
267 }
268 }
269
270 /**
271 * Remove CCSS request limit option + update jquery exclusion to include WordPress 5.6 jquery.min.js.
272 */
273 private function upgrade_from_2_7() {
274 delete_option( 'autoptimize_ccss_rlimit' );
275 $js_exclusions = get_option( 'autoptimize_js_exclude', '' );
276 if ( strpos( $js_exclusions, 'js/jquery/jquery.js' ) !== false && strpos( $js_exclusions, 'js/jquery/jquery.min.js' ) === false ) {
277 $js_exclusions .= ', js/jquery/jquery.min.js';
278 autoptimizeOptionWrapper::update_option( 'autoptimize_js_exclude', $js_exclusions );
279 }
280 }
281
282 /**
283 * Set an option to indicate the AO installation predates the compatibility logic, this way we
284 * can avoid adding compatibility code that is likely not needed and maybe not wanted as it
285 * can introduce performance regressions.
286 */
287 private function upgrade_from_2_9_before_compatibility() {
288 autoptimizeOptionWrapper::update_option( 'autoptimize_installed_before_compatibility', true );
289 }
290
291 /**
292 * If the 404 handler is active, delete the current PHP-file so it can be re-created to fix the double underscore bug.
293 */
294 private function upgrade_from_3_1() {
295 if ( autoptimizeCache::do_fallback() && version_compare( autoptimizeOptionWrapper::get_option( 'autoptimize_version', 'none' ), '3.1.2', 'lt' ) ) {
296 $_fallback_php = trailingslashit( WP_CONTENT_DIR ) . 'autoptimize_404_handler.php';
297 @unlink( $_fallback_php ); // @codingStandardsIgnoreLine
298 }
299 }
300 }
301