PluginProbe ʕ •ᴥ•ʔ
Jetpack – WP Security, Backup, Speed, & Growth / 12.8.3
Jetpack – WP Security, Backup, Speed, & Growth v12.8.3
12.0.3 12.1.3 12.2.3 12.3.2 12.4.2 12.5.2 12.6.4 12.7.3 12.8.3 12.9.5 13.0.2 13.1.5 13.2.4 13.3.3 13.4.5 13.5.2 13.6.2 13.7.2 13.8.3 13.9.2 14.0.1 14.1.1 14.2.2 14.3.1 14.4.2 14.5.1 14.6.1 14.7.1 14.8.1 14.9.2 15.0.3 15.1.2 15.2.1 15.3.2 15.4.1 15.5.1 15.6.1 15.7.2 15.8.1 15.9.2 16.0.2 16.1.3 16.2-a.5 16.2-a.3 16.1.2 16.2-a.1 16.1.1 16.1 16.1-beta 16.1-beta.2 16.1-beta.3 16.1-a.5 16.1-a.3 16.0.1 16.1-a.1 16.0 16.0-beta 16.0-a.7 16.0-a.5 15.9.1 16.0-a.3 16.0-a.1 15.9 15.9-beta 15.9-a.7 15.9-a.5 15.9-a.3 15.9-a.1 15.8 15.8-beta 15.8-a.7 15.8-a.5 5.2.5 5.3.4 5.4.4 5.5.5 5.6.5 5.7.5 5.8.4 5.9.4 6.0.4 6.1 6.1.1 6.1.2 6.1.3 6.1.4 6.1.5 6.2 6.2.1 6.2.2 6.2.3 6.2.4 6.2.5 6.3 6.3.1 6.3.2 6.3.3 6.3.4 6.3.5 6.3.6 6.3.7 6.4 6.4.1 6.4.2 6.4.3 6.4.4 6.4.5 6.4.6 6.5 6.5.1 6.5.2 6.5.3 6.5.4 6.6 6.6.1 6.6.2 6.6.3 6.6.4 6.6.5 6.7 6.7.1 6.7.2 6.7.3 6.7.4 6.8 6.8.1 6.8.2 6.8.3 6.8.4 6.8.5 6.9 6.9.1 6.9.2 6.9.3 6.9.4 7.0 7.0.1 7.0.2 7.0.3 7.0.4 7.0.5 7.1 7.1.1 7.1.2 7.1.3 7.1.4 7.1.5 7.2 7.2.1 7.2.1.1 7.2.2 7.2.3 7.2.4 7.2.5 7.3 7.3.0.1 7.3.1 7.3.1.1 7.3.2 7.3.3 7.3.4 7.3.5 7.4 7.4.1 7.4.2 7.4.3 7.4.4 7.4.5 7.5 7.5.0.1 7.5.1 7.5.2 7.5.3 7.5.4 7.5.5 7.5.6 7.5.7 7.6 7.6.1 7.6.2 7.6.3 7.6.4 7.7 7.7.1 7.7.2 7.7.3 7.7.4 7.7.5 7.7.6 7.8 7.8.1 7.8.2 7.8.3 7.8.4 7.9 7.9.1 7.9.2 7.9.3 7.9.4 8.0 8.0.1 8.0.2 8.0.3 8.1 8.1.1 8.1.2 8.1.3 8.1.4 8.2 8.2.0.1 8.2.1 8.2.2 8.2.3 8.2.4 8.2.5 8.2.6 8.3 8.3.1 8.3.2 8.3.3 8.4 8.4.1 8.4.2 8.4.3 8.4.4 8.4.5 8.5 8.5.1 8.5.2 8.5.3 8.6 8.6.1 8.6.2 8.6.3 8.6.4 8.7 8.7.0.1 8.7.1 8.7.2 8.7.3 8.7.4 8.8 8.8.1 8.8.2 8.8.3 8.8.4 8.8.5 8.9 8.9.1 8.9.2 8.9.3 8.9.4 9.0 9.0.1 9.0.2 9.0.3 9.0.4 9.0.5 9.1 9.1.1 9.1.2 9.1.3 9.2 9.2.1 9.2.2 9.2.3 9.2.4 9.3 9.3.1 9.3.2 9.3.3 9.3.4 9.3.5 9.4 9.4.1 9.4.2 9.4.3 9.4.4 9.5 9.5.1 9.5.2 9.5.3 9.5.4 9.5.5 9.6 9.6.1 9.6.2 9.6.3 9.6.4 9.7 9.7.1 9.7.2 15.7-beta.2 9.7.3 15.7.1 9.8 15.8-a.1 9.8.1 15.8-a.3 9.8.2 2.0.9 9.8.3 2.1.7 9.9 2.2.10 9.9.1 2.3.10 9.9.2 2.4.7 9.9.3 2.5.5 2.6.6 2.7.5 2.8.5 2.9.6 3.0.6 3.1.5 3.2.5 3.3.6 3.4.6 3.5.6 3.6.4 3.7.5 3.8.5 3.9.10 4.0.7 4.1.4 4.2.5 4.3.5 4.4.5 4.5.3 4.6.3 4.7.4 4.8.5 4.9.3 5.0.3 5.1.4 trunk 10.0 10.0.1 10.0.2 10.1 10.1.1 10.1.2 10.2 10.2.1 10.2.2 10.2.3 10.3 10.3.1 10.3.2 10.4 10.4.1 10.4.2 10.5 10.5.1 10.5.2 10.5.3 10.6 10.6.1 10.6.2 10.7 10.7.1 10.7.2 10.8 10.8.1 10.8.2 10.9 10.9.1 10.9.2 10.9.3 11.0 11.0.1 11.0.2 11.1 11.1.1 11.1.2 11.1.3 11.1.4 11.2 11.2.1 11.2.2 11.3 11.3.1 11.3.2 11.3.3 11.3.4 11.4 11.4.1 11.4.2 11.5 11.5.1 11.5.2 11.5.3 11.6 11.6.1 11.6.2 11.7 11.7.1 11.7.2 11.7.3 11.8 11.8.3 11.8.4 11.8.5 11.8.6 11.9 11.9.1 11.9.2 11.9.3 12.0 12.0.1 12.0.2 12.1 12.1.1 12.1.2 12.2 12.2.1 12.2.2 12.3 12.3.1 12.4 12.4.1 12.5 12.5.1 12.6 12.6.1 12.6.2 12.6.3 12.7 12.7.1 12.7.2 12.8 12.8.1 12.8.2 12.9 12.9.1 12.9.2 12.9.3 12.9.4 13.0 13.0.1 13.1 13.1.1 13.1.2 13.1.3 13.1.4 13.2 13.2.1 13.2.2 13.2.3 13.3 13.3.1 13.3.2 13.4 13.4.1 13.4.2 13.4.3 13.4.4 13.5 13.5.1 13.6 13.6.1 13.7 13.7.1 13.8 13.8.1 13.8.2 13.9 13.9.1 14.0 14.1 14.2 14.2.1 14.3 14.4 14.4.1 14.5 14.6 14.7 14.8 14.9 14.9.1 15.0 15.0.1 15.0.2 15.1 15.1.1 15.2 15.3 15.3.1 15.4 15.5 15.6 15.7 15.7-a.1 15.7-a.3 15.7-a.5 15.7-a.7 15.7-beta
jetpack / modules / widgets / migrate-to-core / image-widget.php
jetpack / modules / widgets / migrate-to-core Last commit date
gallery-widget.php 3 years ago image-widget.php 3 years ago
image-widget.php
237 lines
1 <?php
2 /**
3 * Migration from Jetpack's Image Widget to WordPress' Core Image Widget.
4 *
5 * @since 4.9
6 *
7 * @package automattic/jetpack
8 */
9
10 /**
11 * Migrates all active instances of Jetpack's image widget to Core's media image widget.
12 */
13 function jetpack_migrate_image_widget() {
14 // Only trigger the migration from wp-admin.
15 if ( ! is_admin() ) {
16 return;
17 }
18
19 // Only migrate if the new widget is available and we haven't yet migrated.
20 if ( ! class_exists( 'WP_Widget_Media_Image' ) || Jetpack_Options::get_option( 'image_widget_migration' ) ) {
21 return;
22 }
23
24 $default_data = array(
25 'attachment_id' => 0,
26 'url' => '',
27 'title' => '',
28 'size' => 'custom',
29 'width' => 0,
30 'height' => 0,
31 'align' => 'none',
32 'caption' => '',
33 'alt' => '',
34 'link_type' => '',
35 'link_url' => '',
36 'image_classes' => '',
37 'link_classes' => '',
38 'link_rel' => '',
39 'image_title' => '',
40 'link_target_blank' => false,
41 'conditions' => null,
42 );
43
44 $old_widgets = get_option( 'widget_image', array() );
45 $media_image = get_option( 'widget_media_image', array() );
46 $sidebars_widgets = wp_get_sidebars_widgets();
47
48 // Persist old and current widgets in backup table.
49 jetpack_store_migration_data( 'widget_image', maybe_serialize( $old_widgets ) );
50 if ( jetpack_get_migration_data( 'widget_image' ) !== $old_widgets ) {
51 return false;
52 }
53
54 jetpack_store_migration_data( 'sidebars_widgets', maybe_serialize( $sidebars_widgets ) );
55 if ( jetpack_get_migration_data( 'sidebars_widgets' ) !== $sidebars_widgets ) {
56 return false;
57 }
58
59 // Array to store legacy widget ids in to unregister on success.
60 $widgets_to_unregister = array();
61
62 foreach ( $old_widgets as $id => $widget ) {
63 if ( is_string( $id ) ) {
64 continue;
65 }
66
67 // Can be caused by instanciating but not populating a widget in the Customizer.
68 if ( empty( $widget ) ) {
69 continue;
70 }
71
72 // Ensure widget has no keys other than those expected.
73 // Not all widgets have conditions, so lets add it in.
74 $widget_copy = array_merge( array( 'conditions' => null ), $widget );
75 $non_allowed_keys = array_diff_key(
76 $widget_copy,
77 array(
78 'title' => '',
79 'img_url' => '',
80 'alt_text' => '',
81 'img_title' => '',
82 'caption' => '',
83 'align' => '',
84 'img_width' => '',
85 'img_height' => '',
86 'link' => '',
87 'link_target_blank' => '',
88 'conditions' => '',
89 )
90 );
91
92 if ( $non_allowed_keys !== array() ) {
93 // skipping the widget in question.
94 continue;
95 }
96
97 $media_image[ $id ] = array_merge(
98 $default_data,
99 $widget,
100 array(
101 'alt' => $widget['alt_text'],
102 'height' => $widget['img_height'],
103 'image_classes' => ! empty( $widget['align'] ) ? 'align' . $widget['align'] : '',
104 'image_title' => $widget['img_title'],
105 'link_url' => $widget['link'],
106 'url' => $widget['img_url'],
107 'width' => $widget['img_width'],
108 )
109 );
110
111 // Unsetting old widget fields.
112 $media_image[ $id ] = array_diff_key(
113 $media_image[ $id ],
114 array(
115 'align' => false,
116 'alt_text' => false,
117 'img_height' => false,
118 'img_title' => false,
119 'img_url' => false,
120 'img_width' => false,
121 'link' => false,
122 )
123 );
124
125 // Check if the image is in the media library.
126 $image_basename = basename( $widget['img_url'] );
127
128 if ( empty( $image_basename ) ) {
129 continue;
130 }
131
132 $attachment_ids = get_posts(
133 array(
134 'fields' => 'ids',
135 'meta_query' => array(
136 array(
137 'value' => basename( $image_basename ),
138 'compare' => 'LIKE',
139 'key' => '_wp_attachment_metadata',
140 ),
141 ),
142 'post_status' => 'inherit',
143 'post_type' => 'attachment',
144 'suppress_filters' => false,
145 )
146 );
147
148 foreach ( $attachment_ids as $attachment_id ) {
149 $image_meta = wp_get_attachment_metadata( $attachment_id );
150
151 // Is it a full size image?
152 $image_path_pieces = explode( '/', $image_meta['file'] );
153 if ( array_pop( $image_path_pieces ) === $image_basename ) {
154 $media_image[ $id ]['attachment_id'] = $attachment_id;
155
156 // Set correct size if dimensions fit.
157 if (
158 $media_image[ $id ]['width'] == $image_meta['width'] || // phpcs:ignore Universal.Operators.StrictComparisons.LooseEqual
159 $media_image[ $id ]['height'] == $image_meta['height'] // phpcs:ignore Universal.Operators.StrictComparisons.LooseEqual
160 ) {
161 $media_image[ $id ]['size'] = 'full';
162 }
163 break;
164 }
165
166 // Is it a down-sized image?
167 foreach ( $image_meta['sizes'] as $size => $image ) {
168 if ( false !== array_search( $image_basename, $image, true ) ) {
169 $media_image[ $id ]['attachment_id'] = $attachment_id;
170
171 // Set correct size if dimensions fit.
172 if (
173 $media_image[ $id ]['width'] == $image['width'] || // phpcs:ignore Universal.Operators.StrictComparisons.LooseEqual
174 $media_image[ $id ]['height'] == $image['height'] // phpcs:ignore Universal.Operators.StrictComparisons.LooseEqual
175 ) {
176 $media_image[ $id ]['size'] = $size;
177 }
178 break 2;
179 }
180 }
181 }
182
183 if ( ! empty( $widget['link'] ) ) {
184 $media_image[ $id ]['link_type'] = $widget['link'] === $widget['img_url'] ? 'file' : 'custom';
185 }
186
187 foreach ( $sidebars_widgets as $sidebar => $widgets ) {
188 $key = is_array( $widgets ) ? array_search( "image-{$id}", $widgets, true ) : false;
189
190 if ( false !== $key ) {
191 $sidebars_widgets[ $sidebar ][ $key ] = "media_image-{$id}";
192 }
193 }
194
195 $widgets_to_unregister[] = $id;
196 }
197
198 if ( update_option( 'widget_media_image', $media_image ) ) {
199 delete_option( 'widget_image' );
200
201 // Now un-register old widgets and register new.
202 foreach ( $widgets_to_unregister as $id ) {
203 wp_unregister_sidebar_widget( "image-{$id}" );
204
205 // register new widget.
206 $media_image_widget = new WP_Widget_Media_Image();
207 $media_image_widget->_set( $id );
208 $media_image_widget->_register_one( $id );
209 }
210
211 wp_set_sidebars_widgets( $sidebars_widgets );
212
213 // We need to refresh on widgets page for changes to take effect.
214 add_action( 'current_screen', 'jetpack_refresh_on_widget_page' );
215 } else {
216 $widget_media_image = get_option( 'widget_media_image' );
217 if ( is_array( $widget_media_image ) ) {
218 delete_option( 'widget_image' );
219 }
220 }
221
222 Jetpack_Options::update_option( 'image_widget_migration', true );
223 }
224 add_action( 'widgets_init', 'jetpack_migrate_image_widget' );
225
226 /**
227 * Refresh the widgets page to save changes
228 *
229 * @param WP_Screen $current Current WP_Screen object.
230 */
231 function jetpack_refresh_on_widget_page( $current ) {
232 if ( 'widgets' === $current->base ) {
233 wp_safe_redirect( admin_url( 'widgets.php' ) );
234 exit;
235 }
236 }
237