Validate()
Description #
The validation class.
Source #
File: lib/class-validate.php
class Validate {
/**
* Sanitize field value using sanitize_text_field.
*
* @param null|string|array $value String or array to sanitize.
* @return null|string|array
*/
public static function sanitize_text_field( $value = null ) {
if ( null !== $value ) {
return is_array( $value ) ? array_map( 'sanitize_text_field', $value ) : sanitize_text_field( $value );
}
}
/**
* Sanitize textarea value using sanitize_textarea_field.
*
* @param null|string|array $value String or array to sanitize.
* @return null|string|array
*/
public static function sanitize_textarea_field( $value = null ) {
if ( null !== $value ) {
return is_array( $value ) ? array_map( 'sanitize_textarea_field', $value ) : sanitize_textarea_field( $value );
}
}
/**
* Sanitize field value using sanitize_title.
*
* @param null|string|array $value String or array to sanitize.
* @return null|string|array
*/
public static function sanitize_title( $value = null ) {
if ( null !== $value ) {
return is_array( $value ) ? array_map( 'sanitize_title', $value ) : sanitize_title( $value );
}
}
/**
* Remove empty array items.
*
* @param null|array $value Array to sanitize.
* @return array|null
*/
public static function sanitize_array_remove_empty( $value = null ) {
if ( null !== $value && is_array( $value ) ) {
return array_filter( $value );
}
}
/**
* Sanitize field value using wp_kses.
*
* @param null|string $value String to sanitize.
* @return null|string
*/
public static function sanitize_wp_kses( $value = null ) {
if ( null !== $value ) {
return wp_kses( $value, ap_form_allowed_tags() );
}
}
/**
* Sanitize field value using absint.
*
* @param null|string $value String to sanitize.
* @return null|string
*/
public static function sanitize_absint( $value = null ) {
if ( ! is_null( $value ) ) {
return absint( $value );
}
}
/**
* Sanitize field value using intval.
*
* @param null|string $value String to sanitize.
* @return null|string Return integer value.
*/
public static function sanitize_intval( $value = null ) {
if ( ! is_null( $value ) ) {
return intval( $value );
}
}
/**
* Sanitize field value and return only boolean.
*
* @param null|string $value String to sanitize.
* @return null|boolean Return boolean value.
*/
public static function sanitize_boolean( $value = null ) {
if ( ! is_null( $value ) ) {
return (bool) $value;
}
}
/**
* Sanitize field value and return only boolean.
*
* @param null|array $value Array to sanitize.
* @return null|boolean Return boolean value.
*/
public static function sanitize_array_map_boolean( $value = null ) {
if ( ! empty( $value ) ) {
return array_map( array( __CLASS__, 'sanitize_boolean' ), $value );
}
}
/**
* Sanitize field value and return HTML escaped value.
*
* @param null|string $value String to sanitize.
* @return null|string Returns HTML escaped string.
*/
public static function sanitize_esc_html( $value = null ) {
if ( ! empty( $value ) ) {
return esc_html( $value );
}
}
/**
* Sanitize field value and return sanitized url.
*
* @param null|string $value String to sanitize.
* @return null|string
*/
public static function sanitize_email( $value = null ) {
if ( ! empty( $value ) ) {
return sanitize_email( $value );
}
}
/**
* Sanitize field value and return sanitized url.
*
* @param null|string $value String to sanitize.
* @return null|string
*/
public static function sanitize_esc_url( $value = null ) {
if ( ! empty( $value ) ) {
return esc_url( $value );
}
}
/**
* Sanitize description field.
*
* Remove more, encode contents of code and pre tag.
* Replace square brackets so that shortcode don't get rendered.
*
* @param null|string $value String to sanitize.
*
* @return null|string
* @since 4.1.8 Remove multiple new line and remove single space.
*/
public static function sanitize_description( $value = null ) {
if ( ! empty( $value ) ) {
/**
* Filter called before applying sanitization to a description fields.
*
* @param string $value Value.
* @since 4.1.9
*/
$new_value = apply_filters( 'ap_pre_sanitize_description', $value );
$new_value = str_replace( '<!--more-->', '', $new_value );
$patt = get_shortcode_regex();
$new_value = preg_replace_callback( "/$patt/", array( __CLASS__, 'whitelist_shortcodes' ), $new_value );
$new_value = preg_replace_callback( '/<pre(.*?)>(.*?)<\/pre>/imsu', array( __CLASS__, 'pre_content' ), $new_value );
$new_value = preg_replace_callback( '/<code.*?>(.*?)<\/code>/imsu', array( __CLASS__, 'code_content' ), $new_value );
// Remove multiple new lines.
$new_value = str_replace( "\r\n", "\n", $new_value );
$new_value = preg_replace( '/\n\s*\n/', "\n\n", $new_value );
// Remove single white single space in line.
$new_value = preg_replace( '/ /', "\n", $new_value );
return $new_value;
}
}
/**
* Whitelist shortcodes in content.
*
* @param array $m Preg matches.
* @return string
*/
private static function whitelist_shortcodes( $m ) {
/**
* Filter for overriding allowed shortcodes.
*
* @since 4.1.8
*/
$allowed_shortcodes = apply_filters( 'ap_allowed_shortcodes', array() );
// if not allowed shortcode then change square brackets.
if ( ! in_array( $m[2], $allowed_shortcodes, true ) ) {
return ap_replace_square_bracket( $m[0] );
}
return $m[0];
}
/**
* Callback for replacing contents inside <pre> tag.
*
* @see `AP_Form::sanitize_description`
*
* @param array $matches Matches.
* @return string
*/
private static function pre_content( $matches ) {
preg_match( '/aplang\=\\"([A-Za-z0-9 _]*)\\"/', $matches[1], $lang );
$lang = empty( $lang ) ? 'text' : esc_attr( $lang[1] );
return '<pre>' . esc_html( $matches[2] ) . '</pre>';
}
/**
* Callback for replacing contents inside <code> tag.
*
* @see `AP_Form::sanitize_description`
*
* @param array $matches Matches.
* @return string
*/
private static function code_content( $matches ) {
return '<code>' . esc_html( $matches[1] ) . '</code>';
}
/**
* Sanitize tags field.
*
* Sanitize keys and values. Exclude new tags if not allowed.
* Only include numbers of max tags allowed in field option.
*
* @param null|array $value Arrays of tags to sanitize.
* @param array $args Tags JavaScript options.
*
* @return array|null Return sanitized tag array.
* @since 4.1.0
* @since 4.1.5 Improved tags validation.
*/
public static function sanitize_tags_field( $value = null, $args = array() ) {
if ( ! empty( $value ) ) {
$i = 0;
$sanitized = array();
$existing_tags = array();
$args['value_field'] = empty( $args['value_field'] ) || 'name' === $args['value_field'] ? 'name' : 'id';
foreach ( (array) $value as $tag ) {
if ( is_numeric( $tag ) ) {
$existing_tags[] = $tag;
} elseif ( false !== $args['js_options']['create'] ) {
$sanitized[] = sanitize_text_field( $tag );
}
}
$taxo = ! empty( $args['terms_args']['taxonomy'] ) ? $args['terms_args']['taxonomy'] : 'question_tag';
if ( ! empty( $existing_tags ) ) {
$terms = get_terms(
array(
'taxonomy' => $taxo,
'include' => $existing_tags,
'fields' => 'id=>name',
'hide_empty' => false,
)
);
// If allowed add new tags as well.
if ( $terms ) {
foreach ( $terms as $id => $tname ) {
$sanitized[] = 'name' === $args['value_field'] ? $tname : $id;
}
}
}
return $sanitized;
}
}
/**
* Sanitize upload field.
*
* @param null|array $value Array of uploads.
* @param array $upload_options Upload options.
* @return null|array
*/
public static function sanitize_upload( $value = null, $upload_options = array() ) {
if ( ! empty( $value ) && is_array( $value ) && ! empty( $upload_options ) ) {
if ( true === $upload_options['multiple'] && wp_is_numeric_array( $value ) ) {
$value = array_slice( $value, 0, $upload_options['max_files'] );
foreach ( $value as $key => $file ) {
$value[ $key ]['error'] = (int) $file['error'];
$value[ $key ]['name'] = sanitize_file_name( $file['name'] );
}
return $value;
} elseif ( false === $upload_options['multiple'] && ! wp_is_numeric_array( $value ) ) {
$value['error'] = (int) $value['error'];
$value['name'] = sanitize_file_name( $value['name'] );
return $value;
}
}
}
/**
* Validate `required` field.
*
* @param object $field Instance of @see `AP_Field` object.
* @return void
*/
public static function validate_required( $field ) {
if ( '' === $field->value() || is_null( $field->value() ) ) {
$field->add_error(
'required',
sprintf(
// Translators: placeholder contain field label.
__( '%s field is required.', 'anspress-question-answer' ),
$field->get( 'label' )
)
);
}
}
/**
* Validate if value is not zero.
*
* @param object $field Instance of @see `AP_Field` object.
* @return void
*/
public static function validate_not_zero( $field ) {
if ( '0' == $field->value() ) { // phpcs:ignore WordPress.PHP.StrictComparisons.LooseComparison
$field->add_error(
'is-zero',
sprintf(
// Translators: placeholder contain field label.
__( '%s field is required.', 'anspress-question-answer' ),
$field->get( 'label' )
)
);
}
}
/**
* Validate `is_email` field.
*
* @param object $field Instance of @see `AP_Field` object.
* @return void
*/
public static function validate_is_email( $field ) {
if ( ! empty( $field->value() ) && ! is_email( $field->value() ) ) {
$field->add_error(
'is-email',
sprintf(
// Translators: placeholder contain field label.
__( 'Value provided in field %s is not a valid email.', 'anspress-question-answer' ),
$field->get( 'label' )
)
);
}
}
/**
* Validate `is_url` field.
*
* @param object $field Instance of @see `AP_Field` object.
* @return void
*/
public static function validate_is_url( $field ) {
if ( ! empty( $field->unsafe_value() ) && false === filter_var( $field->unsafe_value(), FILTER_VALIDATE_URL ) ) {
$field->add_error(
'is-url',
sprintf(
// Translators: placeholder contain field label.
__( 'Value provided in field %s is not a valid URL.', 'anspress-question-answer' ),
$field->get( 'label' )
)
);
}
}
/**
* Validate `is_url` field.
*
* @param object $field Instance of @see `AP_Field` object.
* @return void
*/
public static function validate_is_numeric( $field ) {
if ( ! empty( $field->unsafe_value() ) && ! is_numeric( $field->unsafe_value() ) ) {
$field->add_error(
'is-numeric',
sprintf(
// Translators: placeholder contain field label.
__( 'Value provided in field %s is not numeric.', 'anspress-question-answer' ),
$field->get( 'label' )
)
);
}
}
/**
* Validate if length of a string is at least as defined.
*
* @param object $field Instance of @see `AP_Field` object.
* @return void
*/
public static function validate_min_string_length( $field ) {
$value = $field->value();
if ( ! empty( $value ) && $field->get( 'min_length' ) ) {
$min_length = $field->get( 'min_length', 0 );
$value = wp_strip_all_tags( $value );
$value = html_entity_decode( $value, ENT_XML1, 'UTF-8' );
if ( mb_strlen( $value, 'utf-8' ) < $min_length ) {
$field->add_error(
'min-string-length',
sprintf(
// Translators: placeholder contain field label.
__( 'Value provided in field %1$s must be at least %2$d characters long.', 'anspress-question-answer' ),
$field->get( 'label' ),
$min_length
)
);
}
}
}
/**
* Validate if length of a string is at least as defined.
*
* @param object $field Instance of @see `AP_Field` object.
* @return void
*/
public static function validate_max_string_length( $field ) {
$value = $field->value();
if ( ! empty( $value ) && $field->get( 'max_length' ) ) {
$max_length = $field->get( 'max_length', 10 );
$value = wp_strip_all_tags( $value );
$value = html_entity_decode( $value, ENT_XML1, 'UTF-8' );
if ( mb_strlen( $value, 'utf-8' ) > $max_length ) {
$field->add_error(
'max-string-length',
sprintf(
// Translators: placeholder contain field label.
__( 'Value provided in field %1$s must not exceeds %2$d characters.', 'anspress-question-answer' ),
$field->get( 'label' ),
$max_length
)
);
}
}
}
/**
* Validate if field is array.
*
* @param object $field Instance of @see `AP_Field` object.
* @return void
*/
public static function validate_is_array( $field ) {
$value = $field->value();
if ( ! empty( $value ) && ! is_array( $value ) ) {
$field->add_error(
'is-array',
sprintf(
// Translators: placeholder contain field label.
__( 'Value provided in field %s is not an array.', 'anspress-question-answer' ),
$field->get( 'label' )
)
);
}
}
/**
* Validate if there are minimum items in an array.
*
* @param object $field Instance of @see `AP_Field` object.
* @return void
*/
public static function validate_array_min( $field ) {
$min_arr = $field->get( 'array_min', 0 );
$value = $field->value();
if ( $min_arr > 0 && ( empty( $value ) || ! is_array( $value ) || $min_arr > count( $value ) ) ) {
$field->add_error(
'array-min',
sprintf(
// Translators: placeholder contain field label.
__( 'Minimum %1$d values are required in field %2$s.', 'anspress-question-answer' ),
$min_arr,
$field->get( 'label' )
)
);
}
}
/**
* Validate if there are minimum items in an array.
*
* @param object $field Instance of @see `AP_Field` object.
* @return void
*/
public static function validate_array_max( $field ) {
$max_arr = (int) $field->get( 'array_max', 0 );
$value = $field->value();
if ( ! empty( $value ) && count( $value ) > $max_arr ) {
$field->add_error(
'array-max',
sprintf(
// Translators: placeholder contain field label.
__( 'Maximum values allowed in field %2$s is %1$d.', 'anspress-question-answer' ),
$max_arr,
$field->get( 'label' )
)
);
}
}
/**
* Check if checking for bad word is enabled.
*
* @return array
* @since 4.0.0
*/
public static function get_bad_words() {
$bad_word_file = ap_get_theme_location( 'badwords.txt' );
// Return if badwords.txt file does not exists.
if ( file_exists( $bad_word_file ) ) {
return file( $bad_word_file, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES );
}
$option = ap_opt( 'bad_words' );
if ( ! empty( $option ) ) {
return explode( ',', $option );
}
return array();
}
/**
* Validate if there are minimum items in an array.
*
* @param object $field Instance of @see `AP_Field` object.
* @return void
*/
public static function validate_badwords( $field ) {
$value = $field->unsafe_value();
$found = array();
foreach ( (array) self::get_bad_words() as $w ) {
$w = trim( $w );
$count = preg_match_all( '/\b' . preg_quote( $w, '/' ) . '\b/i', $value );
if ( $count > 0 ) {
$found[ $w ] = $count;
}
}
if ( ! empty( $found ) ) {
$field->add_error(
'bad-words',
sprintf(
// Translators: placeholder contain field label.
__( 'Found bad words in field %s. Remove them and try again.', 'anspress-question-answer' ),
$field->get( 'label' )
)
);
}
}
/**
* Check if a upload field's value array have error.
*
* @param object $field Instance of @see `AP_Field` object.
* @return false|string Return error message if exists.
*/
private static function file_have_error( $field ) {
$args = $field->get( 'upload_options' );
$value = $field->value();
$errors = array(
0 => __( 'There is no error, the file uploaded with success', 'anspress-question-answer' ),
1 => __( 'The uploaded file exceeds the upload_max_filesize directive in php.ini', 'anspress-question-answer' ),
2 => __( 'The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form', 'anspress-question-answer' ),
3 => __( 'The uploaded file was only partially uploaded', 'anspress-question-answer' ),
4 => __( 'No file was uploaded', 'anspress-question-answer' ),
6 => __( 'Missing a temporary folder', 'anspress-question-answer' ),
7 => __( 'Failed to write file to disk.', 'anspress-question-answer' ),
8 => __( 'A PHP extension stopped the file upload.', 'anspress-question-answer' ),
);
$have_error = false;
if ( true === $args['multiple'] && wp_is_numeric_array( $value ) ) {
foreach ( $value as $key => $file ) {
if ( 0 !== $file['error'] ) {
$have_error = $errors[ $file['error'] ];
}
}
} else {
if ( 0 !== $value['error'] ) {
$have_error = $errors[ $value['error'] ];
}
}
return $have_error;
}
/**
* Check if upload field file size is greater then allowed.
*
* @param object $field Instance of @see `AP_Field` object.
* @return false
*/
private static function file_size_error( $field ) {
$args = $field->get( 'upload_options' );
$value = $field->value();
$have_error = false;
$is_numeric = wp_is_numeric_array( $value );
if ( true === $args['multiple'] && $is_numeric ) {
foreach ( $value as $key => $file ) {
if ( $file['size'] > ap_opt( 'max_upload_size' ) ) {
$have_error = true;
}
}
} elseif ( ! $is_numeric && $value['size'] > ap_opt( 'max_upload_size' ) ) {
$have_error = true;
}
return $have_error;
}
/**
* Check file array contain allowed mime types.
*
* @param object $field Instance of @see `AP_Field` object.
* @return boolean
*/
private static function file_valid_type( $field ) {
$args = $field->get( 'upload_options' );
$value = $field->value();
$have_error = true;
$is_numeric = wp_is_numeric_array( $value );
if ( true === $args['multiple'] && $is_numeric ) {
foreach ( $value as $key => $file ) {
$actual_mime = wp_check_filetype_and_ext( $file['tmp_name'], $file['name'] );
if ( false !== $actual_mime && in_array( $actual_mime['type'], $args['allowed_mimes'], true ) ) {
$have_error = false;
}
}
} elseif ( ! $is_numeric ) {
$actual_mime = wp_check_filetype_and_ext( $value['tmp_name'], $value['name'] );
if ( false !== $actual_mime && in_array( $actual_mime['type'], $args['allowed_mimes'], true ) ) {
$have_error = false;
}
}
return $have_error;
}
/**
* Validate an upload field.
*
* @param object $field Instance of @see `AP_Field` object.
* @return void
*/
public static function validate_upload( $field ) {
$args = $field->get( 'upload_options' );
$value = $field->unsafe_value();
if ( ! empty( $value ) ) {
// Check if user have permission to upload files.
if ( ! ap_user_can_upload() ) {
$field->add_error( 'deny-upload', __( 'You are not allowed to upload file(s)', 'anspress-question-answer' ) );
}
$is_numeric = wp_is_numeric_array( $value );
if (
( false === $args['multiple'] && $is_numeric ) ||
( true === $args['multiple'] && count( $value ) > $args['max_files'] )
) {
$field->add_error(
'max-uploads',
sprintf(
// Translators: %1$d contain maximum files user can upload, %2$s contain label of field.
__( 'You cannot upload more than %1$d file in field %2$s', 'anspress-question-answer' ),
$args['max_files'],
$field->get( 'label' )
)
);
}
// Check if allowed mimes.
$valid_mimes = self::file_valid_type( $field );
if ( false !== $valid_mimes ) {
$field->add_error( 'mimes-not-allowed', __( 'File type is not allowed to upload.', 'anspress-question-answer' ) );
}
// Check if file have any error.
$error = self::file_have_error( $field );
if ( false !== $error ) {
$field->add_error( 'upload-file-error', $error );
}
// Check file size.
$file_size = self::file_size_error( $field );
if ( false !== $file_size ) {
$field->add_error(
'max-size-upload',
sprintf(
// Translators: %s contain maximum file size user can upload.
__( 'File(s) size is bigger than %s MB', 'anspress-question-answer' ),
round( ap_opt( 'max_upload_size' ) / ( 1024 * 1024 ), 2 )
)
);
}
}
}
/**
* Author - Jay Iyer (06/26/2019)
* Validate 'is_checked' field.
* Description - Add the 'is_checked' validate method to require the Checkbox field to be checked on form submit.
*
* @param object $field Instance of @see `AP_Field` object.
* @return void
*/
public static function validate_is_checked( $field ) {
if ( ! empty( $field ) ) {
$value = $field->value();
if ( ! $value ) {
$field->add_error(
'is-checked',
sprintf(
// Translators: placeholder contain field label.
__( 'You are required to check %s field', 'anspress-question-answer' ),
$field->get( 'label' )
)
);
}
}
}
}
Expand full source code Collapse full source code View on GitHub: lib/class-validate.php:24
Add your comment