177 exit; |
183 exit; |
178 } |
184 } |
179 |
185 |
180 // Intentional fall-through to display $errors. |
186 // Intentional fall-through to display $errors. |
181 default: |
187 default: |
182 $profileuser = get_user_to_edit( $user_id ); |
188 $profile_user = get_user_to_edit( $user_id ); |
183 |
189 |
184 if ( ! current_user_can( 'edit_user', $user_id ) ) { |
190 if ( ! current_user_can( 'edit_user', $user_id ) ) { |
185 wp_die( __( 'Sorry, you are not allowed to edit this user.' ) ); |
191 wp_die( __( 'Sorry, you are not allowed to edit this user.' ) ); |
186 } |
192 } |
187 |
193 |
188 $title = sprintf( $title, $profileuser->display_name ); |
194 $title = sprintf( $title, $profile_user->display_name ); |
189 $sessions = WP_Session_Tokens::get_instance( $profileuser->ID ); |
195 $sessions = WP_Session_Tokens::get_instance( $profile_user->ID ); |
190 |
196 |
191 require_once ABSPATH . 'wp-admin/admin-header.php'; |
197 require_once ABSPATH . 'wp-admin/admin-header.php'; |
192 ?> |
198 ?> |
193 |
199 |
194 <?php if ( ! IS_PROFILE_PAGE && is_super_admin( $profileuser->ID ) && current_user_can( 'manage_network_options' ) ) { ?> |
200 <?php if ( ! IS_PROFILE_PAGE && is_super_admin( $profile_user->ID ) && current_user_can( 'manage_network_options' ) ) : ?> |
195 <div class="notice notice-info"><p><strong><?php _e( 'Important:' ); ?></strong> <?php _e( 'This user has super admin privileges.' ); ?></p></div> |
201 <div class="notice notice-info"><p><strong><?php _e( 'Important:' ); ?></strong> <?php _e( 'This user has super admin privileges.' ); ?></p></div> |
196 <?php } ?> |
202 <?php endif; ?> |
|
203 |
197 <?php if ( isset( $_GET['updated'] ) ) : ?> |
204 <?php if ( isset( $_GET['updated'] ) ) : ?> |
198 <div id="message" class="updated notice is-dismissible"> |
205 <div id="message" class="updated notice is-dismissible"> |
199 <?php if ( IS_PROFILE_PAGE ) : ?> |
206 <?php if ( IS_PROFILE_PAGE ) : ?> |
200 <p><strong><?php _e( 'Profile updated.' ); ?></strong></p> |
207 <p><strong><?php _e( 'Profile updated.' ); ?></strong></p> |
201 <?php else : ?> |
208 <?php else : ?> |
202 <p><strong><?php _e( 'User updated.' ); ?></strong></p> |
209 <p><strong><?php _e( 'User updated.' ); ?></strong></p> |
203 <?php endif; ?> |
210 <?php endif; ?> |
204 <?php if ( $wp_http_referer && false === strpos( $wp_http_referer, 'user-new.php' ) && ! IS_PROFILE_PAGE ) : ?> |
211 <?php if ( $wp_http_referer && false === strpos( $wp_http_referer, 'user-new.php' ) && ! IS_PROFILE_PAGE ) : ?> |
205 <p><a href="<?php echo esc_url( wp_validate_redirect( esc_url_raw( $wp_http_referer ), self_admin_url( 'users.php' ) ) ); ?>"><?php _e( '← Go to Users' ); ?></a></p> |
212 <p><a href="<?php echo esc_url( wp_validate_redirect( esc_url_raw( $wp_http_referer ), self_admin_url( 'users.php' ) ) ); ?>"><?php _e( '← Go to Users' ); ?></a></p> |
206 <?php endif; ?> |
213 <?php endif; ?> |
207 </div> |
214 </div> |
208 <?php endif; ?> |
215 <?php endif; ?> |
|
216 |
209 <?php if ( isset( $_GET['error'] ) ) : ?> |
217 <?php if ( isset( $_GET['error'] ) ) : ?> |
210 <div class="notice notice-error"> |
218 <div class="notice notice-error"> |
211 <?php if ( 'new-email' === $_GET['error'] ) : ?> |
219 <?php if ( 'new-email' === $_GET['error'] ) : ?> |
212 <p><?php _e( 'Error while saving the new email address. Please try again.' ); ?></p> |
220 <p><?php _e( 'Error while saving the new email address. Please try again.' ); ?></p> |
213 <?php endif; ?> |
221 <?php endif; ?> |
214 </div> |
222 </div> |
215 <?php endif; ?> |
223 <?php endif; ?> |
|
224 |
216 <?php if ( isset( $errors ) && is_wp_error( $errors ) ) : ?> |
225 <?php if ( isset( $errors ) && is_wp_error( $errors ) ) : ?> |
217 <div class="error"><p><?php echo implode( "</p>\n<p>", $errors->get_error_messages() ); ?></p></div> |
226 <div class="error"> |
|
227 <p><?php echo implode( "</p>\n<p>", $errors->get_error_messages() ); ?></p> |
|
228 </div> |
218 <?php endif; ?> |
229 <?php endif; ?> |
219 |
230 |
220 <div class="wrap" id="profile-page"> |
231 <div class="wrap" id="profile-page"> |
221 <h1 class="wp-heading-inline"> |
232 <h1 class="wp-heading-inline"> |
222 <?php |
233 <?php echo esc_html( $title ); ?> |
223 echo esc_html( $title ); |
234 </h1> |
224 ?> |
235 |
225 </h1> |
236 <?php if ( ! IS_PROFILE_PAGE ) : ?> |
226 |
237 <?php if ( current_user_can( 'create_users' ) ) : ?> |
227 <?php |
238 <a href="user-new.php" class="page-title-action"><?php echo esc_html_x( 'Add New', 'user' ); ?></a> |
228 if ( ! IS_PROFILE_PAGE ) { |
239 <?php elseif ( is_multisite() && current_user_can( 'promote_users' ) ) : ?> |
229 if ( current_user_can( 'create_users' ) ) { |
240 <a href="user-new.php" class="page-title-action"><?php echo esc_html_x( 'Add Existing', 'user' ); ?></a> |
230 ?> |
241 <?php endif; ?> |
231 <a href="user-new.php" class="page-title-action"><?php echo esc_html_x( 'Add New', 'user' ); ?></a> |
|
232 <?php } elseif ( is_multisite() && current_user_can( 'promote_users' ) ) { ?> |
|
233 <a href="user-new.php" class="page-title-action"><?php echo esc_html_x( 'Add Existing', 'user' ); ?></a> |
|
234 <?php |
|
235 } |
|
236 } |
|
237 ?> |
|
238 |
|
239 <hr class="wp-header-end"> |
|
240 |
|
241 <form id="your-profile" action="<?php echo esc_url( self_admin_url( IS_PROFILE_PAGE ? 'profile.php' : 'user-edit.php' ) ); ?>" method="post" novalidate="novalidate" |
|
242 <?php |
|
243 /** |
|
244 * Fires inside the your-profile form tag on the user editing screen. |
|
245 * |
|
246 * @since 3.0.0 |
|
247 */ |
|
248 do_action( 'user_edit_form_tag' ); |
|
249 ?> |
|
250 > |
|
251 <?php wp_nonce_field( 'update-user_' . $user_id ); ?> |
|
252 <?php if ( $wp_http_referer ) : ?> |
|
253 <input type="hidden" name="wp_http_referer" value="<?php echo esc_url( $wp_http_referer ); ?>" /> |
|
254 <?php endif; ?> |
|
255 <p> |
|
256 <input type="hidden" name="from" value="profile" /> |
|
257 <input type="hidden" name="checkuser_id" value="<?php echo get_current_user_id(); ?>" /> |
|
258 </p> |
|
259 |
|
260 <h2><?php _e( 'Personal Options' ); ?></h2> |
|
261 |
|
262 <table class="form-table" role="presentation"> |
|
263 <?php if ( ! ( IS_PROFILE_PAGE && ! $user_can_edit ) ) : ?> |
|
264 <tr class="user-rich-editing-wrap"> |
|
265 <th scope="row"><?php _e( 'Visual Editor' ); ?></th> |
|
266 <td> |
|
267 <label for="rich_editing"><input name="rich_editing" type="checkbox" id="rich_editing" value="false" <?php checked( 'false', $profileuser->rich_editing ); ?> /> |
|
268 <?php _e( 'Disable the visual editor when writing' ); ?> |
|
269 </label> |
|
270 </td> |
|
271 </tr> |
|
272 <?php endif; ?> |
|
273 <?php |
|
274 $show_syntax_highlighting_preference = ( |
|
275 // For Custom HTML widget and Additional CSS in Customizer. |
|
276 user_can( $profileuser, 'edit_theme_options' ) |
|
277 || |
|
278 // Edit plugins. |
|
279 user_can( $profileuser, 'edit_plugins' ) |
|
280 || |
|
281 // Edit themes. |
|
282 user_can( $profileuser, 'edit_themes' ) |
|
283 ); |
|
284 ?> |
|
285 |
|
286 <?php if ( $show_syntax_highlighting_preference ) : ?> |
|
287 <tr class="user-syntax-highlighting-wrap"> |
|
288 <th scope="row"><?php _e( 'Syntax Highlighting' ); ?></th> |
|
289 <td> |
|
290 <label for="syntax_highlighting"><input name="syntax_highlighting" type="checkbox" id="syntax_highlighting" value="false" <?php checked( 'false', $profileuser->syntax_highlighting ); ?> /> |
|
291 <?php _e( 'Disable syntax highlighting when editing code' ); ?> |
|
292 </label> |
|
293 </td> |
|
294 </tr> |
|
295 <?php endif; ?> |
|
296 |
|
297 <?php if ( count( $_wp_admin_css_colors ) > 1 && has_action( 'admin_color_scheme_picker' ) ) : ?> |
|
298 <tr class="user-admin-color-wrap"> |
|
299 <th scope="row"><?php _e( 'Admin Color Scheme' ); ?></th> |
|
300 <td> |
|
301 <?php |
|
302 /** |
|
303 * Fires in the 'Admin Color Scheme' section of the user editing screen. |
|
304 * |
|
305 * The section is only enabled if a callback is hooked to the action, |
|
306 * and if there is more than one defined color scheme for the admin. |
|
307 * |
|
308 * @since 3.0.0 |
|
309 * @since 3.8.1 Added `$user_id` parameter. |
|
310 * |
|
311 * @param int $user_id The user ID. |
|
312 */ |
|
313 do_action( 'admin_color_scheme_picker', $user_id ); |
|
314 ?> |
|
315 </td> |
|
316 </tr> |
|
317 <?php endif; // End if count ( $_wp_admin_css_colors ) > 1 ?> |
|
318 |
|
319 <?php if ( ! ( IS_PROFILE_PAGE && ! $user_can_edit ) ) : ?> |
|
320 <tr class="user-comment-shortcuts-wrap"> |
|
321 <th scope="row"><?php _e( 'Keyboard Shortcuts' ); ?></th> |
|
322 <td> |
|
323 <label for="comment_shortcuts"> |
|
324 <input type="checkbox" name="comment_shortcuts" id="comment_shortcuts" value="true" <?php checked( 'true', $profileuser->comment_shortcuts ); ?> /> |
|
325 <?php _e( 'Enable keyboard shortcuts for comment moderation.' ); ?> |
|
326 </label> |
|
327 <?php _e( '<a href="https://wordpress.org/support/article/keyboard-shortcuts/" target="_blank">More information</a>' ); ?> |
|
328 </td> |
|
329 </tr> |
|
330 <?php endif; ?> |
|
331 |
|
332 <tr class="show-admin-bar user-admin-bar-front-wrap"> |
|
333 <th scope="row"><?php _e( 'Toolbar' ); ?></th> |
|
334 <td> |
|
335 <label for="admin_bar_front"> |
|
336 <input name="admin_bar_front" type="checkbox" id="admin_bar_front" value="1"<?php checked( _get_admin_bar_pref( 'front', $profileuser->ID ) ); ?> /> |
|
337 <?php _e( 'Show Toolbar when viewing site' ); ?> |
|
338 </label><br /> |
|
339 </td> |
|
340 </tr> |
|
341 |
|
342 <?php |
|
343 $languages = get_available_languages(); |
|
344 if ( $languages ) : |
|
345 ?> |
|
346 <tr class="user-language-wrap"> |
|
347 <th scope="row"> |
|
348 <?php /* translators: The user language selection field label. */ ?> |
|
349 <label for="locale"><?php _e( 'Language' ); ?><span class="dashicons dashicons-translation" aria-hidden="true"></span></label> |
|
350 </th> |
|
351 <td> |
|
352 <?php |
|
353 $user_locale = $profileuser->locale; |
|
354 |
|
355 if ( 'en_US' === $user_locale ) { |
|
356 $user_locale = ''; |
|
357 } elseif ( '' === $user_locale || ! in_array( $user_locale, $languages, true ) ) { |
|
358 $user_locale = 'site-default'; |
|
359 } |
|
360 |
|
361 wp_dropdown_languages( |
|
362 array( |
|
363 'name' => 'locale', |
|
364 'id' => 'locale', |
|
365 'selected' => $user_locale, |
|
366 'languages' => $languages, |
|
367 'show_available_translations' => false, |
|
368 'show_option_site_default' => true, |
|
369 ) |
|
370 ); |
|
371 ?> |
|
372 </td> |
|
373 </tr> |
|
374 <?php |
|
375 endif; |
|
376 ?> |
|
377 |
|
378 <?php |
|
379 /** |
|
380 * Fires at the end of the 'Personal Options' settings table on the user editing screen. |
|
381 * |
|
382 * @since 2.7.0 |
|
383 * |
|
384 * @param WP_User $profileuser The current WP_User object. |
|
385 */ |
|
386 do_action( 'personal_options', $profileuser ); |
|
387 ?> |
|
388 |
|
389 </table> |
|
390 <?php |
|
391 if ( IS_PROFILE_PAGE ) { |
|
392 /** |
|
393 * Fires after the 'Personal Options' settings table on the 'Profile' editing screen. |
|
394 * |
|
395 * The action only fires if the current user is editing their own profile. |
|
396 * |
|
397 * @since 2.0.0 |
|
398 * |
|
399 * @param WP_User $profileuser The current WP_User object. |
|
400 */ |
|
401 do_action( 'profile_personal_options', $profileuser ); |
|
402 } |
|
403 ?> |
|
404 |
|
405 <h2><?php _e( 'Name' ); ?></h2> |
|
406 |
|
407 <table class="form-table" role="presentation"> |
|
408 <tr class="user-user-login-wrap"> |
|
409 <th><label for="user_login"><?php _e( 'Username' ); ?></label></th> |
|
410 <td><input type="text" name="user_login" id="user_login" value="<?php echo esc_attr( $profileuser->user_login ); ?>" disabled="disabled" class="regular-text" /> <span class="description"><?php _e( 'Usernames cannot be changed.' ); ?></span></td> |
|
411 </tr> |
|
412 |
|
413 <?php if ( ! IS_PROFILE_PAGE && ! is_network_admin() && current_user_can( 'promote_user', $profileuser->ID ) ) : ?> |
|
414 <tr class="user-role-wrap"><th><label for="role"><?php _e( 'Role' ); ?></label></th> |
|
415 <td><select name="role" id="role"> |
|
416 <?php |
|
417 // Compare user role against currently editable roles. |
|
418 $user_roles = array_intersect( array_values( $profileuser->roles ), array_keys( get_editable_roles() ) ); |
|
419 $user_role = reset( $user_roles ); |
|
420 |
|
421 // Print the full list of roles with the primary one selected. |
|
422 wp_dropdown_roles( $user_role ); |
|
423 |
|
424 // Print the 'no role' option. Make it selected if the user has no role yet. |
|
425 if ( $user_role ) { |
|
426 echo '<option value="">' . __( '— No role for this site —' ) . '</option>'; |
|
427 } else { |
|
428 echo '<option value="" selected="selected">' . __( '— No role for this site —' ) . '</option>'; |
|
429 } |
|
430 ?> |
|
431 </select></td></tr> |
|
432 <?php |
|
433 endif; // End if ! IS_PROFILE_PAGE. |
|
434 |
|
435 if ( is_multisite() && is_network_admin() && ! IS_PROFILE_PAGE && current_user_can( 'manage_network_options' ) && ! isset( $super_admins ) ) { |
|
436 ?> |
|
437 <tr class="user-super-admin-wrap"><th><?php _e( 'Super Admin' ); ?></th> |
|
438 <td> |
|
439 <?php if ( 0 !== strcasecmp( $profileuser->user_email, get_site_option( 'admin_email' ) ) || ! is_super_admin( $profileuser->ID ) ) : ?> |
|
440 <p><label><input type="checkbox" id="super_admin" name="super_admin"<?php checked( is_super_admin( $profileuser->ID ) ); ?> /> <?php _e( 'Grant this user super admin privileges for the Network.' ); ?></label></p> |
|
441 <?php else : ?> |
|
442 <p><?php _e( 'Super admin privileges cannot be removed because this user has the network admin email.' ); ?></p> |
|
443 <?php endif; ?> |
|
444 </td></tr> |
|
445 <?php } ?> |
|
446 |
|
447 <tr class="user-first-name-wrap"> |
|
448 <th><label for="first_name"><?php _e( 'First Name' ); ?></label></th> |
|
449 <td><input type="text" name="first_name" id="first_name" value="<?php echo esc_attr( $profileuser->first_name ); ?>" class="regular-text" /></td> |
|
450 </tr> |
|
451 |
|
452 <tr class="user-last-name-wrap"> |
|
453 <th><label for="last_name"><?php _e( 'Last Name' ); ?></label></th> |
|
454 <td><input type="text" name="last_name" id="last_name" value="<?php echo esc_attr( $profileuser->last_name ); ?>" class="regular-text" /></td> |
|
455 </tr> |
|
456 |
|
457 <tr class="user-nickname-wrap"> |
|
458 <th><label for="nickname"><?php _e( 'Nickname' ); ?> <span class="description"><?php _e( '(required)' ); ?></span></label></th> |
|
459 <td><input type="text" name="nickname" id="nickname" value="<?php echo esc_attr( $profileuser->nickname ); ?>" class="regular-text" /></td> |
|
460 </tr> |
|
461 |
|
462 <tr class="user-display-name-wrap"> |
|
463 <th><label for="display_name"><?php _e( 'Display name publicly as' ); ?></label></th> |
|
464 <td> |
|
465 <select name="display_name" id="display_name"> |
|
466 <?php |
|
467 $public_display = array(); |
|
468 $public_display['display_nickname'] = $profileuser->nickname; |
|
469 $public_display['display_username'] = $profileuser->user_login; |
|
470 |
|
471 if ( ! empty( $profileuser->first_name ) ) { |
|
472 $public_display['display_firstname'] = $profileuser->first_name; |
|
473 } |
|
474 |
|
475 if ( ! empty( $profileuser->last_name ) ) { |
|
476 $public_display['display_lastname'] = $profileuser->last_name; |
|
477 } |
|
478 |
|
479 if ( ! empty( $profileuser->first_name ) && ! empty( $profileuser->last_name ) ) { |
|
480 $public_display['display_firstlast'] = $profileuser->first_name . ' ' . $profileuser->last_name; |
|
481 $public_display['display_lastfirst'] = $profileuser->last_name . ' ' . $profileuser->first_name; |
|
482 } |
|
483 |
|
484 if ( ! in_array( $profileuser->display_name, $public_display, true ) ) { // Only add this if it isn't duplicated elsewhere. |
|
485 $public_display = array( 'display_displayname' => $profileuser->display_name ) + $public_display; |
|
486 } |
|
487 |
|
488 $public_display = array_map( 'trim', $public_display ); |
|
489 $public_display = array_unique( $public_display ); |
|
490 |
|
491 foreach ( $public_display as $id => $item ) { |
|
492 ?> |
|
493 <option <?php selected( $profileuser->display_name, $item ); ?>><?php echo $item; ?></option> |
|
494 <?php |
|
495 } |
|
496 ?> |
|
497 </select> |
|
498 </td> |
|
499 </tr> |
|
500 </table> |
|
501 |
|
502 <h2><?php _e( 'Contact Info' ); ?></h2> |
|
503 |
|
504 <table class="form-table" role="presentation"> |
|
505 <tr class="user-email-wrap"> |
|
506 <th><label for="email"><?php _e( 'Email' ); ?> <span class="description"><?php _e( '(required)' ); ?></span></label></th> |
|
507 <td><input type="email" name="email" id="email" aria-describedby="email-description" value="<?php echo esc_attr( $profileuser->user_email ); ?>" class="regular-text ltr" /> |
|
508 <?php |
|
509 if ( $profileuser->ID == $current_user->ID ) : |
|
510 ?> |
|
511 <p class="description" id="email-description"> |
|
512 <?php _e( 'If you change this, we will send you an email at your new address to confirm it. <strong>The new address will not become active until confirmed.</strong>' ); ?> |
|
513 </p> |
|
514 <?php |
|
515 endif; |
|
516 |
|
517 $new_email = get_user_meta( $current_user->ID, '_new_email', true ); |
|
518 if ( $new_email && $new_email['newemail'] != $current_user->user_email && $profileuser->ID == $current_user->ID ) : |
|
519 ?> |
|
520 <div class="updated inline"> |
|
521 <p> |
|
522 <?php |
|
523 printf( |
|
524 /* translators: %s: New email. */ |
|
525 __( 'There is a pending change of your email to %s.' ), |
|
526 '<code>' . esc_html( $new_email['newemail'] ) . '</code>' |
|
527 ); |
|
528 printf( |
|
529 ' <a href="%1$s">%2$s</a>', |
|
530 esc_url( wp_nonce_url( self_admin_url( 'profile.php?dismiss=' . $current_user->ID . '_new_email' ), 'dismiss-' . $current_user->ID . '_new_email' ) ), |
|
531 __( 'Cancel' ) |
|
532 ); |
|
533 ?> |
|
534 </p> |
|
535 </div> |
|
536 <?php endif; ?> |
|
537 </td> |
|
538 </tr> |
|
539 |
|
540 <tr class="user-url-wrap"> |
|
541 <th><label for="url"><?php _e( 'Website' ); ?></label></th> |
|
542 <td><input type="url" name="url" id="url" value="<?php echo esc_attr( $profileuser->user_url ); ?>" class="regular-text code" /></td> |
|
543 </tr> |
|
544 |
|
545 <?php |
|
546 foreach ( wp_get_user_contact_methods( $profileuser ) as $name => $desc ) { |
|
547 ?> |
|
548 <tr class="user-<?php echo $name; ?>-wrap"> |
|
549 <th><label for="<?php echo $name; ?>"> |
|
550 <?php |
|
551 /** |
|
552 * Filters a user contactmethod label. |
|
553 * |
|
554 * The dynamic portion of the filter hook, `$name`, refers to |
|
555 * each of the keys in the contactmethods array. |
|
556 * |
|
557 * @since 2.9.0 |
|
558 * |
|
559 * @param string $desc The translatable label for the contactmethod. |
|
560 */ |
|
561 echo apply_filters( "user_{$name}_label", $desc ); |
|
562 ?> |
|
563 </label></th> |
|
564 <td><input type="text" name="<?php echo $name; ?>" id="<?php echo $name; ?>" value="<?php echo esc_attr( $profileuser->$name ); ?>" class="regular-text" /></td> |
|
565 </tr> |
|
566 <?php |
|
567 } |
|
568 ?> |
|
569 </table> |
|
570 |
|
571 <h2><?php IS_PROFILE_PAGE ? _e( 'About Yourself' ) : _e( 'About the user' ); ?></h2> |
|
572 |
|
573 <table class="form-table" role="presentation"> |
|
574 <tr class="user-description-wrap"> |
|
575 <th><label for="description"><?php _e( 'Biographical Info' ); ?></label></th> |
|
576 <td><textarea name="description" id="description" rows="5" cols="30"><?php echo $profileuser->description; // textarea_escaped ?></textarea> |
|
577 <p class="description"><?php _e( 'Share a little biographical information to fill out your profile. This may be shown publicly.' ); ?></p></td> |
|
578 </tr> |
|
579 |
|
580 <?php if ( get_option( 'show_avatars' ) ) : ?> |
|
581 <tr class="user-profile-picture"> |
|
582 <th><?php _e( 'Profile Picture' ); ?></th> |
|
583 <td> |
|
584 <?php echo get_avatar( $user_id ); ?> |
|
585 <p class="description"> |
|
586 <?php |
|
587 if ( IS_PROFILE_PAGE ) { |
|
588 $description = sprintf( |
|
589 /* translators: %s: Gravatar URL. */ |
|
590 __( '<a href="%s">You can change your profile picture on Gravatar</a>.' ), |
|
591 __( 'https://en.gravatar.com/' ) |
|
592 ); |
|
593 } else { |
|
594 $description = ''; |
|
595 } |
|
596 |
|
597 /** |
|
598 * Filters the user profile picture description displayed under the Gravatar. |
|
599 * |
|
600 * @since 4.4.0 |
|
601 * @since 4.7.0 Added the `$profileuser` parameter. |
|
602 * |
|
603 * @param string $description The description that will be printed. |
|
604 * @param WP_User $profileuser The current WP_User object. |
|
605 */ |
|
606 echo apply_filters( 'user_profile_picture_description', $description, $profileuser ); |
|
607 ?> |
|
608 </p> |
|
609 </td> |
|
610 </tr> |
|
611 <?php endif; ?> |
|
612 <?php |
|
613 /** |
|
614 * Filters the display of the password fields. |
|
615 * |
|
616 * @since 1.5.1 |
|
617 * @since 2.8.0 Added the `$profileuser` parameter. |
|
618 * @since 4.4.0 Now evaluated only in user-edit.php. |
|
619 * |
|
620 * @param bool $show Whether to show the password fields. Default true. |
|
621 * @param WP_User $profileuser User object for the current user to edit. |
|
622 */ |
|
623 $show_password_fields = apply_filters( 'show_password_fields', true, $profileuser ); |
|
624 if ( $show_password_fields ) : |
|
625 ?> |
|
626 </table> |
|
627 |
|
628 <h2><?php _e( 'Account Management' ); ?></h2> |
|
629 <table class="form-table" role="presentation"> |
|
630 <tr id="password" class="user-pass1-wrap"> |
|
631 <th><label for="pass1"><?php _e( 'New Password' ); ?></label></th> |
|
632 <td> |
|
633 <input class="hidden" value=" " /><!-- #24364 workaround --> |
|
634 <button type="button" class="button wp-generate-pw hide-if-no-js" aria-expanded="false"><?php _e( 'Set New Password' ); ?></button> |
|
635 <div class="wp-pwd hide-if-js"> |
|
636 <span class="password-input-wrapper"> |
|
637 <input type="password" name="pass1" id="pass1" class="regular-text" value="" autocomplete="off" data-pw="<?php echo esc_attr( wp_generate_password( 24 ) ); ?>" aria-describedby="pass-strength-result" /> |
|
638 </span> |
|
639 <button type="button" class="button wp-hide-pw hide-if-no-js" data-toggle="0" aria-label="<?php esc_attr_e( 'Hide password' ); ?>"> |
|
640 <span class="dashicons dashicons-hidden" aria-hidden="true"></span> |
|
641 <span class="text"><?php _e( 'Hide' ); ?></span> |
|
642 </button> |
|
643 <button type="button" class="button wp-cancel-pw hide-if-no-js" data-toggle="0" aria-label="<?php esc_attr_e( 'Cancel password change' ); ?>"> |
|
644 <span class="dashicons dashicons-no" aria-hidden="true"></span> |
|
645 <span class="text"><?php _e( 'Cancel' ); ?></span> |
|
646 </button> |
|
647 <div style="display:none" id="pass-strength-result" aria-live="polite"></div> |
|
648 </div> |
|
649 </td> |
|
650 </tr> |
|
651 <tr class="user-pass2-wrap hide-if-js"> |
|
652 <th scope="row"><label for="pass2"><?php _e( 'Repeat New Password' ); ?></label></th> |
|
653 <td> |
|
654 <input name="pass2" type="password" id="pass2" class="regular-text" value="" autocomplete="off" aria-describedby="pass2-desc" /> |
|
655 <?php if ( IS_PROFILE_PAGE ) : ?> |
|
656 <p class="description" id="pass2-desc"><?php _e( 'Type your new password again.' ); ?></p> |
|
657 <?php else : ?> |
|
658 <p class="description" id="pass2-desc"><?php _e( 'Type the new password again.' ); ?></p> |
|
659 <?php endif; ?> |
242 <?php endif; ?> |
660 </td> |
243 |
661 </tr> |
244 <hr class="wp-header-end"> |
662 <tr class="pw-weak"> |
245 |
663 <th><?php _e( 'Confirm Password' ); ?></th> |
246 <form id="your-profile" action="<?php echo esc_url( self_admin_url( IS_PROFILE_PAGE ? 'profile.php' : 'user-edit.php' ) ); ?>" method="post" novalidate="novalidate" |
664 <td> |
|
665 <label> |
|
666 <input type="checkbox" name="pw_weak" class="pw-checkbox" /> |
|
667 <span id="pw-weak-text-label"><?php _e( 'Confirm use of weak password' ); ?></span> |
|
668 </label> |
|
669 </td> |
|
670 </tr> |
|
671 <?php endif; ?> |
|
672 |
|
673 <?php |
|
674 // Allow admins to send reset password link. |
|
675 if ( ! IS_PROFILE_PAGE ) : |
|
676 ?> |
|
677 <tr class="user-generate-reset-link-wrap hide-if-no-js"> |
|
678 <th><?php _e( 'Password Reset' ); ?></th> |
|
679 <td> |
|
680 <div class="generate-reset-link"> |
|
681 <button type="button" class="button button-secondary" id="generate-reset-link"> |
|
682 <?php _e( 'Send Reset Link' ); ?> |
|
683 </button> |
|
684 </div> |
|
685 <p class="description"> |
|
686 <?php |
|
687 /* translators: %s: User's display name. */ |
|
688 printf( __( 'Send %s a link to reset their password. This will not change their password, nor will it force a change.' ), esc_html( $profileuser->display_name ) ); |
|
689 ?> |
|
690 </p> |
|
691 </td> |
|
692 </tr> |
|
693 <?php endif; ?> |
|
694 |
|
695 <?php |
|
696 if ( IS_PROFILE_PAGE && count( $sessions->get_all() ) === 1 ) : |
|
697 ?> |
|
698 <tr class="user-sessions-wrap hide-if-no-js"> |
|
699 <th><?php _e( 'Sessions' ); ?></th> |
|
700 <td aria-live="assertive"> |
|
701 <div class="destroy-sessions"><button type="button" disabled class="button"><?php _e( 'Log Out Everywhere Else' ); ?></button></div> |
|
702 <p class="description"> |
|
703 <?php _e( 'You are only logged in at this location.' ); ?> |
|
704 </p> |
|
705 </td> |
|
706 </tr> |
|
707 <?php elseif ( IS_PROFILE_PAGE && count( $sessions->get_all() ) > 1 ) : ?> |
|
708 <tr class="user-sessions-wrap hide-if-no-js"> |
|
709 <th><?php _e( 'Sessions' ); ?></th> |
|
710 <td aria-live="assertive"> |
|
711 <div class="destroy-sessions"><button type="button" class="button" id="destroy-sessions"><?php _e( 'Log Out Everywhere Else' ); ?></button></div> |
|
712 <p class="description"> |
|
713 <?php _e( 'Did you lose your phone or leave your account logged in at a public computer? You can log out everywhere else, and stay logged in here.' ); ?> |
|
714 </p> |
|
715 </td> |
|
716 </tr> |
|
717 <?php elseif ( ! IS_PROFILE_PAGE && $sessions->get_all() ) : ?> |
|
718 <tr class="user-sessions-wrap hide-if-no-js"> |
|
719 <th><?php _e( 'Sessions' ); ?></th> |
|
720 <td> |
|
721 <p><button type="button" class="button" id="destroy-sessions"><?php _e( 'Log Out Everywhere' ); ?></button></p> |
|
722 <p class="description"> |
|
723 <?php |
|
724 /* translators: %s: User's display name. */ |
|
725 printf( __( 'Log %s out of all locations.' ), $profileuser->display_name ); |
|
726 ?> |
|
727 </p> |
|
728 </td> |
|
729 </tr> |
|
730 <?php endif; ?> |
|
731 |
|
732 </table> |
|
733 |
|
734 |
|
735 <?php if ( wp_is_application_passwords_available_for_user( $user_id ) ) : ?> |
|
736 <div class="application-passwords hide-if-no-js" id="application-passwords-section"> |
|
737 <h2><?php _e( 'Application Passwords' ); ?></h2> |
|
738 <p><?php _e( 'Application passwords allow authentication via non-interactive systems, such as XML-RPC or the REST API, without providing your actual password. Application passwords can be easily revoked. They cannot be used for traditional logins to your website.' ); ?></p> |
|
739 <?php |
|
740 if ( is_multisite() ) { |
|
741 $blogs = get_blogs_of_user( $user_id, true ); |
|
742 $blogs_count = count( $blogs ); |
|
743 if ( $blogs_count > 1 ) { |
|
744 ?> |
|
745 <p> |
|
746 <?php |
|
747 printf( |
|
748 /* translators: 1: URL to my-sites.php, 2: Number of sites the user has. */ |
|
749 _n( |
|
750 'Application passwords grant access to <a href="%1$s">the %2$s site in this installation that you have permissions on</a>.', |
|
751 'Application passwords grant access to <a href="%1$s">all %2$s sites in this installation that you have permissions on</a>.', |
|
752 $blogs_count |
|
753 ), |
|
754 admin_url( 'my-sites.php' ), |
|
755 number_format_i18n( $blogs_count ) |
|
756 ); |
|
757 ?> |
|
758 </p> |
|
759 <?php |
|
760 } |
|
761 } |
|
762 |
|
763 if ( ! wp_is_site_protected_by_basic_auth( 'front' ) ) { |
|
764 ?> |
|
765 <div class="create-application-password form-wrap"> |
|
766 <div class="form-field"> |
|
767 <label for="new_application_password_name"><?php _e( 'New Application Password Name' ); ?></label> |
|
768 <input type="text" size="30" id="new_application_password_name" name="new_application_password_name" placeholder="<?php esc_attr_e( 'WordPress App on My Phone' ); ?>" class="input" aria-required="true" aria-describedby="new_application_password_name_desc" /> |
|
769 <p class="description" id="new_application_password_name_desc"><?php _e( 'Required to create an Application Password, but not to update the user.' ); ?></p> |
|
770 </div> |
|
771 |
|
772 <?php |
247 <?php |
773 /** |
248 /** |
774 * Fires in the create Application Passwords form. |
249 * Fires inside the your-profile form tag on the user editing screen. |
775 * |
250 * |
776 * @since 5.6.0 |
251 * @since 3.0.0 |
777 * |
|
778 * @param WP_User $profileuser The current WP_User object. |
|
779 */ |
252 */ |
780 do_action( 'wp_create_application_password_form', $profileuser ); |
253 do_action( 'user_edit_form_tag' ); |
781 ?> |
254 ?> |
782 |
255 > |
783 <button type="button" name="do_new_application_password" id="do_new_application_password" class="button button-secondary"><?php _e( 'Add New Application Password' ); ?></button> |
256 <?php wp_nonce_field( 'update-user_' . $user_id ); ?> |
784 </div> |
257 <?php if ( $wp_http_referer ) : ?> |
785 <?php } else { ?> |
258 <input type="hidden" name="wp_http_referer" value="<?php echo esc_url( $wp_http_referer ); ?>" /> |
786 <div class="notice notice-error inline"> |
259 <?php endif; ?> |
787 <p><?php _e( 'Your website appears to use Basic Authentication, which is not currently compatible with Application Passwords.' ); ?></p> |
260 <p> |
788 </div> |
261 <input type="hidden" name="from" value="profile" /> |
789 <?php } ?> |
262 <input type="hidden" name="checkuser_id" value="<?php echo get_current_user_id(); ?>" /> |
790 |
263 </p> |
791 <div class="application-passwords-list-table-wrapper"> |
264 |
792 <?php |
265 <h2><?php _e( 'Personal Options' ); ?></h2> |
793 $application_passwords_list_table = _get_list_table( 'WP_Application_Passwords_List_Table', array( 'screen' => 'application-passwords-user' ) ); |
266 |
794 $application_passwords_list_table->prepare_items(); |
267 <table class="form-table" role="presentation"> |
795 $application_passwords_list_table->display(); |
268 <?php if ( ! ( IS_PROFILE_PAGE && ! $user_can_edit ) ) : ?> |
796 ?> |
269 <tr class="user-rich-editing-wrap"> |
|
270 <th scope="row"><?php _e( 'Visual Editor' ); ?></th> |
|
271 <td> |
|
272 <label for="rich_editing"><input name="rich_editing" type="checkbox" id="rich_editing" value="false" <?php checked( 'false', $profile_user->rich_editing ); ?> /> |
|
273 <?php _e( 'Disable the visual editor when writing' ); ?> |
|
274 </label> |
|
275 </td> |
|
276 </tr> |
|
277 <?php endif; ?> |
|
278 |
|
279 <?php |
|
280 $show_syntax_highlighting_preference = ( |
|
281 // For Custom HTML widget and Additional CSS in Customizer. |
|
282 user_can( $profile_user, 'edit_theme_options' ) |
|
283 || |
|
284 // Edit plugins. |
|
285 user_can( $profile_user, 'edit_plugins' ) |
|
286 || |
|
287 // Edit themes. |
|
288 user_can( $profile_user, 'edit_themes' ) |
|
289 ); |
|
290 ?> |
|
291 |
|
292 <?php if ( $show_syntax_highlighting_preference ) : ?> |
|
293 <tr class="user-syntax-highlighting-wrap"> |
|
294 <th scope="row"><?php _e( 'Syntax Highlighting' ); ?></th> |
|
295 <td> |
|
296 <label for="syntax_highlighting"><input name="syntax_highlighting" type="checkbox" id="syntax_highlighting" value="false" <?php checked( 'false', $profile_user->syntax_highlighting ); ?> /> |
|
297 <?php _e( 'Disable syntax highlighting when editing code' ); ?> |
|
298 </label> |
|
299 </td> |
|
300 </tr> |
|
301 <?php endif; ?> |
|
302 |
|
303 <?php if ( count( $_wp_admin_css_colors ) > 1 && has_action( 'admin_color_scheme_picker' ) ) : ?> |
|
304 <tr class="user-admin-color-wrap"> |
|
305 <th scope="row"><?php _e( 'Admin Color Scheme' ); ?></th> |
|
306 <td> |
|
307 <?php |
|
308 /** |
|
309 * Fires in the 'Admin Color Scheme' section of the user editing screen. |
|
310 * |
|
311 * The section is only enabled if a callback is hooked to the action, |
|
312 * and if there is more than one defined color scheme for the admin. |
|
313 * |
|
314 * @since 3.0.0 |
|
315 * @since 3.8.1 Added `$user_id` parameter. |
|
316 * |
|
317 * @param int $user_id The user ID. |
|
318 */ |
|
319 do_action( 'admin_color_scheme_picker', $user_id ); |
|
320 ?> |
|
321 </td> |
|
322 </tr> |
|
323 <?php endif; // End if count ( $_wp_admin_css_colors ) > 1 ?> |
|
324 |
|
325 <?php if ( ! ( IS_PROFILE_PAGE && ! $user_can_edit ) ) : ?> |
|
326 <tr class="user-comment-shortcuts-wrap"> |
|
327 <th scope="row"><?php _e( 'Keyboard Shortcuts' ); ?></th> |
|
328 <td> |
|
329 <label for="comment_shortcuts"> |
|
330 <input type="checkbox" name="comment_shortcuts" id="comment_shortcuts" value="true" <?php checked( 'true', $profile_user->comment_shortcuts ); ?> /> |
|
331 <?php _e( 'Enable keyboard shortcuts for comment moderation.' ); ?> |
|
332 </label> |
|
333 <?php _e( '<a href="https://wordpress.org/support/article/keyboard-shortcuts/" target="_blank">More information</a>' ); ?> |
|
334 </td> |
|
335 </tr> |
|
336 <?php endif; ?> |
|
337 |
|
338 <tr class="show-admin-bar user-admin-bar-front-wrap"> |
|
339 <th scope="row"><?php _e( 'Toolbar' ); ?></th> |
|
340 <td> |
|
341 <label for="admin_bar_front"> |
|
342 <input name="admin_bar_front" type="checkbox" id="admin_bar_front" value="1"<?php checked( _get_admin_bar_pref( 'front', $profile_user->ID ) ); ?> /> |
|
343 <?php _e( 'Show Toolbar when viewing site' ); ?> |
|
344 </label><br /> |
|
345 </td> |
|
346 </tr> |
|
347 |
|
348 <?php $languages = get_available_languages(); ?> |
|
349 <?php if ( $languages ) : ?> |
|
350 <tr class="user-language-wrap"> |
|
351 <th scope="row"> |
|
352 <?php /* translators: The user language selection field label. */ ?> |
|
353 <label for="locale"><?php _e( 'Language' ); ?><span class="dashicons dashicons-translation" aria-hidden="true"></span></label> |
|
354 </th> |
|
355 <td> |
|
356 <?php |
|
357 $user_locale = $profile_user->locale; |
|
358 |
|
359 if ( 'en_US' === $user_locale ) { |
|
360 $user_locale = ''; |
|
361 } elseif ( '' === $user_locale || ! in_array( $user_locale, $languages, true ) ) { |
|
362 $user_locale = 'site-default'; |
|
363 } |
|
364 |
|
365 wp_dropdown_languages( |
|
366 array( |
|
367 'name' => 'locale', |
|
368 'id' => 'locale', |
|
369 'selected' => $user_locale, |
|
370 'languages' => $languages, |
|
371 'show_available_translations' => false, |
|
372 'show_option_site_default' => true, |
|
373 ) |
|
374 ); |
|
375 ?> |
|
376 </td> |
|
377 </tr> |
|
378 <?php endif; ?> |
|
379 |
|
380 <?php |
|
381 /** |
|
382 * Fires at the end of the 'Personal Options' settings table on the user editing screen. |
|
383 * |
|
384 * @since 2.7.0 |
|
385 * |
|
386 * @param WP_User $profile_user The current WP_User object. |
|
387 */ |
|
388 do_action( 'personal_options', $profile_user ); |
|
389 ?> |
|
390 |
|
391 </table> |
|
392 <?php |
|
393 if ( IS_PROFILE_PAGE ) { |
|
394 /** |
|
395 * Fires after the 'Personal Options' settings table on the 'Profile' editing screen. |
|
396 * |
|
397 * The action only fires if the current user is editing their own profile. |
|
398 * |
|
399 * @since 2.0.0 |
|
400 * |
|
401 * @param WP_User $profile_user The current WP_User object. |
|
402 */ |
|
403 do_action( 'profile_personal_options', $profile_user ); |
|
404 } |
|
405 ?> |
|
406 |
|
407 <h2><?php _e( 'Name' ); ?></h2> |
|
408 |
|
409 <table class="form-table" role="presentation"> |
|
410 <tr class="user-user-login-wrap"> |
|
411 <th><label for="user_login"><?php _e( 'Username' ); ?></label></th> |
|
412 <td><input type="text" name="user_login" id="user_login" value="<?php echo esc_attr( $profile_user->user_login ); ?>" disabled="disabled" class="regular-text" /> <span class="description"><?php _e( 'Usernames cannot be changed.' ); ?></span></td> |
|
413 </tr> |
|
414 |
|
415 <?php if ( ! IS_PROFILE_PAGE && ! is_network_admin() && current_user_can( 'promote_user', $profile_user->ID ) ) : ?> |
|
416 <tr class="user-role-wrap"> |
|
417 <th><label for="role"><?php _e( 'Role' ); ?></label></th> |
|
418 <td> |
|
419 <select name="role" id="role"> |
|
420 <?php |
|
421 // Compare user role against currently editable roles. |
|
422 $user_roles = array_intersect( array_values( $profile_user->roles ), array_keys( get_editable_roles() ) ); |
|
423 $user_role = reset( $user_roles ); |
|
424 |
|
425 // Print the full list of roles with the primary one selected. |
|
426 wp_dropdown_roles( $user_role ); |
|
427 |
|
428 // Print the 'no role' option. Make it selected if the user has no role yet. |
|
429 if ( $user_role ) { |
|
430 echo '<option value="">' . __( '— No role for this site —' ) . '</option>'; |
|
431 } else { |
|
432 echo '<option value="" selected="selected">' . __( '— No role for this site —' ) . '</option>'; |
|
433 } |
|
434 ?> |
|
435 </select> |
|
436 </td> |
|
437 </tr> |
|
438 <?php endif; // End if ! IS_PROFILE_PAGE. ?> |
|
439 |
|
440 <?php if ( is_multisite() && is_network_admin() && ! IS_PROFILE_PAGE && current_user_can( 'manage_network_options' ) && ! isset( $super_admins ) ) : ?> |
|
441 <tr class="user-super-admin-wrap"> |
|
442 <th><?php _e( 'Super Admin' ); ?></th> |
|
443 <td> |
|
444 <?php if ( 0 !== strcasecmp( $profile_user->user_email, get_site_option( 'admin_email' ) ) || ! is_super_admin( $profile_user->ID ) ) : ?> |
|
445 <p><label><input type="checkbox" id="super_admin" name="super_admin"<?php checked( is_super_admin( $profile_user->ID ) ); ?> /> <?php _e( 'Grant this user super admin privileges for the Network.' ); ?></label></p> |
|
446 <?php else : ?> |
|
447 <p><?php _e( 'Super admin privileges cannot be removed because this user has the network admin email.' ); ?></p> |
|
448 <?php endif; ?> |
|
449 </td> |
|
450 </tr> |
|
451 <?php endif; ?> |
|
452 |
|
453 <tr class="user-first-name-wrap"> |
|
454 <th><label for="first_name"><?php _e( 'First Name' ); ?></label></th> |
|
455 <td><input type="text" name="first_name" id="first_name" value="<?php echo esc_attr( $profile_user->first_name ); ?>" class="regular-text" /></td> |
|
456 </tr> |
|
457 |
|
458 <tr class="user-last-name-wrap"> |
|
459 <th><label for="last_name"><?php _e( 'Last Name' ); ?></label></th> |
|
460 <td><input type="text" name="last_name" id="last_name" value="<?php echo esc_attr( $profile_user->last_name ); ?>" class="regular-text" /></td> |
|
461 </tr> |
|
462 |
|
463 <tr class="user-nickname-wrap"> |
|
464 <th><label for="nickname"><?php _e( 'Nickname' ); ?> <span class="description"><?php _e( '(required)' ); ?></span></label></th> |
|
465 <td><input type="text" name="nickname" id="nickname" value="<?php echo esc_attr( $profile_user->nickname ); ?>" class="regular-text" /></td> |
|
466 </tr> |
|
467 |
|
468 <tr class="user-display-name-wrap"> |
|
469 <th> |
|
470 <label for="display_name"><?php _e( 'Display name publicly as' ); ?></label> |
|
471 </th> |
|
472 <td> |
|
473 <select name="display_name" id="display_name"> |
|
474 <?php |
|
475 $public_display = array(); |
|
476 $public_display['display_nickname'] = $profile_user->nickname; |
|
477 $public_display['display_username'] = $profile_user->user_login; |
|
478 |
|
479 if ( ! empty( $profile_user->first_name ) ) { |
|
480 $public_display['display_firstname'] = $profile_user->first_name; |
|
481 } |
|
482 |
|
483 if ( ! empty( $profile_user->last_name ) ) { |
|
484 $public_display['display_lastname'] = $profile_user->last_name; |
|
485 } |
|
486 |
|
487 if ( ! empty( $profile_user->first_name ) && ! empty( $profile_user->last_name ) ) { |
|
488 $public_display['display_firstlast'] = $profile_user->first_name . ' ' . $profile_user->last_name; |
|
489 $public_display['display_lastfirst'] = $profile_user->last_name . ' ' . $profile_user->first_name; |
|
490 } |
|
491 |
|
492 if ( ! in_array( $profile_user->display_name, $public_display, true ) ) { // Only add this if it isn't duplicated elsewhere. |
|
493 $public_display = array( 'display_displayname' => $profile_user->display_name ) + $public_display; |
|
494 } |
|
495 |
|
496 $public_display = array_map( 'trim', $public_display ); |
|
497 $public_display = array_unique( $public_display ); |
|
498 |
|
499 ?> |
|
500 <?php foreach ( $public_display as $id => $item ) : ?> |
|
501 <option <?php selected( $profile_user->display_name, $item ); ?>><?php echo $item; ?></option> |
|
502 <?php endforeach; ?> |
|
503 </select> |
|
504 </td> |
|
505 </tr> |
|
506 </table> |
|
507 |
|
508 <h2><?php _e( 'Contact Info' ); ?></h2> |
|
509 |
|
510 <table class="form-table" role="presentation"> |
|
511 <tr class="user-email-wrap"> |
|
512 <th><label for="email"><?php _e( 'Email' ); ?> <span class="description"><?php _e( '(required)' ); ?></span></label></th> |
|
513 <td> |
|
514 <input type="email" name="email" id="email" aria-describedby="email-description" value="<?php echo esc_attr( $profile_user->user_email ); ?>" class="regular-text ltr" /> |
|
515 <?php if ( $profile_user->ID === $current_user->ID ) : ?> |
|
516 <p class="description" id="email-description"> |
|
517 <?php _e( 'If you change this, an email will be sent at your new address to confirm it. <strong>The new address will not become active until confirmed.</strong>' ); ?> |
|
518 </p> |
|
519 <?php endif; ?> |
|
520 |
|
521 <?php $new_email = get_user_meta( $current_user->ID, '_new_email', true ); ?> |
|
522 <?php if ( $new_email && $new_email['newemail'] !== $current_user->user_email && $profile_user->ID === $current_user->ID ) : ?> |
|
523 <div class="updated inline"> |
|
524 <p> |
|
525 <?php |
|
526 printf( |
|
527 /* translators: %s: New email. */ |
|
528 __( 'There is a pending change of your email to %s.' ), |
|
529 '<code>' . esc_html( $new_email['newemail'] ) . '</code>' |
|
530 ); |
|
531 printf( |
|
532 ' <a href="%1$s">%2$s</a>', |
|
533 esc_url( wp_nonce_url( self_admin_url( 'profile.php?dismiss=' . $current_user->ID . '_new_email' ), 'dismiss-' . $current_user->ID . '_new_email' ) ), |
|
534 __( 'Cancel' ) |
|
535 ); |
|
536 ?> |
|
537 </p> |
|
538 </div> |
|
539 <?php endif; ?> |
|
540 </td> |
|
541 </tr> |
|
542 |
|
543 <tr class="user-url-wrap"> |
|
544 <th><label for="url"><?php _e( 'Website' ); ?></label></th> |
|
545 <td><input type="url" name="url" id="url" value="<?php echo esc_attr( $profile_user->user_url ); ?>" class="regular-text code" /></td> |
|
546 </tr> |
|
547 |
|
548 <?php foreach ( wp_get_user_contact_methods( $profile_user ) as $name => $desc ) : ?> |
|
549 <tr class="user-<?php echo $name; ?>-wrap"> |
|
550 <th> |
|
551 <label for="<?php echo $name; ?>"> |
|
552 <?php |
|
553 /** |
|
554 * Filters a user contactmethod label. |
|
555 * |
|
556 * The dynamic portion of the hook name, `$name`, refers to |
|
557 * each of the keys in the contact methods array. |
|
558 * |
|
559 * @since 2.9.0 |
|
560 * |
|
561 * @param string $desc The translatable label for the contact method. |
|
562 */ |
|
563 echo apply_filters( "user_{$name}_label", $desc ); |
|
564 ?> |
|
565 </label> |
|
566 </th> |
|
567 <td> |
|
568 <input type="text" name="<?php echo $name; ?>" id="<?php echo $name; ?>" value="<?php echo esc_attr( $profile_user->$name ); ?>" class="regular-text" /> |
|
569 </td> |
|
570 </tr> |
|
571 <?php endforeach; ?> |
|
572 </table> |
|
573 |
|
574 <h2><?php IS_PROFILE_PAGE ? _e( 'About Yourself' ) : _e( 'About the user' ); ?></h2> |
|
575 |
|
576 <table class="form-table" role="presentation"> |
|
577 <tr class="user-description-wrap"> |
|
578 <th><label for="description"><?php _e( 'Biographical Info' ); ?></label></th> |
|
579 <td><textarea name="description" id="description" rows="5" cols="30"><?php echo $profile_user->description; // textarea_escaped ?></textarea> |
|
580 <p class="description"><?php _e( 'Share a little biographical information to fill out your profile. This may be shown publicly.' ); ?></p></td> |
|
581 </tr> |
|
582 |
|
583 <?php if ( get_option( 'show_avatars' ) ) : ?> |
|
584 <tr class="user-profile-picture"> |
|
585 <th><?php _e( 'Profile Picture' ); ?></th> |
|
586 <td> |
|
587 <?php echo get_avatar( $user_id ); ?> |
|
588 <p class="description"> |
|
589 <?php |
|
590 if ( IS_PROFILE_PAGE ) { |
|
591 $description = sprintf( |
|
592 /* translators: %s: Gravatar URL. */ |
|
593 __( '<a href="%s">You can change your profile picture on Gravatar</a>.' ), |
|
594 __( 'https://en.gravatar.com/' ) |
|
595 ); |
|
596 } else { |
|
597 $description = ''; |
|
598 } |
|
599 |
|
600 /** |
|
601 * Filters the user profile picture description displayed under the Gravatar. |
|
602 * |
|
603 * @since 4.4.0 |
|
604 * @since 4.7.0 Added the `$profile_user` parameter. |
|
605 * |
|
606 * @param string $description The description that will be printed. |
|
607 * @param WP_User $profile_user The current WP_User object. |
|
608 */ |
|
609 echo apply_filters( 'user_profile_picture_description', $description, $profile_user ); |
|
610 ?> |
|
611 </p> |
|
612 </td> |
|
613 </tr> |
|
614 <?php endif; ?> |
|
615 <?php |
|
616 /** |
|
617 * Filters the display of the password fields. |
|
618 * |
|
619 * @since 1.5.1 |
|
620 * @since 2.8.0 Added the `$profile_user` parameter. |
|
621 * @since 4.4.0 Now evaluated only in user-edit.php. |
|
622 * |
|
623 * @param bool $show Whether to show the password fields. Default true. |
|
624 * @param WP_User $profile_user User object for the current user to edit. |
|
625 */ |
|
626 $show_password_fields = apply_filters( 'show_password_fields', true, $profile_user ); |
|
627 ?> |
|
628 <?php if ( $show_password_fields ) : ?> |
|
629 </table> |
|
630 |
|
631 <h2><?php _e( 'Account Management' ); ?></h2> |
|
632 |
|
633 <table class="form-table" role="presentation"> |
|
634 <tr id="password" class="user-pass1-wrap"> |
|
635 <th><label for="pass1"><?php _e( 'New Password' ); ?></label></th> |
|
636 <td> |
|
637 <input class="hidden" value=" " /><!-- #24364 workaround --> |
|
638 <button type="button" class="button wp-generate-pw hide-if-no-js" aria-expanded="false"><?php _e( 'Set New Password' ); ?></button> |
|
639 <div class="wp-pwd hide-if-js"> |
|
640 <span class="password-input-wrapper"> |
|
641 <input type="password" name="pass1" id="pass1" class="regular-text" value="" autocomplete="new-password" data-pw="<?php echo esc_attr( wp_generate_password( 24 ) ); ?>" aria-describedby="pass-strength-result" /> |
|
642 </span> |
|
643 <button type="button" class="button wp-hide-pw hide-if-no-js" data-toggle="0" aria-label="<?php esc_attr_e( 'Hide password' ); ?>"> |
|
644 <span class="dashicons dashicons-hidden" aria-hidden="true"></span> |
|
645 <span class="text"><?php _e( 'Hide' ); ?></span> |
|
646 </button> |
|
647 <button type="button" class="button wp-cancel-pw hide-if-no-js" data-toggle="0" aria-label="<?php esc_attr_e( 'Cancel password change' ); ?>"> |
|
648 <span class="dashicons dashicons-no" aria-hidden="true"></span> |
|
649 <span class="text"><?php _e( 'Cancel' ); ?></span> |
|
650 </button> |
|
651 <div style="display:none" id="pass-strength-result" aria-live="polite"></div> |
|
652 </div> |
|
653 </td> |
|
654 </tr> |
|
655 <tr class="user-pass2-wrap hide-if-js"> |
|
656 <th scope="row"><label for="pass2"><?php _e( 'Repeat New Password' ); ?></label></th> |
|
657 <td> |
|
658 <input name="pass2" type="password" id="pass2" class="regular-text" value="" autocomplete="new-password" aria-describedby="pass2-desc" /> |
|
659 <?php if ( IS_PROFILE_PAGE ) : ?> |
|
660 <p class="description" id="pass2-desc"><?php _e( 'Type your new password again.' ); ?></p> |
|
661 <?php else : ?> |
|
662 <p class="description" id="pass2-desc"><?php _e( 'Type the new password again.' ); ?></p> |
|
663 <?php endif; ?> |
|
664 </td> |
|
665 </tr> |
|
666 <tr class="pw-weak"> |
|
667 <th><?php _e( 'Confirm Password' ); ?></th> |
|
668 <td> |
|
669 <label> |
|
670 <input type="checkbox" name="pw_weak" class="pw-checkbox" /> |
|
671 <span id="pw-weak-text-label"><?php _e( 'Confirm use of weak password' ); ?></span> |
|
672 </label> |
|
673 </td> |
|
674 </tr> |
|
675 <?php endif; // End Show Password Fields. ?> |
|
676 |
|
677 <?php // Allow admins to send reset password link. ?> |
|
678 <?php if ( ! IS_PROFILE_PAGE ) : ?> |
|
679 <tr class="user-generate-reset-link-wrap hide-if-no-js"> |
|
680 <th><?php _e( 'Password Reset' ); ?></th> |
|
681 <td> |
|
682 <div class="generate-reset-link"> |
|
683 <button type="button" class="button button-secondary" id="generate-reset-link"> |
|
684 <?php _e( 'Send Reset Link' ); ?> |
|
685 </button> |
|
686 </div> |
|
687 <p class="description"> |
|
688 <?php |
|
689 printf( |
|
690 /* translators: %s: User's display name. */ |
|
691 __( 'Send %s a link to reset their password. This will not change their password, nor will it force a change.' ), |
|
692 esc_html( $profile_user->display_name ) |
|
693 ); |
|
694 ?> |
|
695 </p> |
|
696 </td> |
|
697 </tr> |
|
698 <?php endif; ?> |
|
699 |
|
700 <?php if ( IS_PROFILE_PAGE && count( $sessions->get_all() ) === 1 ) : ?> |
|
701 <tr class="user-sessions-wrap hide-if-no-js"> |
|
702 <th><?php _e( 'Sessions' ); ?></th> |
|
703 <td aria-live="assertive"> |
|
704 <div class="destroy-sessions"><button type="button" disabled class="button"><?php _e( 'Log Out Everywhere Else' ); ?></button></div> |
|
705 <p class="description"> |
|
706 <?php _e( 'You are only logged in at this location.' ); ?> |
|
707 </p> |
|
708 </td> |
|
709 </tr> |
|
710 <?php elseif ( IS_PROFILE_PAGE && count( $sessions->get_all() ) > 1 ) : ?> |
|
711 <tr class="user-sessions-wrap hide-if-no-js"> |
|
712 <th><?php _e( 'Sessions' ); ?></th> |
|
713 <td aria-live="assertive"> |
|
714 <div class="destroy-sessions"><button type="button" class="button" id="destroy-sessions"><?php _e( 'Log Out Everywhere Else' ); ?></button></div> |
|
715 <p class="description"> |
|
716 <?php _e( 'Did you lose your phone or leave your account logged in at a public computer? You can log out everywhere else, and stay logged in here.' ); ?> |
|
717 </p> |
|
718 </td> |
|
719 </tr> |
|
720 <?php elseif ( ! IS_PROFILE_PAGE && $sessions->get_all() ) : ?> |
|
721 <tr class="user-sessions-wrap hide-if-no-js"> |
|
722 <th><?php _e( 'Sessions' ); ?></th> |
|
723 <td> |
|
724 <p><button type="button" class="button" id="destroy-sessions"><?php _e( 'Log Out Everywhere' ); ?></button></p> |
|
725 <p class="description"> |
|
726 <?php |
|
727 /* translators: %s: User's display name. */ |
|
728 printf( __( 'Log %s out of all locations.' ), $profile_user->display_name ); |
|
729 ?> |
|
730 </p> |
|
731 </td> |
|
732 </tr> |
|
733 <?php endif; ?> |
|
734 </table> |
|
735 |
|
736 <?php if ( wp_is_application_passwords_available_for_user( $user_id ) || ! wp_is_application_passwords_supported() ) : ?> |
|
737 <div class="application-passwords hide-if-no-js" id="application-passwords-section"> |
|
738 <h2><?php _e( 'Application Passwords' ); ?></h2> |
|
739 <p><?php _e( 'Application passwords allow authentication via non-interactive systems, such as XML-RPC or the REST API, without providing your actual password. Application passwords can be easily revoked. They cannot be used for traditional logins to your website.' ); ?></p> |
|
740 <?php if ( wp_is_application_passwords_available_for_user( $user_id ) ) : ?> |
|
741 <?php |
|
742 if ( is_multisite() ) : |
|
743 $blogs = get_blogs_of_user( $user_id, true ); |
|
744 $blogs_count = count( $blogs ); |
|
745 |
|
746 if ( $blogs_count > 1 ) : |
|
747 ?> |
|
748 <p> |
|
749 <?php |
|
750 /* translators: 1: URL to my-sites.php, 2: Number of sites the user has. */ |
|
751 $message = _n( |
|
752 'Application passwords grant access to <a href="%1$s">the %2$s site in this installation that you have permissions on</a>.', |
|
753 'Application passwords grant access to <a href="%1$s">all %2$s sites in this installation that you have permissions on</a>.', |
|
754 $blogs_count |
|
755 ); |
|
756 |
|
757 if ( is_super_admin( $user_id ) ) { |
|
758 /* translators: 1: URL to my-sites.php, 2: Number of sites the user has. */ |
|
759 $message = _n( |
|
760 'Application passwords grant access to <a href="%1$s">the %2$s site on the network as you have Super Admin rights</a>.', |
|
761 'Application passwords grant access to <a href="%1$s">all %2$s sites on the network as you have Super Admin rights</a>.', |
|
762 $blogs_count |
|
763 ); |
|
764 } |
|
765 |
|
766 printf( |
|
767 $message, |
|
768 admin_url( 'my-sites.php' ), |
|
769 number_format_i18n( $blogs_count ) |
|
770 ); |
|
771 ?> |
|
772 </p> |
|
773 <?php |
|
774 endif; |
|
775 endif; |
|
776 ?> |
|
777 |
|
778 <?php if ( ! wp_is_site_protected_by_basic_auth( 'front' ) ) : ?> |
|
779 <div class="create-application-password form-wrap"> |
|
780 <div class="form-field"> |
|
781 <label for="new_application_password_name"><?php _e( 'New Application Password Name' ); ?></label> |
|
782 <input type="text" size="30" id="new_application_password_name" name="new_application_password_name" class="input" aria-required="true" aria-describedby="new_application_password_name_desc" /> |
|
783 <p class="description" id="new_application_password_name_desc"><?php _e( 'Required to create an Application Password, but not to update the user.' ); ?></p> |
|
784 </div> |
|
785 |
|
786 <?php |
|
787 /** |
|
788 * Fires in the create Application Passwords form. |
|
789 * |
|
790 * @since 5.6.0 |
|
791 * |
|
792 * @param WP_User $profile_user The current WP_User object. |
|
793 */ |
|
794 do_action( 'wp_create_application_password_form', $profile_user ); |
|
795 ?> |
|
796 |
|
797 <button type="button" name="do_new_application_password" id="do_new_application_password" class="button button-secondary"><?php _e( 'Add New Application Password' ); ?></button> |
|
798 </div> |
|
799 <?php else : ?> |
|
800 <div class="notice notice-error inline"> |
|
801 <p><?php _e( 'Your website appears to use Basic Authentication, which is not currently compatible with Application Passwords.' ); ?></p> |
|
802 </div> |
|
803 <?php endif; ?> |
|
804 |
|
805 <div class="application-passwords-list-table-wrapper"> |
|
806 <?php |
|
807 $application_passwords_list_table = _get_list_table( 'WP_Application_Passwords_List_Table', array( 'screen' => 'application-passwords-user' ) ); |
|
808 $application_passwords_list_table->prepare_items(); |
|
809 $application_passwords_list_table->display(); |
|
810 ?> |
|
811 </div> |
|
812 <?php elseif ( ! wp_is_application_passwords_supported() ) : ?> |
|
813 <p><?php _e( 'The application password feature requires HTTPS, which is not enabled on this site.' ); ?></p> |
|
814 <p> |
|
815 <?php |
|
816 printf( |
|
817 /* translators: %s: Documentation URL. */ |
|
818 __( 'If this is a development website you can <a href="%s" target="_blank">set the environment type accordingly</a> to enable application passwords.' ), |
|
819 __( 'https://wordpress.org/support/article/editing-wp-config-php/#wp_environment_type' ) |
|
820 ); |
|
821 ?> |
|
822 </p> |
|
823 <?php endif; ?> |
|
824 </div> |
|
825 <?php endif; // End Application Passwords. ?> |
|
826 |
|
827 <?php |
|
828 if ( IS_PROFILE_PAGE ) { |
|
829 /** |
|
830 * Fires after the 'About Yourself' settings table on the 'Profile' editing screen. |
|
831 * |
|
832 * The action only fires if the current user is editing their own profile. |
|
833 * |
|
834 * @since 2.0.0 |
|
835 * |
|
836 * @param WP_User $profile_user The current WP_User object. |
|
837 */ |
|
838 do_action( 'show_user_profile', $profile_user ); |
|
839 } else { |
|
840 /** |
|
841 * Fires after the 'About the User' settings table on the 'Edit User' screen. |
|
842 * |
|
843 * @since 2.0.0 |
|
844 * |
|
845 * @param WP_User $profile_user The current WP_User object. |
|
846 */ |
|
847 do_action( 'edit_user_profile', $profile_user ); |
|
848 } |
|
849 ?> |
|
850 |
|
851 <?php |
|
852 /** |
|
853 * Filters whether to display additional capabilities for the user. |
|
854 * |
|
855 * The 'Additional Capabilities' section will only be enabled if |
|
856 * the number of the user's capabilities exceeds their number of |
|
857 * roles. |
|
858 * |
|
859 * @since 2.8.0 |
|
860 * |
|
861 * @param bool $enable Whether to display the capabilities. Default true. |
|
862 * @param WP_User $profile_user The current WP_User object. |
|
863 */ |
|
864 $display_additional_caps = apply_filters( 'additional_capabilities_display', true, $profile_user ); |
|
865 ?> |
|
866 |
|
867 <?php if ( count( $profile_user->caps ) > count( $profile_user->roles ) && ( true === $display_additional_caps ) ) : ?> |
|
868 <h2><?php _e( 'Additional Capabilities' ); ?></h2> |
|
869 |
|
870 <table class="form-table" role="presentation"> |
|
871 <tr class="user-capabilities-wrap"> |
|
872 <th scope="row"><?php _e( 'Capabilities' ); ?></th> |
|
873 <td> |
|
874 <?php |
|
875 $output = ''; |
|
876 foreach ( $profile_user->caps as $cap => $value ) { |
|
877 if ( ! $wp_roles->is_role( $cap ) ) { |
|
878 if ( '' !== $output ) { |
|
879 $output .= ', '; |
|
880 } |
|
881 |
|
882 if ( $value ) { |
|
883 $output .= $cap; |
|
884 } else { |
|
885 /* translators: %s: Capability name. */ |
|
886 $output .= sprintf( __( 'Denied: %s' ), $cap ); |
|
887 } |
|
888 } |
|
889 } |
|
890 echo $output; |
|
891 ?> |
|
892 </td> |
|
893 </tr> |
|
894 </table> |
|
895 <?php endif; // End Display Additional Capabilities. ?> |
|
896 |
|
897 <input type="hidden" name="action" value="update" /> |
|
898 <input type="hidden" name="user_id" id="user_id" value="<?php echo esc_attr( $user_id ); ?>" /> |
|
899 |
|
900 <?php submit_button( IS_PROFILE_PAGE ? __( 'Update Profile' ) : __( 'Update User' ) ); ?> |
|
901 |
|
902 </form> |
797 </div> |
903 </div> |
798 </div> |
|
799 <?php endif; ?> |
|
800 |
|
801 <?php |
|
802 if ( IS_PROFILE_PAGE ) { |
|
803 /** |
|
804 * Fires after the 'About Yourself' settings table on the 'Profile' editing screen. |
|
805 * |
|
806 * The action only fires if the current user is editing their own profile. |
|
807 * |
|
808 * @since 2.0.0 |
|
809 * |
|
810 * @param WP_User $profileuser The current WP_User object. |
|
811 */ |
|
812 do_action( 'show_user_profile', $profileuser ); |
|
813 } else { |
|
814 /** |
|
815 * Fires after the 'About the User' settings table on the 'Edit User' screen. |
|
816 * |
|
817 * @since 2.0.0 |
|
818 * |
|
819 * @param WP_User $profileuser The current WP_User object. |
|
820 */ |
|
821 do_action( 'edit_user_profile', $profileuser ); |
|
822 } |
|
823 ?> |
|
824 |
|
825 <?php |
|
826 /** |
|
827 * Filters whether to display additional capabilities for the user. |
|
828 * |
|
829 * The 'Additional Capabilities' section will only be enabled if |
|
830 * the number of the user's capabilities exceeds their number of |
|
831 * roles. |
|
832 * |
|
833 * @since 2.8.0 |
|
834 * |
|
835 * @param bool $enable Whether to display the capabilities. Default true. |
|
836 * @param WP_User $profileuser The current WP_User object. |
|
837 */ |
|
838 if ( count( $profileuser->caps ) > count( $profileuser->roles ) |
|
839 && apply_filters( 'additional_capabilities_display', true, $profileuser ) |
|
840 ) : |
|
841 ?> |
|
842 <h2><?php _e( 'Additional Capabilities' ); ?></h2> |
|
843 <table class="form-table" role="presentation"> |
|
844 <tr class="user-capabilities-wrap"> |
|
845 <th scope="row"><?php _e( 'Capabilities' ); ?></th> |
|
846 <td> |
|
847 <?php |
|
848 $output = ''; |
|
849 foreach ( $profileuser->caps as $cap => $value ) { |
|
850 if ( ! $wp_roles->is_role( $cap ) ) { |
|
851 if ( '' != $output ) { |
|
852 $output .= ', '; |
|
853 } |
|
854 |
|
855 if ( $value ) { |
|
856 $output .= $cap; |
|
857 } else { |
|
858 /* translators: %s: Capability name. */ |
|
859 $output .= sprintf( __( 'Denied: %s' ), $cap ); |
|
860 } |
|
861 } |
|
862 } |
|
863 echo $output; |
|
864 ?> |
|
865 </td> |
|
866 </tr> |
|
867 </table> |
|
868 <?php endif; ?> |
|
869 |
|
870 <input type="hidden" name="action" value="update" /> |
|
871 <input type="hidden" name="user_id" id="user_id" value="<?php echo esc_attr( $user_id ); ?>" /> |
|
872 |
|
873 <?php submit_button( IS_PROFILE_PAGE ? __( 'Update Profile' ) : __( 'Update User' ) ); ?> |
|
874 |
|
875 </form> |
|
876 </div> |
|
877 <?php |
904 <?php |
878 break; |
905 break; |
879 } |
906 } |
880 ?> |
907 ?> |
881 <script type="text/javascript"> |
908 <script type="text/javascript"> |