533 lines
		
	
	
		
			11 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			533 lines
		
	
	
		
			11 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
| <?php
 | |
| 
 | |
| /**
 | |
|  * acf_filter_attrs
 | |
|  *
 | |
|  * Filters out empty attrs from the provided array.
 | |
|  *
 | |
|  * @date    11/6/19
 | |
|  * @since   5.8.1
 | |
|  *
 | |
|  * @param   array $attrs The array of attrs.
 | |
|  * @return  array
 | |
|  */
 | |
| function acf_filter_attrs( $attrs ) {
 | |
| 
 | |
| 	// Filter out empty attrs but allow "0" values.
 | |
| 	$filtered = array_filter( $attrs, 'acf_not_empty' );
 | |
| 
 | |
| 	// Correct specific attributes (required="required").
 | |
| 	foreach ( array( 'required', 'readonly', 'disabled', 'multiple' ) as $key ) {
 | |
| 		unset( $filtered[ $key ] );
 | |
| 		if ( ! empty( $attrs[ $key ] ) ) {
 | |
| 			$filtered[ $key ] = $key;
 | |
| 		}
 | |
| 	}
 | |
| 	return $filtered;
 | |
| }
 | |
| 
 | |
| /**
 | |
|  * acf_esc_attrs
 | |
|  *
 | |
|  * Generated valid HTML from an array of attrs.
 | |
|  *
 | |
|  * @date    11/6/19
 | |
|  * @since   5.8.1
 | |
|  *
 | |
|  * @param   array $attrs The array of attrs.
 | |
|  * @return  string
 | |
|  */
 | |
| function acf_esc_attrs( $attrs ) {
 | |
| 	$html = '';
 | |
| 
 | |
| 	// Loop over attrs and validate data types.
 | |
| 	foreach ( $attrs as $k => $v ) {
 | |
| 
 | |
| 		// String (but don't trim value).
 | |
| 		if ( is_string( $v ) && ( $k !== 'value' ) ) {
 | |
| 			$v = trim( $v );
 | |
| 
 | |
| 			// Boolean
 | |
| 		} elseif ( is_bool( $v ) ) {
 | |
| 			$v = $v ? 1 : 0;
 | |
| 
 | |
| 			// Object
 | |
| 		} elseif ( is_array( $v ) || is_object( $v ) ) {
 | |
| 			$v = json_encode( $v );
 | |
| 		}
 | |
| 
 | |
| 		// Generate HTML.
 | |
| 		$html .= sprintf( ' %s="%s"', esc_attr( $k ), esc_attr( $v ) );
 | |
| 	}
 | |
| 
 | |
| 	// Return trimmed.
 | |
| 	return trim( $html );
 | |
| }
 | |
| 
 | |
| 
 | |
| /**
 | |
|  * Sanitizes text content and strips out disallowed HTML.
 | |
|  *
 | |
|  * This function emulates `wp_kses_post()` with a context of "acf" for extensibility.
 | |
|  *
 | |
|  * @date    16/4/21
 | |
|  * @since   5.9.6
 | |
|  *
 | |
|  * @param   string $string
 | |
|  * @return  string
 | |
|  */
 | |
| function acf_esc_html( $string = '' ) {
 | |
| 	return wp_kses( (string) $string, 'acf' );
 | |
| }
 | |
| 
 | |
| /**
 | |
|  * Private callback for the "wp_kses_allowed_html" filter used to return allowed HTML for "acf" context.
 | |
|  *
 | |
|  * @date    16/4/21
 | |
|  * @since   5.9.6
 | |
|  *
 | |
|  * @param   array  $tags An array of allowed tags.
 | |
|  * @param   string $context The context name.
 | |
|  * @return  array.
 | |
|  */
 | |
| 
 | |
| function _acf_kses_allowed_html( $tags, $context ) {
 | |
| 	global $allowedposttags;
 | |
| 
 | |
| 	if ( $context === 'acf' ) {
 | |
| 		return $allowedposttags;
 | |
| 	}
 | |
| 	return $tags;
 | |
| }
 | |
| 
 | |
| add_filter( 'wp_kses_allowed_html', '_acf_kses_allowed_html', 0, 2 );
 | |
| 
 | |
| /**
 | |
|  * acf_html_input
 | |
|  *
 | |
|  * Returns the HTML of an input.
 | |
|  *
 | |
|  * @date    13/6/19
 | |
|  * @since   5.8.1
 | |
|  *
 | |
|  * @param   array $attrs The array of attrs.
 | |
|  * @return  string
 | |
|  */
 | |
| // function acf_html_input( $attrs = array() ) {
 | |
| // return sprintf( '<input %s/>', acf_esc_attrs($attrs) );
 | |
| // }
 | |
| 
 | |
| /**
 | |
|  * acf_hidden_input
 | |
|  *
 | |
|  * Renders the HTML of a hidden input.
 | |
|  *
 | |
|  * @date    3/02/2014
 | |
|  * @since   5.0.0
 | |
|  *
 | |
|  * @param   array $attrs The array of attrs.
 | |
|  * @return  string
 | |
|  */
 | |
| function acf_hidden_input( $attrs = array() ) {
 | |
| 	echo acf_get_hidden_input( $attrs );
 | |
| }
 | |
| 
 | |
| /**
 | |
|  * acf_get_hidden_input
 | |
|  *
 | |
|  * Returns the HTML of a hidden input.
 | |
|  *
 | |
|  * @date    3/02/2014
 | |
|  * @since   5.0.0
 | |
|  *
 | |
|  * @param   array $attrs The array of attrs.
 | |
|  * @return  string
 | |
|  */
 | |
| function acf_get_hidden_input( $attrs = array() ) {
 | |
| 	return sprintf( '<input type="hidden" %s/>', acf_esc_attrs( $attrs ) );
 | |
| }
 | |
| 
 | |
| /**
 | |
|  * acf_text_input
 | |
|  *
 | |
|  * Renders the HTML of a text input.
 | |
|  *
 | |
|  * @date    3/02/2014
 | |
|  * @since   5.0.0
 | |
|  *
 | |
|  * @param   array $attrs The array of attrs.
 | |
|  * @return  string
 | |
|  */
 | |
| function acf_text_input( $attrs = array() ) {
 | |
| 	echo acf_get_text_input( $attrs );
 | |
| }
 | |
| 
 | |
| /**
 | |
|  * acf_get_text_input
 | |
|  *
 | |
|  * Returns the HTML of a text input.
 | |
|  *
 | |
|  * @date    3/02/2014
 | |
|  * @since   5.0.0
 | |
|  *
 | |
|  * @param   array $attrs The array of attrs.
 | |
|  * @return  string
 | |
|  */
 | |
| function acf_get_text_input( $attrs = array() ) {
 | |
| 	$attrs = wp_parse_args(
 | |
| 		$attrs,
 | |
| 		array(
 | |
| 			'type' => 'text',
 | |
| 		)
 | |
| 	);
 | |
| 	if ( isset( $attrs['value'] ) && is_string( $attrs['value'] ) ) {
 | |
| 		$attrs['value'] = htmlspecialchars( $attrs['value'] );
 | |
| 	}
 | |
| 	return sprintf( '<input %s/>', acf_esc_attrs( $attrs ) );
 | |
| }
 | |
| 
 | |
| /**
 | |
|  * acf_file_input
 | |
|  *
 | |
|  * Renders the HTML of a file input.
 | |
|  *
 | |
|  * @date    3/02/2014
 | |
|  * @since   5.0.0
 | |
|  *
 | |
|  * @param   array $attrs The array of attrs.
 | |
|  * @return  string
 | |
|  */
 | |
| function acf_file_input( $attrs = array() ) {
 | |
| 	echo acf_get_file_input( $attrs );
 | |
| }
 | |
| 
 | |
| /**
 | |
|  * acf_get_file_input
 | |
|  *
 | |
|  * Returns the HTML of a file input.
 | |
|  *
 | |
|  * @date    3/02/2014
 | |
|  * @since   5.0.0
 | |
|  *
 | |
|  * @param   array $attrs The array of attrs.
 | |
|  * @return  string
 | |
|  */
 | |
| function acf_get_file_input( $attrs = array() ) {
 | |
| 	$field_key   = isset( $attrs['key'] ) && is_string( $attrs['key'] ) ? $attrs['key'] : '';
 | |
| 	$nonce_field = '';
 | |
| 
 | |
| 	/**
 | |
| 	 * If we don't have a field key (most likely because this was called by a third-party field),
 | |
| 	 * we have to try to guess the field key based on the field name.
 | |
| 	 */
 | |
| 	if ( '' === $field_key ) {
 | |
| 		$parts = explode( '[', $attrs['name'] );
 | |
| 		if ( is_array( $parts ) && ! empty( $parts[1] ) ) {
 | |
| 			// Remove the trailing `]`.
 | |
| 			$field_key = substr( end( $parts ), 0, -1 );
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 * We only output the nonce if we have a field key, as it's possible to render
 | |
| 	 * the file input without a real field. But, basic uploaders that don't have any
 | |
| 	 * custom logic will likely fail to upload anyway if they don't have a field key.
 | |
| 	 */
 | |
| 	if ( '' !== $field_key ) {
 | |
| 		$nonce_attrs = array(
 | |
| 			'name'  => 'acf[' . $field_key . '_file_nonce]',
 | |
| 			'value' => wp_create_nonce( 'acf/file_uploader_nonce/' . $field_key ),
 | |
| 		);
 | |
| 		$nonce_field = sprintf(
 | |
| 			'<input type="hidden" %s />',
 | |
| 			acf_esc_attrs( $nonce_attrs )
 | |
| 		);
 | |
| 	}
 | |
| 
 | |
| 	return sprintf(
 | |
| 		'<input type="file" %1$s />%2$s',
 | |
| 		acf_esc_attrs( $attrs ),
 | |
| 		$nonce_field
 | |
| 	);
 | |
| }
 | |
| 
 | |
| /**
 | |
|  * acf_textarea_input
 | |
|  *
 | |
|  * Renders the HTML of a textarea input.
 | |
|  *
 | |
|  * @date    3/02/2014
 | |
|  * @since   5.0.0
 | |
|  *
 | |
|  * @param   array $attrs The array of attrs.
 | |
|  * @return  string
 | |
|  */
 | |
| function acf_textarea_input( $attrs = array() ) {
 | |
| 	echo acf_get_textarea_input( $attrs );
 | |
| }
 | |
| 
 | |
| /**
 | |
|  * acf_get_textarea_input
 | |
|  *
 | |
|  * Returns the HTML of a textarea input.
 | |
|  *
 | |
|  * @date    3/02/2014
 | |
|  * @since   5.0.0
 | |
|  *
 | |
|  * @param   array $attrs The array of attrs.
 | |
|  * @return  string
 | |
|  */
 | |
| function acf_get_textarea_input( $attrs = array() ) {
 | |
| 	$value = '';
 | |
| 	if ( isset( $attrs['value'] ) ) {
 | |
| 		$value = $attrs['value'];
 | |
| 		unset( $attrs['value'] );
 | |
| 	}
 | |
| 	return sprintf( '<textarea %s>%s</textarea>', acf_esc_attrs( $attrs ), esc_textarea( $value ) );
 | |
| }
 | |
| 
 | |
| /**
 | |
|  * acf_checkbox_input
 | |
|  *
 | |
|  * Renders the HTML of a checkbox input.
 | |
|  *
 | |
|  * @date    3/02/2014
 | |
|  * @since   5.0.0
 | |
|  *
 | |
|  * @param   array $attrs The array of attrs.
 | |
|  * @return  string
 | |
|  */
 | |
| function acf_checkbox_input( $attrs = array() ) {
 | |
| 	echo acf_get_checkbox_input( $attrs );
 | |
| }
 | |
| 
 | |
| /**
 | |
|  * acf_get_checkbox_input
 | |
|  *
 | |
|  * Returns the HTML of a checkbox input.
 | |
|  *
 | |
|  * @date    3/02/2014
 | |
|  * @since   5.0.0
 | |
|  *
 | |
|  * @param   array $attrs The array of attrs.
 | |
|  * @return  string
 | |
|  */
 | |
| function acf_get_checkbox_input( $attrs = array() ) {
 | |
| 
 | |
| 	// Allow radio or checkbox type.
 | |
| 	$attrs = wp_parse_args(
 | |
| 		$attrs,
 | |
| 		array(
 | |
| 			'type' => 'checkbox',
 | |
| 		)
 | |
| 	);
 | |
| 
 | |
| 	// Get label.
 | |
| 	$label = '';
 | |
| 	if ( isset( $attrs['label'] ) ) {
 | |
| 		$label = $attrs['label'];
 | |
| 		unset( $attrs['label'] );
 | |
| 	}
 | |
| 
 | |
| 	// Render.
 | |
| 	$checked = isset( $attrs['checked'] );
 | |
| 	return '<label' . ( $checked ? ' class="selected"' : '' ) . '><input ' . acf_esc_attr( $attrs ) . '/> ' . acf_esc_html( $label ) . '</label>';
 | |
| }
 | |
| 
 | |
| /**
 | |
|  * acf_radio_input
 | |
|  *
 | |
|  * Renders the HTML of a radio input.
 | |
|  *
 | |
|  * @date    3/02/2014
 | |
|  * @since   5.0.0
 | |
|  *
 | |
|  * @param   array $attrs The array of attrs.
 | |
|  * @return  string
 | |
|  */
 | |
| function acf_radio_input( $attrs = array() ) {
 | |
| 	echo acf_get_radio_input( $attrs );
 | |
| }
 | |
| 
 | |
| /**
 | |
|  * acf_get_radio_input
 | |
|  *
 | |
|  * Returns the HTML of a radio input.
 | |
|  *
 | |
|  * @date    3/02/2014
 | |
|  * @since   5.0.0
 | |
|  *
 | |
|  * @param   array $attrs The array of attrs.
 | |
|  * @return  string
 | |
|  */
 | |
| function acf_get_radio_input( $attrs = array() ) {
 | |
| 	$attrs['type'] = 'radio';
 | |
| 	return acf_get_checkbox_input( $attrs );
 | |
| }
 | |
| 
 | |
| /**
 | |
|  * acf_select_input
 | |
|  *
 | |
|  * Renders the HTML of a select input.
 | |
|  *
 | |
|  * @date    3/02/2014
 | |
|  * @since   5.0.0
 | |
|  *
 | |
|  * @param   array $attrs The array of attrs.
 | |
|  * @return  string
 | |
|  */
 | |
| function acf_select_input( $attrs = array() ) {
 | |
| 	echo acf_get_select_input( $attrs );
 | |
| }
 | |
| 
 | |
| /**
 | |
|  * acf_select_input
 | |
|  *
 | |
|  * Returns the HTML of a select input.
 | |
|  *
 | |
|  * @date    3/02/2014
 | |
|  * @since   5.0.0
 | |
|  *
 | |
|  * @param   array $attrs The array of attrs.
 | |
|  * @return  string
 | |
|  */
 | |
| function acf_get_select_input( $attrs = array() ) {
 | |
| 	$value   = (array) acf_extract_var( $attrs, 'value' );
 | |
| 	$choices = (array) acf_extract_var( $attrs, 'choices' );
 | |
| 	return sprintf(
 | |
| 		'<select %s>%s</select>',
 | |
| 		acf_esc_attrs( $attrs ),
 | |
| 		acf_walk_select_input( $choices, $value )
 | |
| 	);
 | |
| }
 | |
| 
 | |
| /**
 | |
|  * acf_walk_select_input
 | |
|  *
 | |
|  * Returns the HTML of a select input's choices.
 | |
|  *
 | |
|  * @date    27/6/17
 | |
|  * @since   5.6.0
 | |
|  *
 | |
|  * @param   array $choices The choices to walk through.
 | |
|  * @param   array $values The selected choices.
 | |
|  * @param   array $depth The current walk depth.
 | |
|  * @return  string
 | |
|  */
 | |
| function acf_walk_select_input( $choices = array(), $values = array(), $depth = 0 ) {
 | |
| 	$html = '';
 | |
| 
 | |
| 	// Sanitize values for 'selected' matching (only once).
 | |
| 	if ( $depth == 0 ) {
 | |
| 		$values = array_map( 'esc_attr', $values );
 | |
| 	}
 | |
| 
 | |
| 	// Loop over choices and append to html.
 | |
| 	if ( $choices ) {
 | |
| 		foreach ( $choices as $value => $label ) {
 | |
| 
 | |
| 			// Multiple (optgroup)
 | |
| 			if ( is_array( $label ) ) {
 | |
| 				$html .= sprintf(
 | |
| 					'<optgroup label="%s">%s</optgroup>',
 | |
| 					esc_attr( $value ),
 | |
| 					acf_walk_select_input( $label, $values, $depth + 1 )
 | |
| 				);
 | |
| 
 | |
| 				// single (option)
 | |
| 			} else {
 | |
| 				$attrs = array(
 | |
| 					'value' => $value,
 | |
| 				);
 | |
| 
 | |
| 				// If is selected.
 | |
| 				$pos = array_search( esc_attr( $value ), $values );
 | |
| 				if ( $pos !== false ) {
 | |
| 					$attrs['selected'] = 'selected';
 | |
| 					$attrs['data-i']   = $pos;
 | |
| 				}
 | |
| 				$html .= sprintf( '<option %s>%s</option>', acf_esc_attr( $attrs ), esc_html( $label ) );
 | |
| 			}
 | |
| 		}
 | |
| 	}
 | |
| 	return $html;
 | |
| }
 | |
| 
 | |
| /**
 | |
|  * acf_clean_atts
 | |
|  *
 | |
|  * See acf_filter_attrs().
 | |
|  *
 | |
|  * @date    3/10/17
 | |
|  * @since   5.6.3
 | |
|  *
 | |
|  * @param   array $attrs The array of attrs.
 | |
|  * @return  string
 | |
|  */
 | |
| function acf_clean_atts( $attrs ) {
 | |
| 	return acf_filter_attrs( $attrs );
 | |
| }
 | |
| 
 | |
| /**
 | |
|  * acf_esc_atts
 | |
|  *
 | |
|  * See acf_esc_attrs().
 | |
|  *
 | |
|  * @date    27/6/17
 | |
|  * @since   5.6.0
 | |
|  *
 | |
|  * @param   array $attrs The array of attrs.
 | |
|  * @return  string
 | |
|  */
 | |
| function acf_esc_atts( $attrs ) {
 | |
| 	return acf_esc_attrs( $attrs );
 | |
| }
 | |
| 
 | |
| /**
 | |
|  * acf_esc_attr
 | |
|  *
 | |
|  * See acf_esc_attrs().
 | |
|  *
 | |
|  * @date    13/6/19
 | |
|  * @since   5.8.1
 | |
|  * @deprecated  5.6.0
 | |
|  *
 | |
|  * @param   array $attrs The array of attrs.
 | |
|  * @return  string
 | |
|  */
 | |
| function acf_esc_attr( $attrs ) {
 | |
| 	return acf_esc_attrs( $attrs );
 | |
| }
 | |
| 
 | |
| /**
 | |
|  * acf_esc_attr_e
 | |
|  *
 | |
|  * See acf_esc_attrs().
 | |
|  *
 | |
|  * @date    13/6/19
 | |
|  * @since   5.8.1
 | |
|  * @deprecated  5.6.0
 | |
|  *
 | |
|  * @param   array $attrs The array of attrs.
 | |
|  * @return  string
 | |
|  */
 | |
| function acf_esc_attr_e( $attrs ) {
 | |
| 	echo acf_esc_attrs( $attrs );
 | |
| }
 | |
| 
 | |
| /**
 | |
|  * acf_esc_atts_e
 | |
|  *
 | |
|  * See acf_esc_attrs().
 | |
|  *
 | |
|  * @date    13/6/19
 | |
|  * @since   5.8.1
 | |
|  * @deprecated  5.6.0
 | |
|  *
 | |
|  * @param   array $attrs The array of attrs.
 | |
|  * @return  string
 | |
|  */
 | |
| function acf_esc_atts_e( $attrs ) {
 | |
| 	echo acf_esc_attrs( $attrs );
 | |
| }
 |