WordPress как на ладони
rgbcode is looking for WordPress developers.

woocommerce_form_field()WC 1.0

Используется для создания полей формы на страницах оформления заказа и редактирования адреса доставки и оплаты.

Можно использовать и в других местах, например в админ панели.

Возвращает

Строку. В зависимости от параметра return выводит или возвращает html код поля формы.

Использование

woocommerce_form_field( $key, $args, $value );
$key(строка) (обязательный)
Имя поля и ID если параметр ID не заполнен в массиве $args.
$args(массив) (обязательный)
Массив аргументов поля.
$value(строка)
Значение поля по умолчанию.
По умолчанию: null

Параметры массива $args

Значения по умолчанию:

$defaults = [
	'type'              => 'text',
	'label'             => '',
	'description'       => '',
	'placeholder'       => '',
	'maxlength'         => false,
	'required'          => false,
	'autocomplete'      => false,
	'id'                => $key,
	'class'             => array(),
	'label_class'       => array(),
	'input_class'       => array(),
	'return'            => false,
	'options'           => array(),
	'custom_attributes' => array(),
	'validate'          => array(),
	'default'           => '',
	'autofocus'         => '',
	'priority'          => '',
];
type(строка)

Тип поля. Возможные варианты:

text
select
radio
password
datetime
datetime-local
date
month
time
week
number
email
url
tel
country          – раскрывающийся список стран, поддерживаемых вашим магазином, которые задаются в настройках WooCommerce.
state

По умолчанию: text

country(строка)
Используется только для типа поля state. Имя страны из настроек WooCommerce. Если поле пропущено, функция будет пытаться получить значение страны выставления счета или доставки.
По умолчанию: ''
label(строк)
Метка поля
По умолчанию: ''
description(строка)
Описание поля которое будет отображаться под полем ( так же поддерживаться html)
По умолчанию: ''
placeholder(строка)
Текст подсказки
По умолчанию: ''
maxlength(число)
Максимальное количество разрешенных символов в тексте
По умолчанию: false
required(логический)
Добавляет звездочку рядом с меткой
Пример: <abbr class="required" title="required">*</abbr>
По умолчанию: ''
autocomplete(строка)
Включает или отключает автозаполнение. Возможные корректные значения on или off
По умолчанию: ''
id(строка)
ID поля, по умолчанию берется из значения имени поля переданного первым аргументом функции
По умолчанию: $key
class(массив)
Классы для контейнера создаваемого блока
По умолчанию: array()
label_class(массив)
Класс для тега
По умолчанию: array()
input_class(массив)
Класс для поля
По умолчанию: array()
return(логический)
Вывести или вернуть созданное поле
По умолчанию: false
options(массив)
Только для типа <select> и radio.
Пример: ['' => 'Select...', 'value_1' => 'Text']
По умолчанию: array()
custom_attributes(массив)
Ассоциативный массив атрибутов для поля <input>.
Пример: ['data-value' => 'test']
По умолчанию: array()
validate(массив)

Параметр добавляет класс для обертки поля validate-{любое значение}, который будет использоваться при проверке JS, например validate-email будет проверять адреса электронной почты.

validate-email является единственным заранее определенным классом проверки.

По умолчанию: array()

default(строка)
Значение поля по умолчанию
По умолчанию: ''
autofocus(логический)
Автоматическое наведение на поле формы, если полей с автофокусом много наведение произойдет на первое поле из списка
По умолчанию: ''
priority(число)
Приоритет отображения поля
По умолчанию: ''

Примеры

3

#1 Выведем количество заказов товара на странице редактирования товара

add_action( 'woocommerce_product_options_general_product_data', 'woo_add_sale_fields_to_general' );
// Выведем количество продаж товара на главной вкладке редактирования товара
function woo_add_sale_fields_to_general() {
	global $woocommerce, $post;
	echo '<div class="options_group">';
	woocommerce_form_field( 'total_sales', [
			'type'        => 'number',
			'id'          => 'total_sales',
			'label'       => __( 'Sales', 'woocommerce' ),
			'placeholder' => '',
			'description' => __( 'All product sales, your can change it', 'woocommerce' ),
			'default'     => get_post_meta( $post->ID, 'total_sales', true ),
			'class'       => ['form-field'],
			'input_class' => ['short'],
		] );
	echo '</div>';
}

add_action( 'woocommerce_process_product_meta', 'woo_sale_fields_save' );
// Сохраним значение поля
function woo_sale_fields_save( $post_id ) {

	if( ! empty( $_POST['total_sales'] ) ) {
		update_post_meta( $post_id, 'total_sales', sanitize_text_field( $_POST['total_sales'] ) );
	}

}
1

#2 Добавим поле подписки после примечания на странице оформления заказа

add_action( 'woocommerce_after_order_notes', 'add_subscribe_checkbox' );
// Добавим новое поле после примечания к заказу
function add_subscribe_checkbox( $checkout ) {

	woocommerce_form_field( 'subscribed', [
		'type'  => 'checkbox',
		'class' => ['subscribe-field'],
		'label' => __( 'Subscribe to our newsletter.' ),
	], $checkout->get_value( 'subscribed' ) );

}

add_action( 'woocommerce_checkout_update_order_meta', 'save_subscribe_field' );
// сохраним поле
function save_subscribe_field( $order_id ) {

	if( ! empty( $_POST['subscribed'] ) && $_POST['subscribed'] == 1 ) {
		update_post_meta( $order_id, 'subscribed', 1 );
	}

}

Код woocommerce_form_field() WC 8.6.1

function woocommerce_form_field( $key, $args, $value = null ) {
	$defaults = array(
		'type'              => 'text',
		'label'             => '',
		'description'       => '',
		'placeholder'       => '',
		'maxlength'         => false,
		'minlength'         => false,
		'required'          => false,
		'autocomplete'      => false,
		'id'                => $key,
		'class'             => array(),
		'label_class'       => array(),
		'input_class'       => array(),
		'return'            => false,
		'options'           => array(),
		'custom_attributes' => array(),
		'validate'          => array(),
		'default'           => '',
		'autofocus'         => '',
		'priority'          => '',
	);

	$args = wp_parse_args( $args, $defaults );
	$args = apply_filters( 'woocommerce_form_field_args', $args, $key, $value );

	if ( is_string( $args['class'] ) ) {
		$args['class'] = array( $args['class'] );
	}

	if ( $args['required'] ) {
		$args['class'][] = 'validate-required';
		$required        = '&nbsp;<abbr class="required" title="' . esc_attr__( 'required', 'woocommerce' ) . '">*</abbr>';
	} else {
		$required = '&nbsp;<span class="optional">(' . esc_html__( 'optional', 'woocommerce' ) . ')</span>';
	}

	if ( is_string( $args['label_class'] ) ) {
		$args['label_class'] = array( $args['label_class'] );
	}

	if ( is_null( $value ) ) {
		$value = $args['default'];
	}

	// Custom attribute handling.
	$custom_attributes         = array();
	$args['custom_attributes'] = array_filter( (array) $args['custom_attributes'], 'strlen' );

	if ( $args['maxlength'] ) {
		$args['custom_attributes']['maxlength'] = absint( $args['maxlength'] );
	}

	if ( $args['minlength'] ) {
		$args['custom_attributes']['minlength'] = absint( $args['minlength'] );
	}

	if ( ! empty( $args['autocomplete'] ) ) {
		$args['custom_attributes']['autocomplete'] = $args['autocomplete'];
	}

	if ( true === $args['autofocus'] ) {
		$args['custom_attributes']['autofocus'] = 'autofocus';
	}

	if ( $args['description'] ) {
		$args['custom_attributes']['aria-describedby'] = $args['id'] . '-description';
	}

	if ( ! empty( $args['custom_attributes'] ) && is_array( $args['custom_attributes'] ) ) {
		foreach ( $args['custom_attributes'] as $attribute => $attribute_value ) {
			$custom_attributes[] = esc_attr( $attribute ) . '="' . esc_attr( $attribute_value ) . '"';
		}
	}

	if ( ! empty( $args['validate'] ) ) {
		foreach ( $args['validate'] as $validate ) {
			$args['class'][] = 'validate-' . $validate;
		}
	}

	$field           = '';
	$label_id        = $args['id'];
	$sort            = $args['priority'] ? $args['priority'] : '';
	$field_container = '<p class="form-row %1$s" id="%2$s" data-priority="' . esc_attr( $sort ) . '">%3$s</p>';

	switch ( $args['type'] ) {
		case 'country':
			$countries = 'shipping_country' === $key ? WC()->countries->get_shipping_countries() : WC()->countries->get_allowed_countries();

			if ( 1 === count( $countries ) ) {

				$field .= '<strong>' . current( array_values( $countries ) ) . '</strong>';

				$field .= '<input type="hidden" name="' . esc_attr( $key ) . '" id="' . esc_attr( $args['id'] ) . '" value="' . current( array_keys( $countries ) ) . '" ' . implode( ' ', $custom_attributes ) . ' class="country_to_state" readonly="readonly" />';

			} else {
				$data_label = ! empty( $args['label'] ) ? 'data-label="' . esc_attr( $args['label'] ) . '"' : '';

				$field = '<select name="' . esc_attr( $key ) . '" id="' . esc_attr( $args['id'] ) . '" class="country_to_state country_select ' . esc_attr( implode( ' ', $args['input_class'] ) ) . '" ' . implode( ' ', $custom_attributes ) . ' data-placeholder="' . esc_attr( $args['placeholder'] ? $args['placeholder'] : esc_attr__( 'Select a country / region&hellip;', 'woocommerce' ) ) . '" ' . $data_label . '><option value="">' . esc_html__( 'Select a country / region&hellip;', 'woocommerce' ) . '</option>';

				foreach ( $countries as $ckey => $cvalue ) {
					$field .= '<option value="' . esc_attr( $ckey ) . '" ' . selected( $value, $ckey, false ) . '>' . esc_html( $cvalue ) . '</option>';
				}

				$field .= '</select>';

				$field .= '<noscript><button type="submit" name="woocommerce_checkout_update_totals" value="' . esc_attr__( 'Update country / region', 'woocommerce' ) . '">' . esc_html__( 'Update country / region', 'woocommerce' ) . '</button></noscript>';

			}

			break;
		case 'state':
			/* Get country this state field is representing */
			$for_country = isset( $args['country'] ) ? $args['country'] : WC()->checkout->get_value( 'billing_state' === $key ? 'billing_country' : 'shipping_country' );
			$states      = WC()->countries->get_states( $for_country );

			if ( is_array( $states ) && empty( $states ) ) {

				$field_container = '<p class="form-row %1$s" id="%2$s" style="display: none">%3$s</p>';

				$field .= '<input type="hidden" class="hidden" name="' . esc_attr( $key ) . '" id="' . esc_attr( $args['id'] ) . '" value="" ' . implode( ' ', $custom_attributes ) . ' placeholder="' . esc_attr( $args['placeholder'] ) . '" readonly="readonly" data-input-classes="' . esc_attr( implode( ' ', $args['input_class'] ) ) . '"/>';

			} elseif ( ! is_null( $for_country ) && is_array( $states ) ) {
				$data_label = ! empty( $args['label'] ) ? 'data-label="' . esc_attr( $args['label'] ) . '"' : '';

				$field .= '<select name="' . esc_attr( $key ) . '" id="' . esc_attr( $args['id'] ) . '" class="state_select ' . esc_attr( implode( ' ', $args['input_class'] ) ) . '" ' . implode( ' ', $custom_attributes ) . ' data-placeholder="' . esc_attr( $args['placeholder'] ? $args['placeholder'] : esc_html__( 'Select an option&hellip;', 'woocommerce' ) ) . '"  data-input-classes="' . esc_attr( implode( ' ', $args['input_class'] ) ) . '" ' . $data_label . '>
					<option value="">' . esc_html__( 'Select an option&hellip;', 'woocommerce' ) . '</option>';

				foreach ( $states as $ckey => $cvalue ) {
					$field .= '<option value="' . esc_attr( $ckey ) . '" ' . selected( $value, $ckey, false ) . '>' . esc_html( $cvalue ) . '</option>';
				}

				$field .= '</select>';

			} else {

				$field .= '<input type="text" class="input-text ' . esc_attr( implode( ' ', $args['input_class'] ) ) . '" value="' . esc_attr( $value ) . '"  placeholder="' . esc_attr( $args['placeholder'] ) . '" name="' . esc_attr( $key ) . '" id="' . esc_attr( $args['id'] ) . '" ' . implode( ' ', $custom_attributes ) . ' data-input-classes="' . esc_attr( implode( ' ', $args['input_class'] ) ) . '"/>';

			}

			break;
		case 'textarea':
			$field .= '<textarea name="' . esc_attr( $key ) . '" class="input-text ' . esc_attr( implode( ' ', $args['input_class'] ) ) . '" id="' . esc_attr( $args['id'] ) . '" placeholder="' . esc_attr( $args['placeholder'] ) . '" ' . ( empty( $args['custom_attributes']['rows'] ) ? ' rows="2"' : '' ) . ( empty( $args['custom_attributes']['cols'] ) ? ' cols="5"' : '' ) . implode( ' ', $custom_attributes ) . '>' . esc_textarea( $value ) . '</textarea>';

			break;
		case 'checkbox':
			$field = '<label class="checkbox ' . implode( ' ', $args['label_class'] ) . '" ' . implode( ' ', $custom_attributes ) . '>
					<input type="' . esc_attr( $args['type'] ) . '" class="input-checkbox ' . esc_attr( implode( ' ', $args['input_class'] ) ) . '" name="' . esc_attr( $key ) . '" id="' . esc_attr( $args['id'] ) . '" value="1" ' . checked( $value, 1, false ) . ' /> ' . $args['label'] . $required . '</label>';

			break;
		case 'text':
		case 'password':
		case 'datetime':
		case 'datetime-local':
		case 'date':
		case 'month':
		case 'time':
		case 'week':
		case 'number':
		case 'email':
		case 'url':
		case 'tel':
			$field .= '<input type="' . esc_attr( $args['type'] ) . '" class="input-text ' . esc_attr( implode( ' ', $args['input_class'] ) ) . '" name="' . esc_attr( $key ) . '" id="' . esc_attr( $args['id'] ) . '" placeholder="' . esc_attr( $args['placeholder'] ) . '"  value="' . esc_attr( $value ) . '" ' . implode( ' ', $custom_attributes ) . ' />';

			break;
		case 'hidden':
			$field .= '<input type="' . esc_attr( $args['type'] ) . '" class="input-hidden ' . esc_attr( implode( ' ', $args['input_class'] ) ) . '" name="' . esc_attr( $key ) . '" id="' . esc_attr( $args['id'] ) . '" value="' . esc_attr( $value ) . '" ' . implode( ' ', $custom_attributes ) . ' />';

			break;
		case 'select':
			$field   = '';
			$options = '';

			if ( ! empty( $args['options'] ) ) {
				foreach ( $args['options'] as $option_key => $option_text ) {
					if ( '' === $option_key ) {
						// If we have a blank option, select2 needs a placeholder.
						if ( empty( $args['placeholder'] ) ) {
							$args['placeholder'] = $option_text ? $option_text : __( 'Choose an option', 'woocommerce' );
						}
						$custom_attributes[] = 'data-allow_clear="true"';
					}
					$options .= '<option value="' . esc_attr( $option_key ) . '" ' . selected( $value, $option_key, false ) . '>' . esc_html( $option_text ) . '</option>';
				}

				$field .= '<select name="' . esc_attr( $key ) . '" id="' . esc_attr( $args['id'] ) . '" class="select ' . esc_attr( implode( ' ', $args['input_class'] ) ) . '" ' . implode( ' ', $custom_attributes ) . ' data-placeholder="' . esc_attr( $args['placeholder'] ) . '">
						' . $options . '
					</select>';
			}

			break;
		case 'radio':
			$label_id .= '_' . current( array_keys( $args['options'] ) );

			if ( ! empty( $args['options'] ) ) {
				foreach ( $args['options'] as $option_key => $option_text ) {
					$field .= '<input type="radio" class="input-radio ' . esc_attr( implode( ' ', $args['input_class'] ) ) . '" value="' . esc_attr( $option_key ) . '" name="' . esc_attr( $key ) . '" ' . implode( ' ', $custom_attributes ) . ' id="' . esc_attr( $args['id'] ) . '_' . esc_attr( $option_key ) . '"' . checked( $value, $option_key, false ) . ' />';
					$field .= '<label for="' . esc_attr( $args['id'] ) . '_' . esc_attr( $option_key ) . '" class="radio ' . implode( ' ', $args['label_class'] ) . '">' . esc_html( $option_text ) . '</label>';
				}
			}

			break;
	}

	if ( ! empty( $field ) ) {
		$field_html = '';

		if ( $args['label'] && 'checkbox' !== $args['type'] ) {
			$field_html .= '<label for="' . esc_attr( $label_id ) . '" class="' . esc_attr( implode( ' ', $args['label_class'] ) ) . '">' . wp_kses_post( $args['label'] ) . $required . '</label>';
		}

		$field_html .= '<span class="woocommerce-input-wrapper">' . $field;

		if ( $args['description'] ) {
			$field_html .= '<span class="description" id="' . esc_attr( $args['id'] ) . '-description" aria-hidden="true">' . wp_kses_post( $args['description'] ) . '</span>';
		}

		$field_html .= '</span>';

		$container_class = esc_attr( implode( ' ', $args['class'] ) );
		$container_id    = esc_attr( $args['id'] ) . '_field';
		$field           = sprintf( $field_container, $container_class, $container_id, $field_html );
	}

	/**
	 * Filter by type.
	 */
	$field = apply_filters( 'woocommerce_form_field_' . $args['type'], $field, $key, $args, $value );

	/**
	 * General filter on form fields.
	 *
	 * @since 3.4.0
	 */
	$field = apply_filters( 'woocommerce_form_field', $field, $key, $args, $value );

	if ( $args['return'] ) {
		return $field;
	} else {
		// phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
		echo $field;
	}
}
Glum 697
Редакторы: Kama 9599, campusboy 4735
3 комментария
    Войти