PluginProbe
Borderless – Addons and Templates for Elementor / trunk
Borderless – Addons and Templates for Elementor vtrunk
trunk 1.0.0 1.0.1 1.0.2 1.0.3 1.0.4 1.0.5 1.0.6 1.0.7 1.0.8 1.0.9 1.1.0 1.1.1 1.1.2 1.1.3 1.1.4 1.1.5 1.1.6 1.1.7 1.1.8 1.1.9 1.2.0 1.2.1 1.2.2 1.2.3 All 78 releases
borderless / includes / library / inc / WidgetImporter.php

WidgetImporter.php in Borderless – Addons and Templates for Elementor trunk, at includes/library/inc/WidgetImporter.php

243 lines 8.2 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2
3 namespace LIBRARY;
4
5 class WidgetImporter {
6 public static function import( $widget_import_file_path ) {
7 $results = array();
8 $library = BorderlessLibraryImporter::get_instance();
9 $log_file_path = $library->get_log_file_path();
10
11 if ( ! empty( $widget_import_file_path ) ) {
12 $results = self::import_widgets( $widget_import_file_path );
13 }
14
15 if ( is_wp_error( $results ) ) {
16 $error_message = $results->get_error_message();
17
18 $library->append_to_frontend_error_messages( $error_message );
19
20 Helpers::append_to_file(
21 $error_message,
22 $log_file_path,
23 esc_html__( 'Importing widgets', 'borderless' )
24 );
25 }
26 else {
27 ob_start();
28 self::format_results_for_log( $results );
29 $message = ob_get_clean();
30
31 $log_added = Helpers::append_to_file(
32 $message,
33 $log_file_path,
34 esc_html__( 'Importing widgets' , 'borderless' )
35 );
36 }
37
38 }
39
40
41 private static function import_widgets( $data_file ) {
42 $data = self::process_import_file( $data_file );
43
44 if ( is_wp_error( $data ) ) {
45 return $data;
46 }
47
48 return self::import_data( $data );
49 }
50
51 private static function process_import_file( $file ) {
52 if ( ! file_exists( $file ) ) {
53 return new \WP_Error(
54 'widget_import_file_not_found',
55 __( 'Error: Widget import file could not be found.', 'borderless' )
56 );
57 }
58
59 $data = Helpers::data_from_file( $file );
60
61 if ( is_wp_error( $data ) ) {
62 return $data;
63 }
64
65 return json_decode( $data );
66 }
67
68 private static function import_data( $data ) {
69 global $wp_registered_sidebars;
70
71 if ( empty( $data ) || ! is_object( $data ) ) {
72 return new \WP_Error(
73 'corrupted_widget_import_data',
74 __( 'Error: Widget import data could not be read. Please try a different file.', 'borderless' )
75 );
76 }
77
78 Helpers::do_action( 'library/widget_importer_before_widgets_import' );
79 $data = Helpers::apply_filters( 'library/before_widgets_import_data', $data );
80
81 $available_widgets = self::available_widgets();
82
83 $widget_instances = array();
84
85 foreach ( $available_widgets as $widget_data ) {
86 $widget_instances[ $widget_data['id_base'] ] = get_option( 'widget_' . $widget_data['id_base'] );
87 }
88
89 $results = array();
90
91 foreach ( $data as $sidebar_id => $widgets ) {
92 if ( 'wp_inactive_widgets' == $sidebar_id ) {
93 continue;
94 }
95
96 if ( isset( $wp_registered_sidebars[ $sidebar_id ] ) ) {
97 $sidebar_available = true;
98 $use_sidebar_id = $sidebar_id;
99 $sidebar_message_type = 'success';
100 $sidebar_message = '';
101 }
102 else {
103 $sidebar_available = false;
104 $use_sidebar_id = 'wp_inactive_widgets';
105 $sidebar_message_type = 'error';
106 $sidebar_message = __( 'Sidebar does not exist in theme (moving widget to Inactive)', 'borderless' );
107 }
108
109 $results[ $sidebar_id ]['name'] = ! empty( $wp_registered_sidebars[ $sidebar_id ]['name'] ) ? $wp_registered_sidebars[ $sidebar_id ]['name'] : $sidebar_id;
110 $results[ $sidebar_id ]['message_type'] = $sidebar_message_type;
111 $results[ $sidebar_id ]['message'] = $sidebar_message;
112 $results[ $sidebar_id ]['widgets'] = array();
113
114 foreach ( $widgets as $widget_instance_id => $widget ) {
115 $fail = false;
116
117 $id_base = preg_replace( '/-[0-9]+$/', '', $widget_instance_id );
118 $instance_id_number = str_replace( $id_base . '-', '', $widget_instance_id );
119
120 if ( ! $fail && ! isset( $available_widgets[ $id_base ] ) ) {
121 $fail = true;
122 $widget_message_type = 'error';
123 $widget_message = __( 'Site does not support widget', 'borderless' );
124 }
125
126
127 $widget = Helpers::apply_filters( 'library/widget_settings', $widget );
128 $widget = json_decode( json_encode( $widget ), true );
129 $widget = Helpers::apply_filters( 'library/widget_settings_array', $widget );
130
131 if ( ! $fail && isset( $widget_instances[ $id_base ] ) ) {
132
133 $sidebars_widgets = get_option( 'sidebars_widgets' );
134 $sidebar_widgets = isset( $sidebars_widgets[ $use_sidebar_id ] ) ? $sidebars_widgets[ $use_sidebar_id ] : array();
135 $single_widget_instances = ! empty( $widget_instances[ $id_base ] ) ? $widget_instances[ $id_base ] : array();
136 foreach ( $single_widget_instances as $check_id => $check_widget ) {
137 if ( in_array( "$id_base-$check_id", $sidebar_widgets ) && (array) $widget == $check_widget ) {
138 $fail = true;
139 $widget_message_type = 'warning';
140 $widget_message = __( 'Widget already exists', 'borderless' );
141
142 break;
143 }
144 }
145 }
146
147 if ( ! $fail ) {
148 $single_widget_instances = get_option( 'widget_' . $id_base );
149 $single_widget_instances = ! empty( $single_widget_instances ) ? $single_widget_instances : array( '_multiwidget' => 1 );
150 $single_widget_instances[] = $widget;
151 end( $single_widget_instances );
152 $new_instance_id_number = key( $single_widget_instances );
153 if ( '0' === strval( $new_instance_id_number ) ) {
154 $new_instance_id_number = 1;
155 $single_widget_instances[ $new_instance_id_number ] = $single_widget_instances[0];
156 unset( $single_widget_instances[0] );
157 }
158
159 if ( isset( $single_widget_instances['_multiwidget'] ) ) {
160 $multiwidget = $single_widget_instances['_multiwidget'];
161 unset( $single_widget_instances['_multiwidget'] );
162 $single_widget_instances['_multiwidget'] = $multiwidget;
163 }
164
165 update_option( 'widget_' . $id_base, $single_widget_instances );
166
167 $sidebars_widgets = get_option( 'sidebars_widgets' );
168 if ( ! $sidebars_widgets ) {
169 $sidebars_widgets = array();
170 }
171
172 $new_instance_id = $id_base . '-' . $new_instance_id_number;
173 $sidebars_widgets[ $use_sidebar_id ][] = $new_instance_id;
174 update_option( 'sidebars_widgets', $sidebars_widgets );
175
176 $after_widget_import = array(
177 'sidebar' => $use_sidebar_id,
178 'sidebar_old' => $sidebar_id,
179 'widget' => $widget,
180 'widget_type' => $id_base,
181 'widget_id' => $new_instance_id,
182 'widget_id_old' => $widget_instance_id,
183 'widget_id_num' => $new_instance_id_number,
184 'widget_id_num_old' => $instance_id_number,
185 );
186 Helpers::do_action( 'library/widget_importer_after_single_widget_import', $after_widget_import );
187
188 if ( $sidebar_available ) {
189 $widget_message_type = 'success';
190 $widget_message = __( 'Imported', 'borderless' );
191 }
192 else {
193 $widget_message_type = 'warning';
194 $widget_message = __( 'Imported to Inactive', 'borderless' );
195 }
196 }
197
198 $results[ $sidebar_id ]['widgets'][ $widget_instance_id ]['name'] = isset( $available_widgets[ $id_base ]['name'] ) ? $available_widgets[ $id_base ]['name'] : $id_base;
199 $results[ $sidebar_id ]['widgets'][ $widget_instance_id ]['title'] = ! empty( $widget['title'] ) ? $widget['title'] : __( 'No Title', 'borderless' );
200 $results[ $sidebar_id ]['widgets'][ $widget_instance_id ]['message_type'] = $widget_message_type;
201 $results[ $sidebar_id ]['widgets'][ $widget_instance_id ]['message'] = $widget_message;
202
203 }
204 }
205
206
207 Helpers::do_action( 'library/widget_importer_after_widgets_import' );
208
209 return Helpers::apply_filters( 'library/widget_import_results', $results );
210 }
211
212 private static function available_widgets() {
213 global $wp_registered_widget_controls;
214
215 $widget_controls = $wp_registered_widget_controls;
216 $available_widgets = array();
217
218 foreach ( $widget_controls as $widget ) {
219 if ( ! empty( $widget['id_base'] ) && ! isset( $available_widgets[ $widget['id_base'] ] ) ) {
220 $available_widgets[ $widget['id_base'] ]['id_base'] = $widget['id_base'];
221 $available_widgets[ $widget['id_base'] ]['name'] = $widget['name'];
222 }
223 }
224
225 return Helpers::apply_filters( 'library/available_widgets', $available_widgets );
226 }
227
228
229 private static function format_results_for_log( $results ) {
230 if ( empty( $results ) ) {
231 esc_html_e( 'No results for widget import!', 'borderless' );
232 }
233
234 foreach ( $results as $sidebar ) {
235 echo esc_html( $sidebar['name'] ) . ' : ' . esc_html( $sidebar['message'] ) . PHP_EOL . PHP_EOL;
236 foreach ( $sidebar['widgets'] as $widget ) {
237 echo esc_html( $widget['name'] ) . ' - ' . esc_html( $widget['title'] ) . ' - ' . esc_html( $widget['message'] ) . PHP_EOL;
238 }
239 echo PHP_EOL;
240 }
241 }
242 }
243