id = uniqid();
$this->shortcode_args = $args;
/* For backwards-compatibility */
add_action( 'charitable_form_field', array( $this, 'render_field' ), 10, 6 );
}
/**
* Return the arguments passed to the shortcode.
*
* @since 1.4.0
*
* @return mixed[]
*/
public function get_shortcode_args() {
return $this->shortcode_args;
}
/**
* Profile fields to be displayed.
*
* @since 1.0.0
* @version 1.8.9.1
*
* @return array
*/
public function get_fields() {
// phpcs:disable WordPress.Security.NonceVerification.Missing
$fields = array(
'user_email' => array(
'label' => __( 'Email', 'charitable' ),
'type' => 'email',
'required' => true,
'priority' => 4,
'value' => isset( $_POST['user_email'] ) ? sanitize_text_field( wp_unslash( $_POST['user_email'] ) ) : '',
),
'user_login' => array(
'label' => __( 'Username', 'charitable' ),
'type' => 'text',
'priority' => 6,
'required' => true,
'value' => isset( $_POST['user_login'] ) ? sanitize_text_field( wp_unslash( $_POST['user_login'] ) ) : '',
),
'user_pass' => array(
'label' => __( 'Password', 'charitable' ),
'type' => 'password',
'priority' => 8,
'required' => true,
'value' => isset( $_POST['user_pass'] ) ? sanitize_text_field( wp_unslash( $_POST['user_pass'] ) ) : '',
),
);
// phpcs:enable WordPress.Security.NonceVerification.Missing
$fields = $this->maybe_add_terms_conditions_fields( $fields );
/**
* Filter the user registration fields.
*
* @since 1.0.0
*
* @param array $fields The registered fields.
*/
$fields = apply_filters( 'charitable_user_registration_fields', $fields );
uasort( $fields, 'charitable_priority_sort' );
return $fields;
}
/**
* Maybe add terms and conditions fields to the form.
*
* @since 1.6.2
* @version 1.8.9.1
*
* @param array $fields The registered form fields.
* @return array
*/
public function maybe_add_terms_conditions_fields( $fields ) {
if ( charitable_is_privacy_policy_activated() ) {
$fields['privacy_policy_text'] = array(
'type' => 'content',
'content' => '
' . charitable_get_privacy_policy_field_text() . '
',
'priority' => 20,
);
}
if ( charitable_is_contact_consent_activated() ) {
// phpcs:disable WordPress.Security.NonceVerification.Missing
$checked = isset( $_POST['contact_consent'] ) && ! empty( sanitize_text_field( wp_unslash( $_POST['contact_consent'] ) ) );
// phpcs:enable WordPress.Security.NonceVerification.Missing
$fields['contact_consent'] = array(
'type' => 'checkbox',
'label' => charitable_get_option( 'contact_consent_label', __( 'Yes, I am happy for you to contact me via email or phone.', 'charitable' ) ),
'priority' => 22,
'required' => false,
'checked' => $checked,
);
}
if ( charitable_is_terms_and_conditions_activated() ) {
$fields['terms_text'] = array(
'type' => 'content',
'content' => '' . charitable_get_terms_and_conditions() . '
',
'priority' => 24,
);
$fields['accept_terms'] = array(
'type' => 'checkbox',
'label' => charitable_get_terms_and_conditions_field_label(),
'priority' => 28,
'required' => true,
'data_type' => 'meta',
);
}
return $fields;
}
/**
* Return the hidden fields for this form.
*
* @since 1.5.0
*
* @return array
*/
public function get_hidden_fields() {
$fields = parent::get_hidden_fields();
$redirect = $this->get_redirect_url();
if ( false !== $redirect ) {
$fields['redirect_to'] = $redirect;
}
return $fields;
}
/**
* Update registration after form submission.
*
* @since 1.0.0
* @version 1.8.1.15
*
* @return void
*/
public static function save_registration() {
$form = new Charitable_Registration_Form();
if ( ! $form->validate_nonce() || ! $form->validate_honeypot() ) {
charitable_get_notices()->add_error( __( 'Unfortunately, we were unable to verify your form submission. Please reload the page and try again.', 'charitable' ) );
return;
}
$fields = $form->get_fields();
$valid = $form->check_required_fields( $fields );
if ( ! $valid ) {
return;
}
$submitted = apply_filters( 'charitable_registration_values', $form->get_submitted_values(), $fields, $form );
if ( ! isset( $submitted['user_email'] ) || ! is_email( $submitted['user_email'] ) ) {
charitable_get_notices()->add_error(
sprintf(
/* translators: %s: submitted email address */
__( '%s is not a valid email address.', 'charitable' ),
$submitted['user_email']
)
);
return false;
}
// Remove any ID fields that may have been submitted.
if ( array_key_exists( 'ID', $submitted ) ) {
unset( $submitted['ID'] );
}
$user = new Charitable_User();
$user_id = $user->update_profile( $submitted, array_keys( $fields ) );
/**
* If the user was successfully created, redirect to the login redirect URL.
* If there was a problem, this simply falls through and keeps the user on the
* registration page.
*/
if ( $user_id ) {
/* Maybe send an email verification email. */
if ( charitable_get_option( array( 'emails_email_verification', 'send_after_registration' ), 1 ) ) {
/* If the confirmation link is generated correctly and the email is sent, set a notice. */
if ( Charitable_User_Management::get_instance()->send_verification_email( $user ) ) {
$message = sprintf(
/* translators: %s: email verification link */
__( 'We have sent you an email to confirm your email address. Haven\'t received the email? Click here to send it again.', 'charitable' ),
esc_url_raw( charitable_get_email_verification_link( $user, false, true ) )
);
charitable_get_notices()->add_success( $message );
charitable_get_session()->add_notices();
}
}
wp_safe_redirect( charitable_get_login_redirect_url() );
exit();
}
}
/**
* Return the link to the login page, or false if we are not going to display it.
*
* @since 1.4.2
* @version 1.8.9.1
*
* @return false|string
*/
public function get_login_link() {
if ( false == $this->shortcode_args['login_link_text'] || 'false' == $this->shortcode_args['login_link_text'] ) {
return false;
}
$login_link = charitable_get_permalink( 'login_page' );
if ( charitable_get_permalink( 'registration_page' ) === $login_link ) {
return false;
}
// phpcs:disable WordPress.Security.NonceVerification.Recommended
if ( isset( $_GET['redirect_to'] ) ) {
$redirect_to = sanitize_text_field( wp_unslash( $_GET['redirect_to'] ) );
$login_link = add_query_arg( 'redirect_to', $redirect_to, $login_link );
}
// phpcs:enable WordPress.Security.NonceVerification.Recommended
return sprintf(
'%2$s',
esc_url( $login_link ),
$this->shortcode_args['login_link_text']
);
}
/**
* Get the redirect URL.
*
* @since 1.5.0
* @version 1.8.9.1
*
* @return string|false
*/
protected function get_redirect_url() {
$redirect = false;
// phpcs:disable WordPress.Security.NonceVerification.Recommended
if ( isset( $_GET['redirect_to'] ) ) {
$redirect_to = sanitize_text_field( wp_unslash( $_GET['redirect_to'] ) );
if ( strlen( $redirect_to ) ) {
$redirect = $redirect_to;
}
} elseif ( isset( $this->shortcode_args['redirect'] ) && strlen( $this->shortcode_args['redirect'] ) ) {
$redirect = $this->shortcode_args['redirect'];
}
// phpcs:enable WordPress.Security.NonceVerification.Recommended
return $redirect;
}
}
endif;