PluginProbe ʕ •ᴥ•ʔ
GiveWP – Donation Plugin and Fundraising Platform / 2.2.5
GiveWP – Donation Plugin and Fundraising Platform v2.2.5
4.16.2 4.16.1 4.16.0 4.15.5 4.15.4 4.15.3 4.15.2 4.15.1 4.15.0 2.3.0 2.3.1 2.3.2 2.30.0 2.31.0 2.31.1 2.32.0 2.33.0 2.33.1 2.33.2 2.33.3 2.33.4 2.33.5 2.4.0 2.4.1 2.4.2 2.4.3 2.4.4 2.4.5 2.4.6 2.4.7 2.5.0 2.5.1 2.5.10 2.5.11 2.5.12 2.5.13 2.5.2 2.5.3 2.5.4 2.5.5 2.5.6 2.5.7 2.5.8 2.5.9 2.6.0 2.6.1 2.6.2 2.6.3 2.7.0 2.7.1 2.7.2 2.7.3 2.7.4 2.7.5 2.8.0 2.8.1 2.9.0 2.9.1 2.9.2 2.9.3 2.9.4 2.9.5 2.9.6 2.9.7 3.0.0 3.0.1 3.0.2 3.0.3 3.0.4 3.1.0 3.1.1 3.1.2 3.10.0 3.11.0 3.12.0 3.12.1 3.12.2 3.12.3 3.13.0 3.14.0 3.14.1 3.14.2 3.15.0 3.15.1 3.16.0 3.16.1 3.16.2 3.16.3 3.16.4 3.16.5 3.17.0 3.17.1 3.17.2 3.18.0 3.19.0 3.19.1 3.19.2 3.19.3 3.19.4 3.2.0 3.2.1 3.2.2 3.20.0 3.21.0 3.21.1 3.22.0 3.22.1 3.22.2 3.3.0 3.3.1 3.4.0 3.4.1 3.4.2 3.5.0 3.5.1 3.6.0 3.6.1 3.6.2 3.7.0 3.8.0 3.9.0 4.0.0 4.1.0 4.1.1 4.10.0 4.10.1 4.11.0 4.12.0 4.13.0 4.13.1 4.13.2 4.14.0 4.14.1 4.14.2 4.14.3 4.14.4 4.14.5 4.14.6 4.2.0 4.2.1 4.3.0 4.3.1 4.3.2 4.4.0 4.5.0 4.6.1 4.7.0 4.7.1 4.8.0 4.8.1 4.9.0 trunk 1.9.0 2.0.0 2.0.1 2.0.2 2.0.3 2.0.4 2.0.5 2.0.6 2.0.7 2.1.0 2.1.1 2.1.2 2.1.3 2.1.4 2.1.5 2.1.6 2.1.7 2.1.8 2.10.0 2.10.1 2.10.2 2.10.3 2.10.4 2.11.0 2.11.1 2.11.2 2.11.3 2.12.0 2.12.1 2.12.2 2.12.3 2.13.0 2.13.1 2.13.2 2.13.3 2.13.4 2.14.0 2.15.0 2.16.0 2.16.1 2.17.0 2.17.1 2.17.3 2.18.0 2.18.1 2.19.1 2.19.2 2.19.3 2.19.4 2.19.5 2.19.6 2.19.7 2.19.8 2.2.0 2.2.1 2.2.2 2.2.3 2.2.4 2.2.5 2.2.6 2.20.0 2.20.1 2.20.2 2.21.0 2.21.1 2.21.2 2.21.3 2.21.4 2.22.0 2.22.1 2.22.2 2.22.3 2.23.0 2.23.1 2.23.2 2.24.0 2.24.1 2.24.2 2.25.0 2.25.1 2.25.2 2.25.3 2.26.0 2.27.0 2.27.1 2.27.2 2.27.3 2.28.0 2.29.0 2.29.1 2.29.2
give / includes / admin / tools / import / class-give-import-core-settings.php
give / includes / admin / tools / import Last commit date
class-give-import-core-settings.php 7 years ago class-give-import-donations.php 7 years ago
class-give-import-core-settings.php
484 lines
1 <?php
2 /**
3 * Core Settings Import Class
4 *
5 * This class handles core setting import.
6 *
7 * @package Give
8 * @subpackage Classes/Give_Import_Core_Settings
9 * @copyright Copyright (c) 2017, WordImpress
10 * @license https://opensource.org/licenses/gpl-license GNU Public License
11 * @since 1.8.17
12 */
13
14 if ( ! defined( 'ABSPATH' ) ) {
15 exit; // Exit if accessed directly
16 }
17
18 if ( ! class_exists( 'Give_Import_Core_Settings' ) ) {
19
20 /**
21 * Give_Import_Core_Settings.
22 *
23 * @since 1.8.17
24 */
25 final class Give_Import_Core_Settings {
26
27 /**
28 * Importer type
29 *
30 * @since 1.8.17
31 * @var string
32 */
33 private $importer_type = 'import_core_setting';
34
35 /**
36 * Instance.
37 *
38 * @since 1.8.17
39 */
40 static private $instance;
41
42 /**
43 * Importing donation per page.
44 *
45 * @since 1.8.17
46 *
47 * @var int
48 */
49 public static $per_page = 20;
50
51 /**
52 * Is core file is valid.
53 *
54 * @since 2.1
55 *
56 * @var int
57 */
58 public $is_json_valid = false;
59
60 /**
61 * Singleton pattern.
62 *
63 * @since 1.8.17
64 *
65 * @access private
66 */
67 private function __construct() {
68 }
69
70 /**
71 * Get instance.
72 *
73 * @since 1.8.17
74 *
75 * @access public
76 *
77 * @return static
78 */
79 public static function get_instance() {
80 if ( null === static::$instance ) {
81 self::$instance = new static();
82 }
83
84 return self::$instance;
85 }
86
87 /**
88 * Setup
89 *
90 * @since 1.8.17
91 *
92 * @return void
93 */
94 public function setup() {
95 $this->setup_hooks();
96 }
97
98
99 /**
100 * Setup Hooks.
101 *
102 * @since 1.8.17
103 *
104 * @return void
105 */
106 private function setup_hooks() {
107 if ( ! $this->is_donations_import_page() ) {
108 return;
109 }
110
111 // Do not render main import tools page.
112 remove_action( 'give_admin_field_tools_import', array( 'Give_Settings_Import', 'render_import_field', ) );
113
114 // Render donation import page
115 add_action( 'give_admin_field_tools_import', array( $this, 'render_page' ) );
116
117 // Print the HTML.
118 add_action( 'give_tools_import_core_settings_form_start', array( $this, 'html' ), 10 );
119
120 // Run when form submit.
121 add_action( 'give-tools_save_import', array( $this, 'save' ) );
122
123 add_action( 'give-tools_update_notices', array( $this, 'update_notices' ), 11, 1 );
124
125 // Used to add submit button.
126 add_action( 'give_tools_import_core_settings_form_end', array( $this, 'submit' ), 10 );
127 }
128
129 /**
130 * Update notice
131 *
132 * @since 1.8.17
133 *
134 * @param $messages
135 *
136 * @return mixed
137 */
138 public function update_notices( $messages ) {
139 if ( ! empty( $_GET['tab'] ) && 'import' === give_clean( $_GET['tab'] ) ) {
140 unset( $messages['give-setting-updated'] );
141 }
142
143 return $messages;
144 }
145
146 /**
147 * Print submit and nonce button.
148 *
149 * @since 1.8.17
150 */
151 public function submit() {
152 wp_nonce_field( 'give-save-settings', '_give-save-settings' );
153 ?>
154 <input type="hidden" class="import-step" id="import-step" name="step" value="<?php echo $this->get_step(); ?>"/>
155 <input type="hidden" class="importer-type" value="<?php echo $this->importer_type; ?>"/>
156 <?php
157 }
158
159 /**
160 * Print the HTML for core setting importer.
161 *
162 * @since 1.8.17
163 */
164 public function html() {
165 $step = $this->get_step();
166
167 // Show progress.
168 $this->render_progress();
169 ?>
170 <section>
171 <table
172 class="widefat export-options-table give-table <?php echo "step-{$step}"; ?> <?php echo( 1 === $step && ! empty( $this->is_json_valid ) ? 'give-hidden' : '' ); ?> "
173 id="<?php echo "step-{$step}"; ?>">
174 <tbody>
175 <?php
176 switch ( $step ) {
177 case 1:
178 $this->render_upload_html();
179 break;
180
181 case 2:
182 $this->start_import();
183 break;
184
185 case 3:
186 $this->import_success();
187 }
188 ?>
189 </tbody>
190 </table>
191 </section>
192 <?php
193 }
194
195 /**
196 * Show message after the Core Settings Imported
197 *
198 * @since 1.8.17
199 */
200 public function import_success() {
201 // Imported successfully
202
203 $success = (bool) ( isset( $_GET['success'] ) ? give_clean( $_GET['success'] ) : false );
204 $undo = (bool) ( isset( $_GET['undo'] ) ? give_clean( $_GET['undo'] ) : false );
205 $query_arg_setting = array(
206 'post_type' => 'give_forms',
207 'page' => 'give-settings',
208 );
209
210 if ( $undo ) {
211 $success = false;
212 }
213
214 $query_arg_success = array(
215 'post_type' => 'give_forms',
216 'page' => 'give-tools',
217 'tab' => 'import',
218 'importer-type' => 'import_core_setting',
219 'step' => '1',
220 'undo' => 'true',
221 );
222
223 $title = __( 'Settings Importing Completed!', 'give' );
224 if ( $success ) {
225 $query_arg_success['undo'] = '1';
226 $query_arg_success['step'] = '3';
227 $query_arg_success['success'] = '1';
228 $text = __( 'Undo Importing', 'give' );
229 } else {
230 if ( $undo ) {
231 $host_give_options = get_option( 'give_settings_old', array() );
232 update_option( 'give_settings', $host_give_options, false );
233 $title = __( 'Undo of Setting Imported Completed!', 'give' );
234 } else {
235 $title = __( 'Failed to import', 'give' );
236 }
237
238 $text = __( 'Importing Again', 'give' );
239 }
240 ?>
241 <tr valign="top" class="give-import-dropdown">
242 <th colspan="2">
243 <h2><?php echo $title; ?></h2>
244 <p>
245 <a class="button button-large button-secondary" href="<?php echo add_query_arg( $query_arg_success, admin_url( 'edit.php' ) ); ?>"><?php echo $text; ?></a>
246 <a class="button button-large button-secondary" href="<?php echo add_query_arg( $query_arg_setting, admin_url( 'edit.php' ) ); ?>"><?php echo __( 'View Settings', 'give' ); ?></a>
247 </p>
248 </th>
249 </tr>
250 <?php
251 }
252
253 /**
254 * Will start Import
255 *
256 * @since 1.8.17
257 */
258 public function start_import() {
259 $type = ( ! empty( $_GET['type'] ) ? give_clean( $_GET['type'] ) : 'replace' );
260 $file_name = ( ! empty( $_GET['file_name'] ) ? give_clean( $_GET['file_name'] ) : '' );
261
262 ?>
263 <tr valign="top" class="give-import-dropdown">
264 <th colspan="2">
265 <h2 id="give-import-title"><?php esc_html_e( 'Importing', 'give' ) ?></h2>
266 <p class="give-field-description"><?php esc_html_e( 'Your settings are now being imported...', 'give' ) ?></p>
267 </th>
268 </tr>
269
270 <tr valign="top" class="give-import-dropdown">
271 <th colspan="2">
272 <div class="give-progress">
273 <div style="width: 50%"></div>
274 </div>
275 <span class="spinner is-active"></span>
276 <input type="hidden" value="2" name="step">
277 <input type="hidden" value="<?php echo $type; ?>" name="type">
278 <input type="hidden" value="<?php echo $file_name; ?>" name="file_name">
279 </th>
280 </tr>
281 <?php
282 }
283
284 /**
285 * Is used to show the process when user upload the donor form.
286 *
287 * @since 1.8.17
288 */
289 public function render_progress() {
290 $step = $this->get_step();
291 ?>
292 <ol class="give-progress-steps">
293 <li class="<?php echo( 1 === $step ? 'active' : '' ); ?>">
294 <?php esc_html_e( 'Upload JSON file', 'give' ); ?>
295 </li>
296 <li class="<?php echo( 2 === $step ? 'active' : '' ); ?>">
297 <?php esc_html_e( 'Import', 'give' ); ?>
298 </li>
299 <li class="<?php echo( 3 === $step ? 'active' : '' ); ?>">
300 <?php esc_html_e( 'Done!', 'give' ); ?>
301 </li>
302 </ol>
303 <?php
304 }
305
306 /**
307 * Will return the import step.
308 *
309 * @since 1.8.17
310 *
311 * @return int $step on which step doest the import is on.
312 */
313 public function get_step() {
314 $step = (int) ( isset( $_REQUEST['step'] ) ? give_clean( $_REQUEST['step'] ) : 0 );
315 $on_step = 1;
316
317 if ( empty( $step ) || 1 === $step ) {
318 $on_step = 1;
319 } elseif ( 2 === $step ) {
320 $on_step = 2;
321 } elseif ( 3 === $step ) {
322 $on_step = 3;
323 }
324
325 return $on_step;
326 }
327
328 /**
329 * Render donations import page
330 *
331 * @since 1.8.17
332 */
333 public function render_page() {
334 include_once GIVE_PLUGIN_DIR . 'includes/admin/tools/views/html-admin-page-import-core-settings.php';
335 }
336
337 /**
338 * Add json upload HTMl
339 *
340 * Print the html of the file upload from which json will be uploaded.
341 *
342 * @since 1.8.17
343 * @return void
344 */
345 public function render_upload_html() {
346 $json = ( isset( $_POST['json'] ) ? give_clean( $_POST['json'] ) : '' );
347 $type = ( isset( $_POST['type'] ) ? give_clean( $_POST['type'] ) : 'merge' );
348 $step = $this->get_step();
349
350 ?>
351 <tr valign="top">
352 <th colspan="2">
353 <h2 id="give-import-title"><?php esc_html_e( 'Import Core Settings from a JSON file', 'give' ) ?></h2>
354 <p class="give-field-description"><?php esc_html_e( 'This tool allows you to import Give settings from another Give installation. Settings imported contain data from Give core as well as any of our Premium Add-ons.', 'give' ) ?></p>
355 </th>
356 </tr>
357
358 <tr valign="top">
359 <th scope="row" class="titledesc">
360 <label for="json"><?php esc_html_e( 'Choose a JSON file:', 'give' ) ?></label>
361 </th>
362 <td class="give-forminp">
363 <div class="give-field-wrap">
364 <label for="json">
365 <input type="file" name="json" class="give-upload-json-file" value="<?php echo $json; ?>"
366 accept=".json">
367 <p class="give-field-description"><?php esc_html_e( 'The file type must be JSON.', 'give' )?></p>
368 </label>
369 </div>
370 </td>
371 </tr>
372 <?php
373 $settings = array(
374 array(
375 'id' => 'type',
376 'name' => __( 'Merge Type:', 'give' ),
377 'description' => __( 'Select "Merge" to retain existing settings, or "Replace" to overwrite with the settings from the JSON file', 'give' ),
378 'default' => $type,
379 'type' => 'radio_inline',
380 'options' => array(
381 'merge' => __( 'Merge', 'give' ),
382 'replace' => __( 'Replace', 'give' ),
383 ),
384 ),
385 );
386
387 $settings = apply_filters( 'give_import_core_setting_html', $settings );
388
389 if ( empty( $this->is_json_valid ) ) {
390 Give_Admin_Settings::output_fields( $settings, 'give_settings' );
391 ?>
392 <tr valign="top">
393 <th></th>
394 <th>
395 <input type="submit"
396 class="button button-primary button-large button-secondary <?php echo "step-{$step}"; ?>"
397 id="recount-stats-submit"
398 value="<?php esc_attr_e( 'Submit', 'give' ); ?>"/>
399 </th>
400 </tr>
401 <?php
402 } else {
403 ?>
404 <input type="hidden" name="is_json_valid" class="is_json_valid" value="<?php echo $this->is_json_valid; ?>">
405 <?php
406 }
407 }
408
409 /**
410 * Run when user click on the submit button.
411 *
412 * @since 1.8.17
413 */
414 public function save() {
415
416 // Get the current step.
417 $step = $this->get_step();
418
419 // Validation for first step.
420 if ( 1 === $step ) {
421 $type = ( ! empty( $_REQUEST['type'] ) ? give_clean( $_REQUEST['type'] ) : 'replace' );
422 $core_settings = self::upload_widget_settings_file();
423 if ( ! empty( $core_settings['error'] ) ) {
424 Give_Admin_Settings::add_error( 'give-import-csv', __( 'Please upload a valid JSON settings file.', 'give' ) );
425 } else {
426 $file_path = explode( '/', $core_settings['file'] );
427 $count = ( count( $file_path ) - 1 );
428 $url = give_import_page_url( (array) apply_filters( 'give_import_core_settings_importing_url', array(
429 'step' => '2',
430 'importer-type' => $this->importer_type,
431 'type' => $type,
432 'file_name' => $file_path[ $count ],
433 ) ) );
434
435
436 $this->is_json_valid = $url;
437 }
438 }
439 }
440
441 /**
442 * Get if current page import donations page or not
443 *
444 * @since 1.8.17
445 * @return bool
446 */
447 private function is_donations_import_page() {
448 return 'import' === give_get_current_setting_tab() && isset( $_GET['importer-type'] ) && $this->importer_type === give_clean( $_GET['importer-type'] );
449 }
450
451 /**
452 * Upload JSON file
453 * @return boolean
454 */
455 public static function upload_widget_settings_file() {
456 $upload = false;
457 if ( isset( $_FILES['json'] ) ) {
458 add_filter( 'upload_mimes', array( __CLASS__, 'json_upload_mimes' ) );
459
460 $upload = wp_handle_upload( $_FILES['json'], array( 'test_form' => false ) );
461
462 remove_filter( 'upload_mimes', array( __CLASS__, 'json_upload_mimes' ) );
463 } else {
464 Give_Admin_Settings::add_error( 'give-import-csv', __( 'Please upload or provide a valid JSON file.', 'give' ) );
465 }
466
467 return $upload;
468 }
469
470 /**
471 * Add mime type for JSON
472 *
473 * @param array $existing_mimes
474 */
475 public static function json_upload_mimes( $existing_mimes = array() ) {
476 $existing_mimes['json'] = 'application/json';
477
478 return $existing_mimes;
479 }
480 }
481
482 Give_Import_Core_Settings::get_instance()->setup();
483 }
484