PluginProbe
UsersWP – Front-end login form, User Registration, User Profile & Members Directory plugin for WP / 1.2.73
UsersWP – Front-end login form, User Registration, User Profile & Members Directory plugin for WP v1.2.73
1.2.73 1.2.72 1.2.71 1.2.70 1.2.69 1.2.68 1.2.67 1.2.66 1.2.65 1.2.64 1.2.63 trunk 1.0.10 1.0.11 1.0.12 1.0.13 1.0.14 1.0.15 1.0.16 1.0.17 1.0.18 1.0.19 1.0.20 1.0.21 1.0.22 All 173 releases
← All changes | includes/class-tools.php +617 -168 1.0.211.2.73 View file →
@@ -7,19 +7,43 @@
7 7 * @since 1.0.0
8 8 * @author GeoDirectory Team <info@wpgeodirectory.com>
9 9 */
10 10 class UsersWP_Tools {
11 -
12 - public function uwp_fix_usermeta_table() {
11 +
12 + /**
13 + * Constructor.
14 + */
15 + public function __construct() {
16 + add_filter('uwp_load_db_language', array($this,'load_custom_field_translation') );
17 + add_filter('uwp_load_db_language', array($this,'load_uwp_options_text_translation') );
18 + }
19 +
20 + /**
21 + * Fixes usermeta table
22 + *
23 + * @package userswp
24 + *
25 + */
26 + public function fix_usermeta_table() {
13 27 uwp_create_tables();
14 - uwp101_create_tables();
15 28 }
16 29
17 - public function uwp_tools_wrap_error_message($message, $class) {
30 + /**
31 + * Wraps message
32 + *
33 + * @package userswp
34 + *
35 + * @param string $message Message to wrap
36 + * @param string $class Class for wrapper
37 + *
38 + * @return string
39 + *
40 + */
41 + public function tools_wrap_error_message($message, $class) {
18 42 ob_start();
19 43 ?>
20 - <div class="notice inline notice-<?php echo $class; ?> notice-alt">
21 - <p><?php echo $message; ?></p>
44 + <div class="notice inline notice-<?php echo esc_attr( $class ); ?> notice-alt">
45 + <p><?php echo wp_kses_post( $message ); ?></p>
22 46 </div>
23 47 <?php
24 48 $html = ob_get_clean();
25 49 return $html;
@@ -24,15 +48,23 @@
24 48 $html = ob_get_clean();
25 49 return $html;
26 50 }
27 51
28 - public function uwp_fix_field_columns() {
52 + /**
53 + * Fixes field columns
54 + *
55 + * @package userswp
56 + *
57 + * @return object|bool
58 + *
59 + */
60 + public function fix_field_columns() {
29 61 global $wpdb;
30 62 $errors = new WP_Error();
31 63
32 64 $form_type = 'account';
33 65 $table_name = uwp_get_table_prefix() . 'uwp_form_fields';
34 - $fields = $wpdb->get_results($wpdb->prepare("SELECT htmlvar_name FROM " . $table_name . " WHERE form_type = %s ORDER BY sort_order ASC", array($form_type)));
66 + $fields = $wpdb->get_results($wpdb->prepare("SELECT htmlvar_name FROM " . $table_name . " WHERE form_type = %s ORDER BY sort_order ASC", array($form_type))); // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching
35 67 $meta_table = get_usermeta_table_prefix() . 'uwp_usermeta';
36 68
37 69 $excluded = uwp_get_excluded_fields();
38 70
@@ -55,13 +87,21 @@
55 87 }
56 88 return true;
57 89 }
58 90
59 - public function uwp_get_field_columns() {
91 + /**
92 + * Returns columns for field
93 + *
94 + * @package userswp
95 + *
96 + * @return array
97 + *
98 + */
99 + public function get_field_columns() {
60 100 global $wpdb;
61 101 $form_type = 'account';
62 102 $table_name = uwp_get_table_prefix() . 'uwp_form_fields';
63 - $fields = $wpdb->get_results($wpdb->prepare("SELECT htmlvar_name FROM " . $table_name . " WHERE form_type = %s ORDER BY sort_order ASC", array($form_type)));
103 + $fields = $wpdb->get_results($wpdb->prepare("SELECT htmlvar_name FROM " . $table_name . " WHERE form_type = %s ORDER BY sort_order ASC", array($form_type))); // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching
64 104
65 105 $excluded = uwp_get_excluded_fields();
66 106
67 107 $columns = array();
@@ -79,9 +119,17 @@
79 119 return $columns;
80 120
81 121 }
82 122
83 - public function uwp_fix_usermeta($step) {
123 + /**
124 + * Fixes users meta
125 + *
126 + * @package userswp
127 + *
128 + * @param int $step Step for processing
129 + *
130 + */
131 + public function fix_usermeta($step) {
84 132
85 133 global $wpdb;
86 134
87 135
@@ -87,9 +135,9 @@
87 135
88 136 $items_per_page = apply_filters('tools_process_fix_usermeta_per_page', 10, $step);
89 137 $offset = (int) $step * $items_per_page;
90 138
91 - $user_ids = $wpdb->get_col( $wpdb->prepare(
139 + $user_ids = $wpdb->get_col( $wpdb->prepare( // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching
92 140 "SELECT $wpdb->users.ID FROM $wpdb->users LIMIT %d OFFSET %d",
93 141 $items_per_page, $offset ));
94 142
95 143 $users_count = count_users();
@@ -97,9 +145,9 @@
97 145
98 146 $max_step = ceil($total_users / $items_per_page) - 1;
99 147 $percent = (($step + 1)/ ($max_step+1)) * 100;
100 148
101 - $columns = $this->uwp_get_field_columns();
149 + $columns = $this->get_field_columns();
102 150
103 151 //we got all the IDs, now loop through them to get individual IDs
104 152 $count = 0;
105 153 $message = '';
@@ -107,15 +155,15 @@
107 155 $done = false;
108 156 $error = false;
109 157
110 158 if ($step == 0) {
111 - $this->uwp_fix_usermeta_table();
159 + $this->fix_usermeta_table();
112 160
113 - $output = $this->uwp_fix_field_columns();
161 + $output = $this->fix_field_columns();
114 162 if (is_wp_error($output)) {
115 163 $table_sync_error = true;
116 164 $error = true;
117 - $message = $this->uwp_tools_wrap_error_message($output->get_error_message(), 'error');
165 + $message = $this->tools_wrap_error_message($output->get_error_message(), 'error');
118 166 }
119 167 }
120 168
121 169 if (!$table_sync_error) {
@@ -126,21 +174,21 @@
126 174 $usermeta = get_user_meta( $user_id, 'uwp_usermeta', true );
127 175
128 176 foreach ($columns as $column) {
129 177 switch ($column) {
130 - case "uwp_account_username":
178 + case "username":
131 179 $value = $user_data->user_login;
132 180 break;
133 - case "uwp_account_email":
181 + case "email":
134 182 $value = $user_data->user_email;
135 183 break;
136 - case "uwp_account_first_name":
184 + case "first_name":
137 185 $value = $user_data->first_name;
138 186 break;
139 - case "uwp_account_last_name":
187 + case "last_name":
140 188 $value = $user_data->last_name;
141 189 break;
142 - case "uwp_account_bio":
190 + case "bio":
143 191 $value = $user_data->description;
144 192 break;
145 193 default:
146 194 if ($usermeta === false) {
@@ -160,9 +208,9 @@
160 208
161 209 if ($step >= $max_step) {
162 210 $done = true;
163 211 $message = __("Processed Successfully", 'userswp');
164 - $message = $this->uwp_tools_wrap_error_message($message, 'success');
212 + $message = $this->tools_wrap_error_message($message, 'success');
165 213 } else {
166 214 $done = false;
167 215 $step = $step + 1;
168 216 }
@@ -178,8 +226,252 @@
178 226 echo json_encode($output);
179 227
180 228 }
181 229
230 + /**
231 + * Exports DB texts for translation.
232 + *
233 + * @package userswp
234 + *
235 + * @param int $step Step for processing
236 + *
237 + * @return bool
238 + *
239 + */
240 + public function export_db_texts($step){
241 +
242 + $error = false;
243 + $percent = 100;
244 +
245 + $wp_filesystem = UsersWP_Files::uwp_init_filesystem();
246 +
247 + $language_file = USERSWP_PATH . 'db-language.php';
248 +
249 + if ( is_file( $language_file ) && ! is_writable( $language_file ) ) {
250 + return false;
251 + } // Not possible to create.
252 +
253 + if ( ! is_file( $language_file ) && ! is_writable( dirname( $language_file ) ) ) {
254 + return false;
255 + } // Not possible to create.
256 +
257 + $contents_strings = array();
258 +
259 + /**
260 + * Filter the language string from database to translate via po editor
261 + *
262 + * @since 1.2.2
263 + *
264 + * @param array $contents_strings Array of strings.
265 + */
266 + $contents_strings = apply_filters( 'uwp_load_db_language', $contents_strings );
267 +
268 + $contents_strings = array_unique( $contents_strings );
269 +
270 + $contents_head = array();
271 + $contents_head[] = "<?php";
272 + $contents_head[] = "/**";
273 + $contents_head[] = " * Translate language string stored in database. Ex: Custom Fields";
274 + $contents_head[] = " *";
275 + $contents_head[] = " * @package userswp";
276 + $contents_head[] = " * @since ".USERSWP_VERSION;
277 + $contents_head[] = " */";
278 + $contents_head[] = "";
279 +
280 + $contents_foot = array();
281 + $contents_foot[] = "";
282 + $contents_foot[] = "";
283 +
284 + $contents = implode( PHP_EOL, $contents_head );
285 +
286 + if ( ! empty( $contents_strings ) ) {
287 + foreach ( $contents_strings as $string ) {
288 + if ( is_scalar( $string ) && $string != '' ) {
289 + $string = str_replace( "'", "\'", $string );
290 +
291 + do_action( 'uwp_language_file_add_string', $string );
292 +
293 + $contents .= PHP_EOL . "__('" . $string . "', 'userswp');";
294 + }
295 + }
296 + }
297 +
298 + $contents .= implode( PHP_EOL, $contents_foot );
299 +
300 + if ( ! $wp_filesystem->put_contents( $language_file, $contents, FS_CHMOD_FILE ) ) {
301 + return false;
302 + } // Failure; could not write file.
303 +
304 + $done = true;
305 + $message = __("Processed Successfully", 'userswp');
306 + $message = $this->tools_wrap_error_message($message, 'success');
307 +
308 + $output = array(
309 + 'done' => $done,
310 + 'error' => $error,
311 + 'message' => $message,
312 + 'step' => $step,
313 + 'percent' => intval($percent)
314 + );
315 + echo json_encode($output);
316 + }
317 +
318 + /**
319 + * Get the custom fields texts for translation
320 + *
321 + * @since 1.2.2
322 + * @package userswp
323 + *
324 + * @global object $wpdb WordPress database abstraction object.
325 + *
326 + * @param array $translation_texts Array of text strings.
327 + *
328 + * @return array Translation texts.
329 + */
330 + public function load_custom_field_translation( $translation_texts = array() ) {
331 + global $wpdb;
332 +
333 + $table_name = uwp_get_table_prefix() . 'uwp_form_fields';
334 + // Custom fields table
335 + $sql = "SELECT site_title, form_label, help_text, required_msg, default_value, option_values, validation_msg FROM " . $table_name . " where form_type = 'account'";
336 + $rows = $wpdb->get_results( $sql ); // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching
337 +
338 + if ( ! empty( $rows ) ) {
339 + foreach ( $rows as $row ) {
340 + if ( ! empty( $row->site_title ) ) {
341 + $translation_texts[] = stripslashes_deep( $row->site_title );
342 + }
343 +
344 + if ( ! empty( $row->form_label ) ) {
345 + $translation_texts[] = stripslashes_deep( $row->form_label );
346 + }
347 +
348 + if ( ! empty( $row->help_text ) ) {
349 + $translation_texts[] = stripslashes_deep( $row->help_text );
350 + }
351 +
352 + if ( ! empty( $row->required_msg ) ) {
353 + $translation_texts[] = stripslashes_deep( $row->required_msg );
354 + }
355 +
356 + if ( ! empty( $row->validation_msg ) ) {
357 + $translation_texts[] = stripslashes_deep( $row->validation_msg );
358 + }
359 +
360 + if ( ! empty( $row->default_value ) ) {
361 + $translation_texts[] = stripslashes_deep( $row->default_value );
362 + }
363 +
364 + if ( ! empty( $row->placeholder_value ) ) {
365 + $translation_texts[] = stripslashes_deep( $row->placeholder_value );
366 + }
367 +
368 + if ( ! empty( $row->option_values ) ) {
369 + $option_values = uwp_string_values_to_options( stripslashes_deep( $row->option_values ) );
370 +
371 + if ( ! empty( $option_values ) ) {
372 + foreach ( $option_values as $option_value ) {
373 + if ( ! empty( $option_value['label'] ) ) {
374 + $translation_texts[] = $option_value['label'];
375 + }
376 + }
377 + }
378 + }
379 + }
380 + }
381 +
382 + $translation_texts = ! empty( $translation_texts ) ? array_unique( $translation_texts ) : $translation_texts;
383 +
384 + return $translation_texts;
385 + }
386 +
387 + /**
388 + * Get the userswp notification subject & content texts for translation.
389 + *
390 + * @since 1.2.2
391 + * @package userswp
392 + *
393 + * @param array $translation_texts Array of text strings.
394 + * @return array Translation texts.
395 + */
396 + public function load_uwp_options_text_translation($translation_texts = array()) {
397 + $translation_texts = !empty( $translation_texts ) && is_array( $translation_texts ) ? $translation_texts : array();
398 +
399 + $uwp_options = array(
400 + 'register_link_title',
401 + 'forgot_link_title',
402 + 'login_link_title',
403 + 'profile_link_title',
404 + 'account_link_title',
405 + 'author_box_content',
406 + 'author_box_content_bootstrap',
407 + 'email_name',
408 + 'email_footer_text',
409 + 'registration_activate_email_subject',
410 + 'registration_activate_email_content',
411 + 'registration_success_email_subject',
412 + 'registration_success_email_content',
413 + 'forgot_password_email_subject',
414 + 'forgot_password_email_content',
415 + 'change_password_email_subject',
416 + 'change_password_email_content',
417 + 'reset_password_email_subject',
418 + 'reset_password_email_content',
419 + 'account_update_email_subject',
420 + 'account_update_email_content',
421 + 'account_delete_email_subject',
422 + 'account_delete_email_content',
423 + 'registration_success_email_subject_admin',
424 + 'registration_success_email_content_admin',
425 + 'account_delete_email_subject_admin',
426 + 'account_delete_email_content_admin',
427 + 'wp_new_user_notification_email_subject',
428 + 'wp_new_user_notification_email_content',
429 + 'wp_new_user_notification_email_subject_admin',
430 + 'wp_new_user_notification_email_content_admin',
431 + 'account_new_email_activation_email',
432 + 'account_new_email_activation_email_subject',
433 + 'account_new_email_activation_email_content',
434 + );
435 +
436 + /**
437 + * Filters the userswp option names that requires to add for translation.
438 + *
439 + * @since 1.2.2
440 + * @package userswp
441 + *
442 + * @param array $uwp_options Array of option names.
443 + */
444 + $uwp_options = apply_filters('uwp_options_for_translation', $uwp_options);
445 + $uwp_options = array_unique($uwp_options);
446 +
447 + if (!empty($uwp_options)) {
448 + foreach ($uwp_options as $uwp_option) {
449 + if ($uwp_option != '' && $option_value = uwp_get_option($uwp_option)) {
450 + $option_value = is_string($option_value) ? stripslashes_deep($option_value) : '';
451 +
452 + if ($option_value != '' && !in_array($option_value, $translation_texts)) {
453 + $translation_texts[] = stripslashes_deep($option_value);
454 + }
455 + }
456 + }
457 + }
458 +
459 + $translation_texts = !empty($translation_texts) ? array_unique($translation_texts) : $translation_texts;
460 +
461 + return $translation_texts;
462 + }
463 +
464 + /**
465 + * Returns SQL data type for field
466 + *
467 + * @package userswp
468 + *
469 + * @param object $field Field object
470 + *
471 + * @return string
472 + *
473 + */
182 474 public function uwp_sql_datatype_from_field($field) {
183 475
184 476 switch ($field->field_type) {
185 477 case 'checkbox':
@@ -239,78 +531,71 @@
239 531
240 532 return $meta_field_add;
241 533 }
242 534
535 + /**
536 + * Process add or remove dummy users
537 + *
538 + * @package userswp
539 + *
540 + * @param int $step Current step
541 + * @param string $type Action type add or remove
542 + *
543 + */
243 544 public function uwp_tools_process_dummy_users($step, $type = 'add') {
545 + $items_per_page = apply_filters('tools_process_dummy_users_per_page', 10, $step, $type);
546 + $offset = (int) $step * $items_per_page;
547 + $message = '';
548 + $error = false;
549 + $percent = 100;
550 + $max_step = 0;
551 + if ('add' == $type) {
552 + $users_data = $this->uwp_dummy_users_data();
553 + $total_users = count($users_data);
554 + $max_step = ceil($total_users / $items_per_page) - 1;
555 + $percent = (($step + 1)/ ($max_step+1)) * 100;
556 + $dummy_users = array_slice($users_data, $offset, $items_per_page, true);
557 + foreach ( $dummy_users as $user ) {
558 + if ( username_exists( $user['login'] ) ) {
559 + continue;
560 + }
561 + $name = explode( ' ', $user['display_name'] );
562 + $user_id = wp_insert_user( array(
563 + 'user_login' => $user['login'],
564 + 'user_pass' => $user['pass'],
565 + 'first_name' => isset( $name[0] ) ? $name[0] : '',
566 + 'last_name' => isset( $name[1] ) ? $name[1] : '',
567 + 'display_name' => $user['display_name'],
568 + 'user_email' => $user['email'],
569 + 'user_registered' => uwp_get_random_date( 45, 1 ),
570 + ) );
571 + update_user_meta( $user_id, 'uwp_dummy_user', '1' );
572 + }
573 + }
574 + if ('remove' == $type) {
575 + $dummy_users = get_users( array( 'meta_key' => 'uwp_dummy_user', 'meta_value' => '1', 'fields' => array( 'ID' )) );
576 + $max_step = $step;
577 + foreach ( $dummy_users as $user ) {
578 + wp_delete_user($user->ID);
579 + }
580 + }
581 + if ($step >= $max_step) {
582 + $done = true;
583 + $message = __("Processed Successfully", 'userswp');
584 + $message = $this->tools_wrap_error_message($message, 'success');
585 + } else {
586 + $done = false;
587 + $step = $step + 1;
588 + }
589 + $output = array(
590 + 'done' => $done,
591 + 'error' => $error,
592 + 'message' => $message,
593 + 'step' => $step,
594 + 'percent' => intval($percent)
595 + );
596 + echo json_encode($output);
244 597
245 - global $wpdb;
246 - $items_per_page = apply_filters('tools_process_dummy_users_per_page', 10, $step, $type);
247 - $offset = (int) $step * $items_per_page;
248 - $message = '';
249 - $done = false;
250 - $error = false;
251 - $max_step = 0;
252 -
253 - if ('add' == $type) {
254 - $users_data = $this->uwp_dummy_users_data();
255 - $total_users = count($users_data);
256 - $max_step = ceil($total_users / $items_per_page) - 1;
257 - $percent = (($step + 1)/ ($max_step+1)) * 100;
258 - $dummy_users = array_slice($users_data, $offset, $items_per_page, true);
259 -
260 - foreach ( $dummy_users as $user ) {
261 - if ( username_exists( $user['login'] ) ) {
262 - continue;
263 - }
264 - $name = explode( ' ', $user['display_name'] );
265 -
266 - $user_id = wp_insert_user( array(
267 - 'user_login' => $user['login'],
268 - 'user_pass' => $user['pass'],
269 - 'first_name' => isset( $name[0] ) ? $name[0] : '',
270 - 'last_name' => isset( $name[1] ) ? $name[1] : '',
271 - 'display_name' => $user['display_name'],
272 - 'user_email' => $user['email'],
273 - 'user_registered' => uwp_get_random_date( 45, 1 ),
274 - ) );
275 -
276 - update_user_meta( $user_id, 'uwp_dummy_user', '1' );
277 - }
278 - }
279 -
280 - if ('remove' == $type) {
281 -
282 - $paged = !$step ? 1 : $step;
283 - $dummy_users = get_users( array( 'meta_key' => 'uwp_dummy_user', 'meta_value' => '1', 'fields' => array( 'ID' ), 'paged' => $paged, 'number' => $items_per_page ) );
284 -
285 - $count = $wpdb->get_var( $wpdb->prepare( "SELECT COUNT(*) FROM $wpdb->users LEFT JOIN $wpdb->usermeta ON $wpdb->users.ID = $wpdb->usermeta.user_id WHERE meta_key = 'uwp_dummy_user' AND meta_value = 1;", array()));
286 - $total_users = $count;
287 - $max_step = ceil($total_users / $items_per_page) - 1;
288 - $percent = (($step + 1)/ ($max_step+1)) * 100;
289 -
290 - foreach ( $dummy_users as $user ) {
291 - wp_delete_user($user->ID);
292 - }
293 - }
294 -
295 - if ($step >= $max_step) {
296 - $done = true;
297 - $message = __("Processed Successfully", 'userswp');
298 - $message = $this->uwp_tools_wrap_error_message($message, 'success');
299 - } else {
300 - $done = false;
301 - $step = $step + 1;
302 - }
303 -
304 - $output = array(
305 - 'done' => $done,
306 - 'error' => $error,
307 - 'message' => $message,
308 - 'step' => $step,
309 - 'percent' => intval($percent)
310 - );
311 - echo json_encode($output);
312 -
313 598 }
314 599
315 600 /**
316 601 * Get a site specific password for dummy users.
@@ -320,8 +605,16 @@
320 605 private static function get_dummy_user_passowrd(){
321 606 return substr(hash( 'SHA256', AUTH_KEY . site_url() ), 0, 15);
322 607 }
323 608
609 + /**
610 + * Returns array of dummy users
611 + *
612 + * @package userswp
613 + *
614 + * @return array
615 + *
616 + */
324 617 public function uwp_dummy_users_data() {
325 618
326 619 return array(
327 620 0 => array(
@@ -477,57 +770,58 @@
477 770 );
478 771
479 772 }
480 773
481 - /**
482 - * Adds the tools settings page menu as submenu.
483 - *
484 - * @since 1.0.0
485 - * @package userswp
486 - *
487 - * @param callable $settings_page The function to be called to output the content for this page.
488 - *
489 - * @return void
490 - */
491 - public function uwp_add_admin_tools_sub_menu($settings_page) {
492 -
493 - add_submenu_page(
494 - "userswp",
495 - __('Tools', 'userswp'),
496 - __('Tools', 'userswp'),
497 - 'manage_options',
498 - 'uwp_tools',
499 - $settings_page
500 - );
501 -
502 - }
503 -
504 - public function uwp_tools_main_tab_content() {
774 + /**
775 + * Outputs tools form
776 + *
777 + * @package userswp
778 + *
779 + */
780 + public static function output() {
781 + ob_start();
505 782 ?>
506 - <table class="form-table gd-tools-table">
783 + <div class="wrap userswp">
784 + <h1><?php echo esc_html( get_admin_page_title() ); ?></h1>
785 + <table class="uwp-tools-table widefat">
507 786 <tbody>
508 - <tr>
509 - <td><strong><?php _e('Tool', 'userswp');?></strong></td>
510 - <td><strong><?php _e('Description', 'userswp');?></strong></td>
511 - <td style="text-align: right"><strong><?php _e('Action', 'userswp');?></strong></td>
512 - </tr>
513 787
788 + <?php if (defined('USERSWP_VERSION')) {
789 + do_action('uwp_tools_output_start');
790 + ?>
791 + <tr>
792 + <th>
793 + <strong class="tool-name"><?php esc_html_e('Clear version numbers', 'userswp');?></strong>
794 + <p class="tool-description"><?php esc_html_e('This will force install/upgrade functions to run.', 'userswp');?></p>
795 + </th>
796 + <td class="run-tool">
797 + <input type="button" value="<?php esc_attr_e('Run', 'userswp');?>" class="button-primary uwp_diagnosis_button" data-diagnose="clear_version_numbers"/>
798 + </td>
799 + </tr>
514 800
515 - <?php if (defined('USERSWP_VERSION')) { ?>
516 801 <tr>
517 - <td><?php _e('Fix User Data', 'userswp');?></td>
518 - <td>
519 - <div style="margin-bottom: 10px"><?php _e('Fixes User Data if you were using the Beta version.', 'userswp');?></div>
802 + <td colspan="2" class="has-pbar">
803 + <div id="uwp_diagnose_pb_clear_version_numbers" class="uwp-pb-wrapper">
804 + <div class="progressBar" style="display: none;"><div></div></div>
805 + </div>
806 + <div id="uwp_diagnose_clear_version_numbers"></div>
520 807 </td>
521 - <td style="text-align: right">
522 - <input type="button" value="<?php _e('Run', 'userswp');?>" class="button-primary uwp_diagnosis_button" data-diagnose="fix_user_data"/>
808 + </tr>
809 +
810 + <tr>
811 + <th>
812 + <strong class="tool-name"><?php esc_html_e('Fix User Data', 'userswp');?></strong>
813 + <p class="tool-description"><?php esc_html_e('Fixes User Data if you were using the Beta version.', 'userswp');?></p>
814 + </th>
815 + <td class="run-tool">
816 + <input type="button" value="<?php esc_attr_e('Run', 'userswp');?>" class="button-primary uwp_diagnosis_button" data-diagnose="fix_user_data"/>
523 817 </td>
524 818 </tr>
525 819
526 820 <tr>
527 - <td colspan="3">
821 + <td colspan="2" class="has-pbar">
528 822 <div id="uwp_diagnose_pb_fix_user_data" class="uwp-pb-wrapper">
529 - <div id="progressBar" style="display: none;"><div></div></div>
823 + <div class="progressBar" style="display: none;"><div></div></div>
530 824 </div>
531 825 <div id="uwp_diagnose_fix_user_data"></div>
532 826 </td>
533 827 </tr>
@@ -532,45 +826,45 @@
532 826 </td>
533 827 </tr>
534 828
535 829 <tr>
536 - <td><?php _e('Dummy Users', 'userswp');?></td>
537 - <td>
538 - <div><?php _e('Dummy Users for Testing. Password for all dummy users:', 'userswp'); echo " ".self::get_dummy_user_passowrd();?></div>
830 + <th>
831 + <strong class="tool-name"><?php esc_html_e('DB text translation', 'userswp');?></strong>
832 + <p class="tool-description"><?php esc_html_e('This tool will collect any texts stored in the DB and put them in the file db-language.php so they can then be used to translate them by translations tools.', 'userswp');?></p>
833 + </th>
834 + <td class="run-tool">
835 + <input type="button" value="<?php esc_attr_e('Run', 'userswp');?>" class="button-primary uwp_diagnosis_button" data-diagnose="export_db_texts"/>
539 836 </td>
540 - <td style="text-align: right">
541 - <?php
542 - $nonce = wp_create_nonce( 'uwp_dummy_users' );
543 - $dummy_users_create_url = add_query_arg( array(
544 - 'uwp_dummy_users' => 'create',
545 - '_wpnonce' => $nonce,
546 - ));
837 + </tr>
547 838
548 - $dummy_users_remove_url = add_query_arg( array(
549 - 'uwp_dummy_users' => 'delete',
550 - '_wpnonce' => $nonce,
551 - ));
839 + <tr>
840 + <td colspan="2" class="has-pbar">
841 + <div id="uwp_diagnose_pb_export_db_texts" class="uwp-pb-wrapper">
842 + <div class="progressBar" style="display: none;"><div></div></div>
843 + </div>
844 + <div id="uwp_diagnose_export_db_texts"></div>
845 + </td>
846 + </tr>
552 847
553 - $dummy_users = get_users( array( 'meta_key' => 'uwp_dummy_user', 'meta_value' => '1', 'fields' => array( 'ID' ) ) );
554 -
555 - if ( count($dummy_users) > 0 ) {
556 - ?>
557 - <input type="button" value="<?php _e('Remove', 'userswp');?>" class="button-primary uwp_diagnosis_button" data-diagnose="remove_dummy_users"/>
558 - <?php
559 - } else {
560 - ?>
561 - <input type="button" value="<?php _e('Create', 'userswp');?>" class="button-primary uwp_diagnosis_button" data-diagnose="add_dummy_users"/>
562 - <?php
563 - }
564 -
565 - ?>
848 + <tr>
849 + <th>
850 + <strong class="tool-name"><?php esc_html_e('Dummy Users', 'userswp');?></strong>
851 + <p class="tool-description"><?php esc_html_e('Dummy Users for Testing. Password for all dummy users:', 'userswp'); echo " " . esc_html( self::get_dummy_user_passowrd() );?></p>
852 + </th>
853 + <td class="run-tool">
854 + <?php
855 + $dummy_users = get_users( array( 'meta_key' => 'uwp_dummy_user', 'meta_value' => '1', 'fields' => array( 'ID' ) ) );
856 + $total_dummy_users = !empty( $dummy_users ) ? count($dummy_users) : 0;
857 + ?>
858 + <input style="display: <?php echo ( $total_dummy_users > 0 ) ? 'none' :'block'; ?>" type="button" value="<?php esc_attr_e('Create', 'userswp');?>" class="button-primary uwp_diagnosis_button uwp_add_dummy_users_button" data-diagnose="add_dummy_users"/>
859 + <input style="display: <?php echo ( $total_dummy_users > 0 ) ? 'block' :'none'; ?>" type="button" value="<?php esc_attr_e('Remove', 'userswp');?>" class="button-primary uwp_diagnosis_button uwp_remove_dummy_users_button" data-diagnose="remove_dummy_users"/>
566 860 </td>
567 861 </tr>
568 862
569 863 <tr>
570 - <td colspan="3">
864 + <td colspan="2" class="has-pbar">
571 865 <div id="uwp_diagnose_pb_add_dummy_users" class="uwp-pb-wrapper">
572 - <div id="progressBar" style="display: none;"><div></div></div>
866 + <div class="progressBar" style="display: none;"><div></div></div>
573 867 </div>
574 868 <div id="uwp_diagnose_add_dummy_users"></div>
575 869 </td>
576 870 </tr>
@@ -575,20 +869,23 @@
575 869 </td>
576 870 </tr>
577 871
578 872 <tr>
579 - <td colspan="3">
873 + <td colspan="2" class="has-pbar">
580 874 <div id="uwp_diagnose_pb_remove_dummy_users" class="uwp-pb-wrapper">
581 - <div id="progressBar" style="display: none;"><div></div></div>
875 + <div class="progressBar" style="display: none;"><div></div></div>
582 876 </div>
583 877 <div id="uwp_diagnose_remove_dummy_users"></div>
584 878 </td>
585 879 </tr>
586 880
587 - <?php } ?>
881 + <?php
882 + do_action('uwp_tools_output_end');
883 + } ?>
588 884
589 885 </tbody>
590 886 </table>
887 + </div>
591 888
592 889 <script type="text/javascript">
593 890 (function( $, window, undefined ) {
594 891 $(document).ready(function () {
@@ -595,9 +892,10 @@
595 892 $('.uwp_diagnosis_button').click(function (e) {
596 893 e.preventDefault();
597 894 var type = $(this).data('diagnose');
598 895 $(this).hide();
599 - $("#uwp_diagnose_pb_" + type).find('#progressBar').show().progressbar({value: 0});
896 + jQuery("#uwp_diagnose_add_dummy_users,#uwp_diagnose_remove_dummy_users").html('');
897 + $("#uwp_diagnose_pb_" + type).find('.progressBar').show().progressbar({value: 0});
600 898 uwp_process_diagnose_step( 0, type );
601 899
602 900 });
603 901 });
@@ -611,15 +909,25 @@
611 909 data: {
612 910 action: 'uwp_process_diagnosis',
613 911 step: step,
614 912 type: type,
615 - security: '<?php echo wp_create_nonce('uwp_process_diagnosis'); ?>',
913 + security: '<?php echo esc_js( wp_create_nonce('uwp_process_diagnosis') ); ?>',
616 914 },
617 915 beforeSend: function() {},
618 916 success: function(response, textStatus, xhr) {
619 917 if(response.done === true || response.error === true ) {
620 - jQuery("#uwp_diagnose_pb_" + type).find('#progressBar').hide();
621 - jQuery("#uwp_diagnose_" + type).html(response.message);
918 + tools_progress(response.percent, type);
919 + setTimeout(function(){
920 + jQuery("#uwp_diagnose_pb_" + type).find('.progressBar').hide();
921 + jQuery("#uwp_diagnose_" + type).html(response.message);
922 + if( 'add_dummy_users' === type ) {
923 + jQuery('.uwp_remove_dummy_users_button').show();
924 + jQuery('.uwp_add_dummy_users_button').hide();
925 + } else{
926 + jQuery('.uwp_add_dummy_users_button').show();
927 + jQuery('.uwp_remove_dummy_users_button').hide();
928 + }
929 + }, 1500);
622 930 } else {
623 931 tools_progress(response.percent, type);
624 932 setTimeout(function(){
625 933 uwp_process_diagnose_step(parseInt( response.step ), type)
@@ -632,9 +940,9 @@
632 940 }); // end of ajax
633 941
634 942
635 943 function tools_progress(percent, type) {
636 - $element = jQuery("#uwp_diagnose_pb_" + type).find('#progressBar');
944 + $element = jQuery("#uwp_diagnose_pb_" + type).find('.progressBar');
637 945 var progressBarWidth = percent * $element.width() / 100;
638 946 $element.find('div').animate({ width: progressBarWidth }, 500).html(percent + "% ");
639 947 }
640 948 }
@@ -639,11 +947,16 @@
639 947 }
640 948 }
641 949 </script>
642 950 <?php
951 +
952 + echo ob_get_clean(); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
643 953 }
644 954
645 - function uwp_process_diagnosis_ajax() {
955 + /**
956 + * Process diagnosis AJAX call
957 + */
958 + public function uwp_process_diagnosis_ajax() {
646 959
647 960 if (!is_user_logged_in()) {
648 961 return;
649 962 }
@@ -663,13 +976,28 @@
663 976 die();
664 977
665 978 }
666 979
667 - function uwp_process_diagnosis($type, $step) {
980 + /**
981 + * Process diagnosis step
982 + *
983 + * @package userswp
984 + *
985 + * @param string $type Action type
986 + * @param int $step Current step
987 + *
988 + */
989 + public function uwp_process_diagnosis($type, $step) {
668 990 switch ($type) {
991 + case 'clear_version_numbers':
992 + $this->clear_version_numbers();
993 + break;
669 994 case 'fix_user_data':
670 - $this->uwp_fix_usermeta($step);
995 + $this->fix_usermeta($step);
671 996 break;
997 + case 'export_db_texts':
998 + $this->export_db_texts($step);
999 + break;
672 1000 case 'add_dummy_users':
673 1001 $this->uwp_tools_process_dummy_users($step, 'add');
674 1002 break;
675 1003 case 'remove_dummy_users':
@@ -674,8 +1002,129 @@
674 1002 break;
675 1003 case 'remove_dummy_users':
676 1004 $this->uwp_tools_process_dummy_users($step, 'remove');
677 1005 break;
1006 + default :
1007 + do_action('uwp_process_diagnosis', $type, $step);
678 1008 }
679 1009 }
1010 +
1011 +
1012 + /**
1013 + * Clear version numbers so install/upgrade functions will run.
1014 + */
1015 + public function clear_version_numbers(){
1016 + delete_option( 'uwp_db_version' );
1017 + do_action( 'uwp_clear_version_numbers'); // used by addons to clear their version numbers.
1018 + $message = aui()->alert(array(
1019 + 'type'=>'success',
1020 + 'content'=> __( 'Version numbers cleared. Install/upgrade functions will run on next page load.', 'userswp' )
1021 + )
1022 + );
1023 + $output = array(
1024 + 'done' => true,
1025 + 'message' => "<div class='bsui'>".$message."</div>",
1026 + );
1027 + echo json_encode($output);
1028 + }
1029 +
1030 + public static function setup_menu( $menu_id = '',$menu_location = '' ) {
1031 +
1032 + $menu_id = sanitize_title_with_dashes($menu_id);
1033 + $menu_location = sanitize_title_with_dashes($menu_location);
1034 +
1035 + // confirm the sidebar_id is valid
1036 + if(!$menu_id && !$menu_location){
1037 + return new WP_Error( 'uwp-wizard-setup-menu', __( "The menu is not valid.", "userswp" ) );
1038 + }
1039 +
1040 + $items_added = 0;
1041 + $items_exist= 0;
1042 +
1043 + if($menu_id){
1044 +
1045 + $menu_exists = wp_get_nav_menu_object( $menu_id );
1046 +
1047 + if(!$menu_exists){
1048 + return new WP_Error( 'uwp-wizard-setup-menu', __( "The menu is not valid.", "userswp" ) );
1049 + }
1050 +
1051 + $current_menu_items = wp_get_nav_menu_items( $menu_id );
1052 +
1053 + $current_menu_titles = array();
1054 + // get a list of current slugs so we don't add things twice.
1055 + if(!empty($current_menu_items)){
1056 + foreach($current_menu_items as $current_menu_item){
1057 + if(!empty($current_menu_item->post_name)){
1058 + $current_menu_titles[] = $current_menu_item->title;
1059 + }
1060 + }
1061 + }
1062 +
1063 + $uwp_menus = new UsersWP_Menus();
1064 + $uwp_menu_items = $uwp_menus->get_endpoints();
1065 +
1066 + if(!empty($uwp_menu_items)){
1067 + foreach($uwp_menu_items as $menu_item_type){
1068 + if(!empty($menu_item_type)){
1069 +
1070 + $menu_item_type = array_map('wp_setup_nav_menu_item', $menu_item_type);
1071 +
1072 + foreach($menu_item_type as $menu_item){
1073 +
1074 + if(!empty($current_menu_titles) && (in_array($menu_item->title,$current_menu_titles) || in_array(str_replace(" page",'',$menu_item->title),$current_menu_titles))){
1075 + $items_exist++; continue 2;
1076 + }
1077 +
1078 + // setup standard menu stuff
1079 + $menu_item->{'menu-item-object-id'} = $menu_item->object_id;
1080 + $menu_item->{'menu-item-object'} = $menu_item->object;
1081 + $menu_item->{'menu-item-type'} = $menu_item->type;
1082 + $menu_item->{'menu-item-status'} = 'publish';
1083 + $menu_item->{'menu-item-classes'} = !empty($menu_item->classes) ? implode(" ",$menu_item->classes) : 'uwp-menu-item';
1084 + if($menu_item->type=='custom'){
1085 + $menu_item->{'menu-item-url'} = $menu_item->url;
1086 + $menu_item->{'menu-item-title'} = $menu_item->title;
1087 + }
1088 +
1089 + wp_update_nav_menu_item($menu_id, 0, $menu_item);
1090 + $items_added++;
1091 + }
1092 + }
1093 + }
1094 + }
1095 +
1096 + } elseif($menu_location){
1097 +
1098 + $menuname = "UsersWP Menu";
1099 +
1100 + $menu_exists = wp_get_nav_menu_object( $menuname );
1101 +
1102 + // If it doesn't exist, let's create it.
1103 + if( !$menu_exists) {
1104 + $menu_id = wp_create_nav_menu( $menuname );
1105 +
1106 + $locations = get_theme_mod( 'nav_menu_locations' );
1107 +
1108 + if($menu_id){
1109 + $locations[$menu_location] = $menu_id;
1110 + set_theme_mod('nav_menu_locations', $locations);
1111 + return self::setup_menu($menu_id);
1112 + }
1113 +
1114 + }else{
1115 + return new WP_Error( 'uwp-wizard-setup-menu', __( "Menu already exists.", "userswp" ) );
1116 + }
1117 +
1118 + }
1119 +
1120 + if($items_added == 0 && $items_exist > 0){
1121 + return __( 'Menu items already exist, none added.' , 'userswp' );
1122 + }elseif($items_added > 0){
1123 + return __( 'Menu items added successfully.' , 'userswp' );
1124 + }else{
1125 + return __( 'Something went wrong, you can manually add items in Appearance > Menus' , 'userswp' );
1126 + }
1127 +
1128 + }
680 1129
681 1130 }