messages ) ) { return; } $this->messages = [ 'logged_in' => __( 'You are already logged in.', 'advanced-members' ), /* translators: Login URL */ 'logged_out' => sprintf( __( 'You have been logged out of the site. You can log in here.', 'advanced-members' ), esc_url( amem_get_core_page( 'login', false, 'current' ) ) ), 'invalid_form' => __( 'Invalid form detected.', 'advanced-members' ), 'empty_username_email' => __( 'Please enter your username or email', 'advanced-members' ), 'empty_password' => __( 'Please enter your password', 'advanced-members' ), 'empty_email' => __( 'Please enter your email', 'advanced-members' ), /* translators: Kept for backward compatibility; prefer invalid_credentials_message() to avoid account enumeration. */ 'username_not_exists' => __( 'Invalid %1$s or %2$s.', 'advanced-members' ), 'password_incorrect' => __( 'Password is incorrect. Please try again.', 'advanced-members' ), /* translators: 1: Identity field label (e.g. ID), 2: Password field label */ 'invalid_credentials' => __( 'Invalid %1$s or %2$s.', 'advanced-members' ), /* translators: Current URL */ 'nonce_failed' => sprintf( __( 'Your submission failed. Please reload the page and try again.', 'advanced-members' ), amem_get_current_url() ), 'invalid_honeypot' => __( 'Spam Detected', 'advanced-members' ), 'rejected' => __( 'rejected user', 'advanced-members' ), 'form_disabled' => __( 'Form is disabled', 'advanced-members' ), 'awaiting_admin_review' => __( 'Your account is awaiting admin review. Please wait for approval.', 'advanced-members' ), ]; } function messages() { $this->messages = apply_filters('amem/error/messages', $this->messages); return $this->messages; } function add_text($key, $text) { if ( !isset($this->messages[$key]) ) $this->messages[$key] = $text; } function text($key) { if ( isset($this->messages[$key]) ) return $this->messages[$key]; return ''; } /** * Login failure message using the form field labels (anti-enumeration, label-aware). * * @param array $form Form config (expects amem field map). * @param array $fields Submitted/resolved ACF fields. * @return string */ function invalid_credentials_message( $form = [], $fields = [] ) { $identity_label = __( 'username/email', 'advanced-members' ); $password_label = __( 'password', 'advanced-members' ); $amem = ( is_array( $form ) && ! empty( $form['amem'] ) && is_array( $form['amem'] ) ) ? $form['amem'] : []; foreach ( array( 'username', 'user_email' ) as $key ) { if ( empty( $amem[ $key ] ) ) { continue; } $field = amem_get_field_object( $amem[ $key ], $fields ); if ( $field && ! empty( $field['label'] ) ) { $identity_label = wp_strip_all_tags( $field['label'] ); break; } } if ( ! empty( $amem['user_password'] ) && 'field_amem_errors' !== $amem['user_password'] ) { $field = amem_get_field_object( $amem['user_password'], $fields ); if ( $field && ! empty( $field['label'] ) ) { $password_label = wp_strip_all_tags( $field['label'] ); } } $template = $this->text( 'invalid_credentials' ); if ( ! $template ) { /* translators: 1: Identity field label (e.g. ID), 2: Password field label */ $template = __( 'Invalid %1$s or %2$s.', 'advanced-members' ); } $message = sprintf( $template, $identity_label, $password_label ); /** * Filter the login invalid-credentials message. * * @param string $message Resolved message. * @param string $identity_label Identity field label. * @param string $password_label Password field label. * @param array $form Form config. * @param array $fields Form fields. */ return apply_filters( 'amem/error/invalid_credentials_message', $message, $identity_label, $password_label, $form, $fields ); } function add($input='', $message='') { if ( !$message && isset($this->messages[$input]) ) $message = $this->messages[$input]; $this->errors[$input] = $message; } function form_error($code, $message='') { $code = sanitize_key( $code ); if ( !$message && !isset($this->messages[$code]) ) return; if ( $message ) $this->add_text($code, $message); $this->form_errors[] = $code; } function form_error_message( $form, $args, $echo=false ) { $error_code = isset($_GET['errc']) ? sanitize_key($_GET['errc']) : ''; // phpcs:disable WordPress.Security.NonceVerification if ( $error_code ) $this->form_errors[] = $error_code; $this->form_errors = array_filter( array_unique( $this->form_errors ) ); if ( !$this->form_errors ) return; foreach ( $this->form_errors as $code ) { $message = amem()->errors->text($code); $message = apply_filters( 'amem/form/error_message', $message, $code, $form, $args ); $message = apply_filters( 'amem/form/error_message/type=' . $form['type'], $message, $code, $form, $args ); $message = amem_format_message( amem_resolve_merge_tags( $message ), false, false ); $output .= "\n" . sprintf( '
', $message );// message text escaped by amem_format_message() } if ( $echo ) echo $output; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- $output built from amem_format_message() which handles escaping return $output; } function get($input) { if ( isset($this->errors[$input]) ) return isset($this->errors[$input]); return null; } function reset() { $this->errors = []; } function get_errors() { return $this->errors; } function has_errors() { return count($this->errors) > 0; } function to_wp_error() { $wp_error = new \WP_Error; $errors = acf_get_validation_errors(); if ( $errors ) { foreach ( $errors as $error ) { $wp_error->add( $error['input'], $error['message'] ); } } if ( count($this->errors) > 0 ) { foreach ( $this->errors as $key => $val ) { $wp_error->add( $key, $val ); } } return $wp_error; } } amem()->register_module('errors', Errors::getInstance());