336 lines
		
	
	
		
			13 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			336 lines
		
	
	
		
			13 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
<?php
 | 
						|
/**
 | 
						|
 * WooCommerce Meta Box Functions
 | 
						|
 *
 | 
						|
 * @author      WooThemes
 | 
						|
 * @category    Core
 | 
						|
 * @package     WooCommerce\Admin\Functions
 | 
						|
 * @version     2.3.0
 | 
						|
 */
 | 
						|
 | 
						|
use Automattic\WooCommerce\Utilities\OrderUtil;
 | 
						|
 | 
						|
if ( ! defined( 'ABSPATH' ) ) {
 | 
						|
	exit; // Exit if accessed directly
 | 
						|
}
 | 
						|
 | 
						|
/**
 | 
						|
 * Output a text input box.
 | 
						|
 *
 | 
						|
 * @param array   $field Field data.
 | 
						|
 * @param WC_Data $data WC_Data object, will be preferred over post object when passed.
 | 
						|
 */
 | 
						|
function woocommerce_wp_text_input( $field, WC_Data $data = null ) {
 | 
						|
	global $post;
 | 
						|
 | 
						|
	$field['placeholder']   = isset( $field['placeholder'] ) ? $field['placeholder'] : '';
 | 
						|
	$field['class']         = isset( $field['class'] ) ? $field['class'] : 'short';
 | 
						|
	$field['style']         = isset( $field['style'] ) ? $field['style'] : '';
 | 
						|
	$field['wrapper_class'] = isset( $field['wrapper_class'] ) ? $field['wrapper_class'] : '';
 | 
						|
	$field['value']         = $field['value'] ?? OrderUtil::get_post_or_object_meta( $post, $data, $field['id'], true );
 | 
						|
	$field['name']          = isset( $field['name'] ) ? $field['name'] : $field['id'];
 | 
						|
	$field['type']          = isset( $field['type'] ) ? $field['type'] : 'text';
 | 
						|
	$field['desc_tip']      = isset( $field['desc_tip'] ) ? $field['desc_tip'] : false;
 | 
						|
	$data_type              = empty( $field['data_type'] ) ? '' : $field['data_type'];
 | 
						|
 | 
						|
	switch ( $data_type ) {
 | 
						|
		case 'price':
 | 
						|
			$field['class'] .= ' wc_input_price';
 | 
						|
			$field['value']  = wc_format_localized_price( $field['value'] );
 | 
						|
			break;
 | 
						|
		case 'decimal':
 | 
						|
			$field['class'] .= ' wc_input_decimal';
 | 
						|
			$field['value']  = wc_format_localized_decimal( $field['value'] );
 | 
						|
			break;
 | 
						|
		case 'stock':
 | 
						|
			$field['class'] .= ' wc_input_stock';
 | 
						|
			$field['value']  = wc_stock_amount( $field['value'] );
 | 
						|
			break;
 | 
						|
		case 'url':
 | 
						|
			$field['class'] .= ' wc_input_url';
 | 
						|
			$field['value']  = esc_url( $field['value'] );
 | 
						|
			break;
 | 
						|
 | 
						|
		default:
 | 
						|
			break;
 | 
						|
	}
 | 
						|
 | 
						|
	// Custom attribute handling
 | 
						|
	$custom_attributes = array();
 | 
						|
 | 
						|
	if ( ! empty( $field['custom_attributes'] ) && is_array( $field['custom_attributes'] ) ) {
 | 
						|
 | 
						|
		foreach ( $field['custom_attributes'] as $attribute => $value ) {
 | 
						|
			$custom_attributes[] = esc_attr( $attribute ) . '="' . esc_attr( $value ) . '"';
 | 
						|
		}
 | 
						|
	}
 | 
						|
 | 
						|
	echo '<p class="form-field ' . esc_attr( $field['id'] ) . '_field ' . esc_attr( $field['wrapper_class'] ) . '">
 | 
						|
		<label for="' . esc_attr( $field['id'] ) . '">' . wp_kses_post( $field['label'] ) . '</label>';
 | 
						|
 | 
						|
	if ( ! empty( $field['description'] ) && false !== $field['desc_tip'] ) {
 | 
						|
		echo wc_help_tip( $field['description'] );
 | 
						|
	}
 | 
						|
 | 
						|
	echo '<input type="' . esc_attr( $field['type'] ) . '" class="' . esc_attr( $field['class'] ) . '" style="' . esc_attr( $field['style'] ) . '" name="' . esc_attr( $field['name'] ) . '" id="' . esc_attr( $field['id'] ) . '" value="' . esc_attr( $field['value'] ) . '" placeholder="' . esc_attr( $field['placeholder'] ) . '" ' . implode( ' ', $custom_attributes ) . ' /> ';
 | 
						|
 | 
						|
	if ( ! empty( $field['description'] ) && false === $field['desc_tip'] ) {
 | 
						|
		echo '<span class="description">' . wp_kses_post( $field['description'] ) . '</span>';
 | 
						|
	}
 | 
						|
 | 
						|
	echo '</p>';
 | 
						|
}
 | 
						|
 | 
						|
/**
 | 
						|
 * Output a hidden input box.
 | 
						|
 *
 | 
						|
 * @param array   $field Field data.
 | 
						|
 * @param WC_Data $data WC_Data object, will be preferred over post object when passed.
 | 
						|
 */
 | 
						|
function woocommerce_wp_hidden_input( $field, WC_Data $data = null ) {
 | 
						|
	global $post;
 | 
						|
 | 
						|
	$field['value'] = isset( $field['value'] ) ? $field['value'] : OrderUtil::get_post_or_object_meta( $post, $data, $field['id'], true );
 | 
						|
	$field['class'] = isset( $field['class'] ) ? $field['class'] : '';
 | 
						|
 | 
						|
	echo '<input type="hidden" class="' . esc_attr( $field['class'] ) . '" name="' . esc_attr( $field['id'] ) . '" id="' . esc_attr( $field['id'] ) . '" value="' . esc_attr( $field['value'] ) . '" /> ';
 | 
						|
}
 | 
						|
 | 
						|
/**
 | 
						|
 * Output a textarea input box.
 | 
						|
 *
 | 
						|
 * @param array   $field Field data.
 | 
						|
 * @param WC_Data $data WC_Data object, will be preferred over post object when passed.
 | 
						|
 */
 | 
						|
function woocommerce_wp_textarea_input( $field, WC_Data $data = null ) {
 | 
						|
	global $post;
 | 
						|
 | 
						|
	$field['placeholder']   = isset( $field['placeholder'] ) ? $field['placeholder'] : '';
 | 
						|
	$field['class']         = isset( $field['class'] ) ? $field['class'] : 'short';
 | 
						|
	$field['style']         = isset( $field['style'] ) ? $field['style'] : '';
 | 
						|
	$field['wrapper_class'] = isset( $field['wrapper_class'] ) ? $field['wrapper_class'] : '';
 | 
						|
	$field['value']         = $field['value'] ?? OrderUtil::get_post_or_object_meta( $post, $data, $field['id'], true );
 | 
						|
	$field['desc_tip']      = isset( $field['desc_tip'] ) ? $field['desc_tip'] : false;
 | 
						|
	$field['name']          = isset( $field['name'] ) ? $field['name'] : $field['id'];
 | 
						|
	$field['rows']          = isset( $field['rows'] ) ? $field['rows'] : 2;
 | 
						|
	$field['cols']          = isset( $field['cols'] ) ? $field['cols'] : 20;
 | 
						|
 | 
						|
	// Custom attribute handling
 | 
						|
	$custom_attributes = array();
 | 
						|
 | 
						|
	if ( ! empty( $field['custom_attributes'] ) && is_array( $field['custom_attributes'] ) ) {
 | 
						|
 | 
						|
		foreach ( $field['custom_attributes'] as $attribute => $value ) {
 | 
						|
			$custom_attributes[] = esc_attr( $attribute ) . '="' . esc_attr( $value ) . '"';
 | 
						|
		}
 | 
						|
	}
 | 
						|
 | 
						|
	echo '<p class="form-field ' . esc_attr( $field['id'] ) . '_field ' . esc_attr( $field['wrapper_class'] ) . '">
 | 
						|
		<label for="' . esc_attr( $field['id'] ) . '">' . wp_kses_post( $field['label'] ) . '</label>';
 | 
						|
 | 
						|
	if ( ! empty( $field['description'] ) && false !== $field['desc_tip'] ) {
 | 
						|
		echo wc_help_tip( $field['description'] );
 | 
						|
	}
 | 
						|
 | 
						|
	echo '<textarea class="' . esc_attr( $field['class'] ) . '" style="' . esc_attr( $field['style'] ) . '"  name="' . esc_attr( $field['name'] ) . '" id="' . esc_attr( $field['id'] ) . '" placeholder="' . esc_attr( $field['placeholder'] ) . '" rows="' . esc_attr( $field['rows'] ) . '" cols="' . esc_attr( $field['cols'] ) . '" ' . implode( ' ', $custom_attributes ) . '>' . esc_textarea( $field['value'] ) . '</textarea> ';
 | 
						|
 | 
						|
	if ( ! empty( $field['description'] ) && false === $field['desc_tip'] ) {
 | 
						|
		echo '<span class="description">' . wp_kses_post( $field['description'] ) . '</span>';
 | 
						|
	}
 | 
						|
 | 
						|
	echo '</p>';
 | 
						|
}
 | 
						|
 | 
						|
/**
 | 
						|
 * Output a checkbox input box.
 | 
						|
 *
 | 
						|
 * @param array   $field Field data.
 | 
						|
 * @param WC_Data $data WC_Data object, will be preferred over post object when passed.
 | 
						|
 */
 | 
						|
function woocommerce_wp_checkbox( $field, WC_Data $data = null ) {
 | 
						|
	global $post;
 | 
						|
 | 
						|
	$field['class']         = isset( $field['class'] ) ? $field['class'] : 'checkbox';
 | 
						|
	$field['style']         = isset( $field['style'] ) ? $field['style'] : '';
 | 
						|
	$field['wrapper_class'] = isset( $field['wrapper_class'] ) ? $field['wrapper_class'] : '';
 | 
						|
	$field['value']         = $field['value'] ?? OrderUtil::get_post_or_object_meta( $post, $data, $field['id'], true );
 | 
						|
	$field['cbvalue']       = isset( $field['cbvalue'] ) ? $field['cbvalue'] : 'yes';
 | 
						|
	$field['name']          = isset( $field['name'] ) ? $field['name'] : $field['id'];
 | 
						|
	$field['desc_tip']      = isset( $field['desc_tip'] ) ? $field['desc_tip'] : false;
 | 
						|
 | 
						|
	/**
 | 
						|
	 * These values are what get passed vis $_POST depending on if the field is checked or not. If no unchecked_value is
 | 
						|
	 * provided, the $_POST will not be set. This maintains backwards compatibility where consumers would use `isset`.
 | 
						|
	 */
 | 
						|
	$field['checked_value']   = isset( $field['checked_value'] ) ? $field['checked_value'] : $field['cbvalue'];
 | 
						|
	$field['unchecked_value'] = isset( $field['unchecked_value'] ) ? $field['unchecked_value'] : null;
 | 
						|
 | 
						|
	// Custom attribute handling.
 | 
						|
	$custom_attributes = array();
 | 
						|
 | 
						|
	if ( ! empty( $field['custom_attributes'] ) && is_array( $field['custom_attributes'] ) ) {
 | 
						|
 | 
						|
		foreach ( $field['custom_attributes'] as $attribute => $value ) {
 | 
						|
			$custom_attributes[] = esc_attr( $attribute ) . '="' . esc_attr( $value ) . '"';
 | 
						|
		}
 | 
						|
	}
 | 
						|
 | 
						|
	if ( ! empty( $field['style'] ) ) {
 | 
						|
		$custom_attributes[] = 'style="' . esc_attr( $field['style'] ) . '"';
 | 
						|
	}
 | 
						|
 | 
						|
	if ( ! empty( $field['class'] ) ) {
 | 
						|
		$custom_attributes[] = 'class="' . esc_attr( $field['class'] ) . '"';
 | 
						|
	}
 | 
						|
 | 
						|
	echo '<p class="form-field ' . esc_attr( $field['id'] ) . '_field ' . esc_attr( $field['wrapper_class'] ) . '">
 | 
						|
		<label for="' . esc_attr( $field['id'] ) . '">' . wp_kses_post( $field['label'] ) . '</label>';
 | 
						|
 | 
						|
	if ( ! empty( $field['description'] ) && false !== $field['desc_tip'] ) {
 | 
						|
		echo wc_help_tip( $field['description'] );
 | 
						|
	}
 | 
						|
 | 
						|
	// Output a hidden field so a value is POSTed if the box is not checked.
 | 
						|
	if ( ! is_null( $field['unchecked_value'] ) ) {
 | 
						|
		printf( '<input type="hidden" name="%1$s" value="%2$s" />', esc_attr( $field['name'] ), esc_attr( $field['unchecked_value'] ) );
 | 
						|
	}
 | 
						|
 | 
						|
	printf(
 | 
						|
		'<input type="checkbox" name="%1$s" id="%2$s" value="%3$s" %4$s %5$s />',
 | 
						|
		esc_attr( $field['name'] ),
 | 
						|
		esc_attr( $field['id'] ),
 | 
						|
		esc_attr( $field['checked_value'] ),
 | 
						|
		checked( $field['value'], $field['checked_value'], false ),
 | 
						|
		implode( ' ', $custom_attributes ) // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
 | 
						|
	);
 | 
						|
 | 
						|
	if ( ! empty( $field['description'] ) && false === $field['desc_tip'] ) {
 | 
						|
		echo '<span class="description">' . wp_kses_post( $field['description'] ) . '</span>';
 | 
						|
	}
 | 
						|
 | 
						|
	echo '</p>';
 | 
						|
}
 | 
						|
 | 
						|
/**
 | 
						|
 * Output a select input box.
 | 
						|
 *
 | 
						|
 * @param array   $field Field data.
 | 
						|
 * @param WC_Data $data WC_Data object, will be preferred over post object when passed.
 | 
						|
 */
 | 
						|
function woocommerce_wp_select( $field, WC_Data $data = null ) {
 | 
						|
	global $post;
 | 
						|
 | 
						|
	$field = wp_parse_args(
 | 
						|
		$field,
 | 
						|
		array(
 | 
						|
			'class'             => 'select short',
 | 
						|
			'style'             => '',
 | 
						|
			'wrapper_class'     => '',
 | 
						|
			'value'             => OrderUtil::get_post_or_object_meta( $post, $data, $field['id'], true ),
 | 
						|
			'name'              => $field['id'],
 | 
						|
			'desc_tip'          => false,
 | 
						|
			'custom_attributes' => array(),
 | 
						|
		)
 | 
						|
	);
 | 
						|
 | 
						|
	$wrapper_attributes = array(
 | 
						|
		'class' => $field['wrapper_class'] . " form-field {$field['id']}_field",
 | 
						|
	);
 | 
						|
 | 
						|
	$label_attributes = array(
 | 
						|
		'for' => $field['id'],
 | 
						|
	);
 | 
						|
 | 
						|
	$field_attributes          = (array) $field['custom_attributes'];
 | 
						|
	$field_attributes['style'] = $field['style'];
 | 
						|
	$field_attributes['id']    = $field['id'];
 | 
						|
	$field_attributes['name']  = $field['name'];
 | 
						|
	$field_attributes['class'] = $field['class'];
 | 
						|
 | 
						|
	$tooltip     = ! empty( $field['description'] ) && false !== $field['desc_tip'] ? $field['description'] : '';
 | 
						|
	$description = ! empty( $field['description'] ) && false === $field['desc_tip'] ? $field['description'] : '';
 | 
						|
	?>
 | 
						|
	<p <?php echo wc_implode_html_attributes( $wrapper_attributes ); // WPCS: XSS ok. ?>>
 | 
						|
		<label <?php echo wc_implode_html_attributes( $label_attributes ); // WPCS: XSS ok. ?>><?php echo wp_kses_post( $field['label'] ); ?></label>
 | 
						|
		<?php if ( $tooltip ) : ?>
 | 
						|
			<?php echo wc_help_tip( $tooltip ); // WPCS: XSS ok. ?>
 | 
						|
		<?php endif; ?>
 | 
						|
		<select <?php echo wc_implode_html_attributes( $field_attributes ); // WPCS: XSS ok. ?>>
 | 
						|
			<?php
 | 
						|
			foreach ( $field['options'] as $key => $value ) {
 | 
						|
				echo '<option value="' . esc_attr( $key ) . '"' . wc_selected( $key, $field['value'] ) . '>' . esc_html( $value ) . '</option>';
 | 
						|
			}
 | 
						|
			?>
 | 
						|
		</select>
 | 
						|
		<?php if ( $description ) : ?>
 | 
						|
			<span class="description"><?php echo wp_kses_post( $description ); ?></span>
 | 
						|
		<?php endif; ?>
 | 
						|
	</p>
 | 
						|
	<?php
 | 
						|
}
 | 
						|
 | 
						|
/**
 | 
						|
 * Output a radio input box.
 | 
						|
 *
 | 
						|
 * @param array   $field Field data.
 | 
						|
 * @param WC_Data $data WC_Data object, will be preferred over post object when passed.
 | 
						|
 */
 | 
						|
function woocommerce_wp_radio( $field, WC_Data $data = null ) {
 | 
						|
	global $post;
 | 
						|
 | 
						|
	$field['class']         = isset( $field['class'] ) ? $field['class'] : 'select short';
 | 
						|
	$field['style']         = isset( $field['style'] ) ? $field['style'] : '';
 | 
						|
	$field['wrapper_class'] = isset( $field['wrapper_class'] ) ? $field['wrapper_class'] : '';
 | 
						|
	$field['value']         = $field['value'] ?? OrderUtil::get_post_or_object_meta( $post, $data, $field['id'], true );
 | 
						|
	$field['name']          = isset( $field['name'] ) ? $field['name'] : $field['id'];
 | 
						|
	$field['desc_tip']      = isset( $field['desc_tip'] ) ? $field['desc_tip'] : false;
 | 
						|
 | 
						|
	echo '<fieldset class="form-field ' . esc_attr( $field['id'] ) . '_field ' . esc_attr( $field['wrapper_class'] ) . '"><legend>' . wp_kses_post( $field['label'] ) . '</legend>';
 | 
						|
 | 
						|
	if ( ! empty( $field['description'] ) && false !== $field['desc_tip'] ) {
 | 
						|
		echo wc_help_tip( $field['description'] );
 | 
						|
	}
 | 
						|
 | 
						|
	echo '<ul class="wc-radios">';
 | 
						|
 | 
						|
	foreach ( $field['options'] as $key => $value ) {
 | 
						|
 | 
						|
		echo '<li><label><input
 | 
						|
				name="' . esc_attr( $field['name'] ) . '"
 | 
						|
				value="' . esc_attr( $key ) . '"
 | 
						|
				type="radio"
 | 
						|
				class="' . esc_attr( $field['class'] ) . '"
 | 
						|
				style="' . esc_attr( $field['style'] ) . '"
 | 
						|
				' . checked( esc_attr( $field['value'] ), esc_attr( $key ), false ) . '
 | 
						|
				/> ' . esc_html( $value ) . '</label>
 | 
						|
		</li>';
 | 
						|
	}
 | 
						|
	echo '</ul>';
 | 
						|
 | 
						|
	if ( ! empty( $field['description'] ) && false === $field['desc_tip'] ) {
 | 
						|
		echo '<span class="description">' . wp_kses_post( $field['description'] ) . '</span>';
 | 
						|
	}
 | 
						|
 | 
						|
	echo '</fieldset>';
 | 
						|
}
 | 
						|
 | 
						|
/**
 | 
						|
 * Output a note.
 | 
						|
 *
 | 
						|
 * @param array $field Field data.
 | 
						|
 */
 | 
						|
function woocommerce_wp_note( $field ) {
 | 
						|
	$field['wrapper_class'] = isset( $field['wrapper_class'] ) ? $field['wrapper_class'] : '';
 | 
						|
 | 
						|
	echo '<p class="form-field ' . esc_attr( $field['wrapper_class'] ) . '">';
 | 
						|
	echo '<label for="' . esc_attr( $field['id'] ) . '" ';
 | 
						|
 | 
						|
	if ( ! empty( $field['label-aria-label'] ) ) {
 | 
						|
		echo 'aria-label="' . esc_attr( $field['label-aria-label'] ) . '"';
 | 
						|
	}
 | 
						|
 | 
						|
	echo '>' . esc_attr( $field['label'] ) . '</label>';
 | 
						|
	echo '<output name="' . esc_attr( $field['id'] ) . '" id="' . esc_attr( $field['id'] ) . '" aria-live="off">' . wp_kses_post( $field['message'] ) . '</output>';
 | 
						|
	echo '</p>';
 | 
						|
}
 |