390 lines
		
	
	
		
			7.9 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			390 lines
		
	
	
		
			7.9 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
| <?php
 | |
| 
 | |
| if ( ! defined( 'ABSPATH' ) ) {
 | |
| 	exit; // Exit if accessed directly
 | |
| }
 | |
| 
 | |
| if ( ! class_exists( 'ACF_Form_User' ) ) :
 | |
| 
 | |
| 	class ACF_Form_User {
 | |
| 
 | |
| 		/** @var string The current view (new, edit, register) */
 | |
| 		var $view = '';
 | |
| 
 | |
| 
 | |
| 		/*
 | |
| 		*  __construct
 | |
| 		*
 | |
| 		*  This function will setup the class functionality
 | |
| 		*
 | |
| 		*  @type    function
 | |
| 		*  @date    5/03/2014
 | |
| 		*  @since   5.0.0
 | |
| 		*
 | |
| 		*  @param   n/a
 | |
| 		*  @return  n/a
 | |
| 		*/
 | |
| 
 | |
| 		function __construct() {
 | |
| 
 | |
| 			// enqueue
 | |
| 			add_action( 'admin_enqueue_scripts', array( $this, 'admin_enqueue_scripts' ) );
 | |
| 			add_action( 'login_form_register', array( $this, 'login_form_register' ) );
 | |
| 
 | |
| 			// render
 | |
| 			add_action( 'show_user_profile', array( $this, 'render_edit' ) );
 | |
| 			add_action( 'edit_user_profile', array( $this, 'render_edit' ) );
 | |
| 			add_action( 'user_new_form', array( $this, 'render_new' ) );
 | |
| 			add_action( 'register_form', array( $this, 'render_register' ) );
 | |
| 
 | |
| 			// save
 | |
| 			add_action( 'user_register', array( $this, 'save_user' ) );
 | |
| 			add_action( 'profile_update', array( $this, 'save_user' ) );
 | |
| 
 | |
| 			// Perform validation before new user is registered.
 | |
| 			add_filter( 'registration_errors', array( $this, 'filter_registration_errors' ), 10, 3 );
 | |
| 		}
 | |
| 
 | |
| 
 | |
| 		/**
 | |
| 		 *  admin_enqueue_scripts
 | |
| 		 *
 | |
| 		 *  Checks current screen and enqueues scripts
 | |
| 		 *
 | |
| 		 *  @date    17/4/18
 | |
| 		 *  @since   5.6.9
 | |
| 		 *
 | |
| 		 *  @param   void
 | |
| 		 *  @return  void
 | |
| 		 */
 | |
| 
 | |
| 		function admin_enqueue_scripts() {
 | |
| 
 | |
| 			// bail early if not valid screen
 | |
| 			if ( ! acf_is_screen( array( 'profile', 'user', 'user-edit', 'profile-network', 'user-network', 'user-edit-network' ) ) ) {
 | |
| 				return;
 | |
| 			}
 | |
| 
 | |
| 			// enqueue
 | |
| 			acf_enqueue_scripts();
 | |
| 		}
 | |
| 
 | |
| 
 | |
| 		/**
 | |
| 		 *  login_form_register
 | |
| 		 *
 | |
| 		 *  Customizes and enqueues scripts
 | |
| 		 *
 | |
| 		 *  @date    17/4/18
 | |
| 		 *  @since   5.6.9
 | |
| 		 *
 | |
| 		 *  @param   void
 | |
| 		 *  @return  void
 | |
| 		 */
 | |
| 
 | |
| 		function login_form_register() {
 | |
| 
 | |
| 			// customize action prefix so that "admin_head" = "login_head"
 | |
| 			acf_enqueue_scripts(
 | |
| 				array(
 | |
| 					'context' => 'login',
 | |
| 				)
 | |
| 			);
 | |
| 		}
 | |
| 
 | |
| 
 | |
| 		/*
 | |
| 		*  register_user
 | |
| 		*
 | |
| 		*  Called during the user register form
 | |
| 		*
 | |
| 		*  @type    function
 | |
| 		*  @date    8/10/13
 | |
| 		*  @since   5.0.0
 | |
| 		*
 | |
| 		*  @param   void
 | |
| 		*  @return  void
 | |
| 		*/
 | |
| 
 | |
| 		function render_register() {
 | |
| 
 | |
| 			// render
 | |
| 			$this->render(
 | |
| 				array(
 | |
| 					'user_id' => 0,
 | |
| 					'view'    => 'register',
 | |
| 					'el'      => 'div',
 | |
| 				)
 | |
| 			);
 | |
| 		}
 | |
| 
 | |
| 
 | |
| 		/*
 | |
| 		*  render_edit
 | |
| 		*
 | |
| 		*  Called during the user edit form
 | |
| 		*
 | |
| 		*  @type    function
 | |
| 		*  @date    8/10/13
 | |
| 		*  @since   5.0.0
 | |
| 		*
 | |
| 		*  @param   void
 | |
| 		*  @return  void
 | |
| 		*/
 | |
| 
 | |
| 		function render_edit( $user ) {
 | |
| 
 | |
| 			// add compatibility with front-end user profile edit forms such as bbPress
 | |
| 			if ( ! is_admin() ) {
 | |
| 				acf_enqueue_scripts();
 | |
| 			}
 | |
| 
 | |
| 			// render
 | |
| 			$this->render(
 | |
| 				array(
 | |
| 					'user_id' => $user->ID,
 | |
| 					'view'    => 'edit',
 | |
| 					'el'      => 'tr',
 | |
| 				)
 | |
| 			);
 | |
| 		}
 | |
| 
 | |
| 
 | |
| 		/*
 | |
| 		*  user_new_form
 | |
| 		*
 | |
| 		*  description
 | |
| 		*
 | |
| 		*  @type    function
 | |
| 		*  @date    8/10/13
 | |
| 		*  @since   5.0.0
 | |
| 		*
 | |
| 		*  @param   $post_id (int)
 | |
| 		*  @return  $post_id (int)
 | |
| 		*/
 | |
| 
 | |
| 		function render_new() {
 | |
| 
 | |
| 			// Multisite uses a different 'user-new.php' form. Don't render fields here
 | |
| 			if ( is_multisite() ) {
 | |
| 				return;
 | |
| 			}
 | |
| 
 | |
| 			// render
 | |
| 			$this->render(
 | |
| 				array(
 | |
| 					'user_id' => 0,
 | |
| 					'view'    => 'add',
 | |
| 					'el'      => 'tr',
 | |
| 				)
 | |
| 			);
 | |
| 		}
 | |
| 
 | |
| 
 | |
| 		/*
 | |
| 		*  render
 | |
| 		*
 | |
| 		*  This function will render ACF fields for a given $post_id parameter
 | |
| 		*
 | |
| 		*  @type    function
 | |
| 		*  @date    7/10/13
 | |
| 		*  @since   5.0.0
 | |
| 		*
 | |
| 		*  @param   $user_id (int) this can be set to 0 for a new user
 | |
| 		*  @param   $user_form (string) used for location rule matching. edit | add | register
 | |
| 		*  @param   $el (string)
 | |
| 		*  @return  n/a
 | |
| 		*/
 | |
| 
 | |
| 		function render( $args = array() ) {
 | |
| 
 | |
| 			// Allow $_POST data to persist across form submission attempts.
 | |
| 			if ( isset( $_POST['acf'] ) ) { // phpcs:ignore WordPress.Security.NonceVerification.Missing
 | |
| 				add_filter( 'acf/pre_load_value', array( $this, 'filter_pre_load_value' ), 10, 3 );
 | |
| 			}
 | |
| 
 | |
| 			// defaults
 | |
| 			$args = wp_parse_args(
 | |
| 				$args,
 | |
| 				array(
 | |
| 					'user_id' => 0,
 | |
| 					'view'    => 'edit',
 | |
| 					'el'      => 'tr',
 | |
| 				)
 | |
| 			);
 | |
| 
 | |
| 			// vars
 | |
| 			$post_id = 'user_' . $args['user_id'];
 | |
| 
 | |
| 			// get field groups
 | |
| 			$field_groups = acf_get_field_groups(
 | |
| 				array(
 | |
| 					'user_id'   => $args['user_id'] ? $args['user_id'] : 'new',
 | |
| 					'user_form' => $args['view'],
 | |
| 				)
 | |
| 			);
 | |
| 
 | |
| 			// bail early if no field groups
 | |
| 			if ( empty( $field_groups ) ) {
 | |
| 				return;
 | |
| 			}
 | |
| 
 | |
| 			// form data
 | |
| 			acf_form_data(
 | |
| 				array(
 | |
| 					'screen'     => 'user',
 | |
| 					'post_id'    => $post_id,
 | |
| 					'validation' => ( $args['view'] == 'register' ) ? 0 : 1,
 | |
| 				)
 | |
| 			);
 | |
| 
 | |
| 			// elements
 | |
| 			$before = '<table class="form-table"><tbody>';
 | |
| 			$after  = '</tbody></table>';
 | |
| 
 | |
| 			if ( $args['el'] == 'div' ) {
 | |
| 				$before = '<div class="acf-user-' . $args['view'] . '-fields acf-fields -clear">';
 | |
| 				$after  = '</div>';
 | |
| 			}
 | |
| 
 | |
| 			// loop
 | |
| 			foreach ( $field_groups as $field_group ) {
 | |
| 
 | |
| 				// vars
 | |
| 				$fields = acf_get_fields( $field_group );
 | |
| 
 | |
| 				// title
 | |
| 				if ( $field_group['style'] === 'default' ) {
 | |
| 					echo '<h2>' . $field_group['title'] . '</h2>';
 | |
| 				}
 | |
| 
 | |
| 				// render
 | |
| 				echo $before;
 | |
| 				acf_render_fields( $fields, $post_id, $args['el'], $field_group['instruction_placement'] );
 | |
| 				echo $after;
 | |
| 			}
 | |
| 
 | |
| 			// actions
 | |
| 			add_action( 'acf/input/admin_footer', array( $this, 'admin_footer' ), 10, 1 );
 | |
| 		}
 | |
| 
 | |
| 
 | |
| 		/*
 | |
| 		*  admin_footer
 | |
| 		*
 | |
| 		*  description
 | |
| 		*
 | |
| 		*  @type    function
 | |
| 		*  @date    27/03/2015
 | |
| 		*  @since   5.1.5
 | |
| 		*
 | |
| 		*  @param   $post_id (int)
 | |
| 		*  @return  $post_id (int)
 | |
| 		*/
 | |
| 
 | |
| 		function admin_footer() {
 | |
| 
 | |
| 			// script
 | |
| 			?>
 | |
| <script type="text/javascript">
 | |
| (function($) {
 | |
| 	
 | |
| 	// vars
 | |
| 	var view = '<?php echo $this->view; ?>';
 | |
| 	
 | |
| 	// add missing spinners
 | |
| 	var $submit = $('input.button-primary');
 | |
| 	if( !$submit.next('.spinner').length ) {
 | |
| 		$submit.after('<span class="spinner"></span>');
 | |
| 	}
 | |
| 	
 | |
| })(jQuery);	
 | |
| </script>
 | |
| 			<?php
 | |
| 
 | |
| 		}
 | |
| 
 | |
| 
 | |
| 		/*
 | |
| 		*  save_user
 | |
| 		*
 | |
| 		*  description
 | |
| 		*
 | |
| 		*  @type    function
 | |
| 		*  @date    8/10/13
 | |
| 		*  @since   5.0.0
 | |
| 		*
 | |
| 		*  @param   $post_id (int)
 | |
| 		*  @return  $post_id (int)
 | |
| 		*/
 | |
| 
 | |
| 		function save_user( $user_id ) {
 | |
| 
 | |
| 			// verify nonce
 | |
| 			if ( ! acf_verify_nonce( 'user' ) ) {
 | |
| 				return $user_id;
 | |
| 			}
 | |
| 
 | |
| 			// save
 | |
| 			if ( acf_validate_save_post( true ) ) {
 | |
| 				acf_save_post( "user_$user_id" );
 | |
| 			}
 | |
| 		}
 | |
| 
 | |
| 		/**
 | |
| 		 * filter_registration_errors
 | |
| 		 *
 | |
| 		 * Validates $_POST data and appends any errors to prevent new user registration.
 | |
| 		 *
 | |
| 		 * @date    12/7/19
 | |
| 		 * @since   5.8.1
 | |
| 		 *
 | |
| 		 * @param   WP_Error $errors A WP_Error object containing any errors encountered during registration.
 | |
| 		 * @param   string   $sanitized_user_login User's username after it has been sanitized.
 | |
| 		 * @param   string   $user_email User's email.
 | |
| 		 * @return  WP_Error
 | |
| 		 */
 | |
| 		function filter_registration_errors( $errors, $sanitized_user_login, $user_email ) {
 | |
| 			if ( ! acf_validate_save_post() ) {
 | |
| 				$acf_errors = acf_get_validation_errors();
 | |
| 				foreach ( $acf_errors as $acf_error ) {
 | |
| 					$errors->add(
 | |
| 						acf_idify( $acf_error['input'] ),
 | |
| 						acf_esc_html( acf_punctify( sprintf( __( '<strong>Error</strong>: %s', 'acf' ), $acf_error['message'] ) ) )
 | |
| 					);
 | |
| 				}
 | |
| 			}
 | |
| 			return $errors;
 | |
| 		}
 | |
| 
 | |
| 		/**
 | |
| 		 * filter_pre_load_value
 | |
| 		 *
 | |
| 		 * Checks if a $_POST value exists for this field to allow persistent values.
 | |
| 		 *
 | |
| 		 * @date    12/7/19
 | |
| 		 * @since   5.8.2
 | |
| 		 *
 | |
| 		 * @param   null         $null A null placeholder.
 | |
| 		 * @param   (int|string) $post_id The post id.
 | |
| 		 * @param   array        $field The field array.
 | |
| 		 * @return  mixed
 | |
| 		 */
 | |
| 		function filter_pre_load_value( $null, $post_id, $field ) {
 | |
| 			$field_key = $field['key'];
 | |
| 			// phpcs:disable WordPress.Security.NonceVerification.Missing -- Verified in save_user().
 | |
| 			if ( isset( $_POST['acf'][ $field_key ] ) ) {
 | |
| 				return $_POST['acf'][ $field_key ]; // phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized -- Sanitized elsewhere.
 | |
| 			}
 | |
| 			// phpcs:enable WordPress.Security.NonceVerification.Missing
 | |
| 			return $null;
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 	// instantiate
 | |
| 	acf_new_instance( 'ACF_Form_User' );
 | |
| 
 | |
| endif; // class_exists check
 | |
| 
 | |
| ?>
 |