WordPress как на ладони
Недорогой хостинг для сайтов на WordPress: wordpress.jino.ru Хостинг, VPS/VDS и отдельные сервера только на SSD дисках. 7 дней бесплатного тестирования.

Smart Custom Fields

Простой бесплатный плагин для управления произвольными полями.

Плагин поддерживает 13 самых распространённых видов полей и подойдёт для решения простых задач, когда нет смысла ставить такие комбайны, как Advanced Custom Fields, Meta Box или Carbon Fields.

SCM позволяет создавать повторяемые поля, а также произвольные страницы настроек - и всё это бесплатно.

Создавать метабоксы с произвольными полями можно как с помощью визуального интерфейса в админке, так и программно с помощью кода.

Для ревизий плагин дублирует метаданные, то есть при сохранении статьи все произвольные поля сохраняются и для создаваемой ревизии. Это отличает плагин от аналогов.

В статье рассматривается плагин Smart Custom Fields версии 3.1.7.

Не знаете, что такое произвольные поля и зачем они нужны? Читайте статью "Метаданные в WordPress"!

Регистрация метабоксов и полей

Smart Custom Fields предоставляет два способа создания метабоксов с полями, у каждого из них свои плюсы и минусы.

Каждое поле или группу полей можно сделать повторяемым (клонируемым), отметив их специальным флажком.

Визуально

После активации плагина в админке появляется пункт меню Smart Custom Fields, где можно создать бесконечное количество метабоксов и полей в них с помощью мышки, поэтому этот способ является самым доступным для большинства пользователей.

Добавление полей в админке
Заполнение полей при редактировании записи
меню

Код

Создавать метабоксы и поля можно без визуального интерфейса с помощью кода. Для тех, кто умеет работать с кодом этот вариант может быть приоритетным, так как позволяет:

  • В некоторых случаях быстрее изменять метабоксы/поля;
  • Использовать разнообразную логику отображения, не доступную в визуальном интерфейсе (к примеру, показывать метабокс только администраторам сайта);
  • Не хранить в базе конфигурацию метабоксов/полей.

По умолчанию регистрация полей происходит на фильтре smart-cf-register-fields:

// Регистрация метабоксов и произвольных полей.
function my_register_fields( $settings, $type, $id, $meta_type, $types ) {

	// Отображаем поля только на странице редактирования Записи
	if ( $type === 'post' ) {

		// Создаем блок настроек (метабокс).
		$Setting = SCF::add_setting( 'id-my-post', 'Настройки записи' );

		// Добавляем в метабокс произвольные поля.
		$Setting->add_group(
			// ID группы полей.
			'group-name-1',
			// Повторяемая группа полей? Да - true, Нет - false.
			false,
			// Массив полей.
			array(
				// Текстовое поле "Настроение"
				array(
					'name'        => 'field-1',
					'label'       => 'Настроение',
					'type'        => 'text',
					'instruction' => 'Какое настроение у Вас было при написании статьи?',
				),
				// Область текста "Почему?"
				array(
					'name'        => 'field-2',
					'label'       => 'Почему?',
					'type'        => 'textarea',
					'instruction' => 'Почему именно такое настроение?',
				),
			) );

		// Добавляем информацию о наших полях в общий массив.
		$settings[] = $Setting;
	}

	// Обязательно возвращаем данные.
	return $settings;
}

add_filter( 'smart-cf-register-fields', 'my_register_fields', 10, 5 );

На странице редактирования записи появится метабокс:

меню

Условия отображения метабоксов

Smart Custom Fields позволяет создавать метабоксы на странице редактирования записей, терминов, профилей пользователей и произвольных страниц настроек.

меню

Типы полей

Smart Custom Fields поддерживает 12 типов полей, что достаточно для решения простых задач. Каждое поле имеет общие свойства:

Тип (обязательный)
Выпадающий список с выбором типа поля (текст, изображение и так далее).
Ключ (обязательный)
Ключ определяет под каким именем будет храниться метаданные в базе данных.
Имя
Заголовок поля при отображении поля в админке.
Значение по умолчанию
Значение, которые сразу будет подставлено при отображении поля. Если поле заполнить, то не учитывается.
Инструкция
Текст, который будет отображаться перед полем.
Заметки
Текст, который будет отображаться после поля.

Ниже вы найдёте список из типов полей и их индивидуальных свойств.

меню

Текст

Обычное текстовое поле <input type="text">.

Пример создания простого текстового поля
Пример отображения только что созданного поля на странице редактирования записи

Регистрация поля через код:

array(
	'type'        => 'text', // Тип поля. Обязательный.
	'name'        => 'field_name', // Ключ поля. Обязательный.
	'label'       => 'Простое текстовое поле', // Заголовок поля.
	'default'     => '', // Значение по умолчанию.
	'instruction' => '', // Текст над полем.
	'notes'       => '', // Текст под полем.
),
меню

Область текста

Область текста <textarea> используется для вставки многострочного текста.

Создание поля textarea
Поле textarea в метабоксе

К списку общих свойств добавлены следующие свойства:

Строки
Высота поля в строках. Минимум 3.

Регистрация поля через код:

array(
	'type'        => 'textarea', // Тип поля. Обязательный.
	'name'        => 'field_name', // Ключ поля. Обязательный.
	'label'       => 'Область текста', // Заголовок поля.
	'rows'        => 5, // Количество строк. По умолчанию 5.
	'default'     => '', // Значение по умолчанию.
	'instruction' => '', // Текст над полем.
	'notes'       => '', // Текст под полем.
),
меню

Логический

Это поле ещё называют "Правда или ложь", "Да или нет", то есть с помощью этого поля можно выбрать только из двух вариантов. Это поле похоже на поле типа "Радио-кнопки", но предустановлены сразу два варианта (неизменяемые) - Да и Нет.

Создание логического поля
Логического поле в метабоксе

К списку общих свойств добавлены следующие свойства:

Текст радио-кнопки (true)
Текст для кнопки, отвечающей за положительный вариант ответа, к примеру "Да", "Конечно", "Обязательно" и так далее.
По умолчанию: Да
Текст радио-кнопки (false)
Текст для кнопки, отвечающей за отрицательный вариант ответа, к примеру "Нет", "Никак", "Против" и так далее.
По умолчанию: Нет

Регистрация поля через код:

array(
	'type'        => 'boolean', // Тип поля. Обязательный.
	'name'        => 'field_name', // Ключ поля. Обязательный.
	'label'       => 'Логическое поле', // Заголовок поля.
	'default'     => '', // Значение по умолчанию.
	'instruction' => '', // Текст над полем.
	'notes'       => '', // Текст под полем.
	'true_label'  => 'Да', // Текст радио-кнопки (true)
	'false_label' => 'Нет', // Текст радио-кнопки (false)
),
меню

Флажки

Поле checkbox позволяет выбирать из подготовленного списка нужный вариант (или несколько) посредством установки флажка(ов).

Создание поля checkbox в админке
Отображение поля checkbox в метабоксе

К списку общих свойств добавлены следующие свойства:

Варианты выбора
Список из вариантов ответа, которые потом предстоит выбрать пользователю. Каждый вариант пишется с новой строки. Чтобы сделать ключ и значение отдельными, введите их в формате key => value.
Вариант отображения
Как располагать флажки: вертикально (в столбец) или горизонтально (в строку).

Регистрация поля через код:

array(
	'type'            => 'check', // Тип поля. Обязательный.
	'name'            => 'field_name', // Ключ поля. Обязательный.
	'label'           => 'Поле с флажками', // Заголовок поля.
	'choices'         => array( // Массив с вариантами выбора.
		'key_name_1' => 'Название варианта 1',
		'key_name_2' => 'Название варианта 2',
	),
	'check_direction' => 'horizontal', // или vertical. Вариант отображения пунктов.
	'default'         => '', // Значение по умолчанию.
	'instruction'     => '', // Текст над полем.
	'notes'           => '', // Текст под полем.
),
меню

Радио-кнопки

Поле аналогично полю "Флажки", только варианты выводятся в виде радио-кнопок <input type="radio">, а это значит, что пользователь сможет выбрать только один вариант.

Поле c радио-кнопками в метабоксе

Регистрация поля через код:

array(
	'type'            => 'radio', // Тип поля. Обязательный.
	'name'            => 'field_name', // Ключ поля. Обязательный.
	'label'           => 'Логическое поле', // Заголовок поля.
	'choices'         => array( // Массив с вариантами выбора.
		'key_name_1' => 'Название варианта 1',
		'key_name_2' => 'Название варианта 2',
	),
	'radio_direction' => 'horizontal', // или vertical. Вариант отображения пунктов.
	'default'         => '', // Значение по умолчанию.
	'instruction'     => '', // Текст над полем.
	'notes'           => '', // Текст под полем.
),
меню

Выпадающий список

Поле аналогично предыдущим двум, только варианты представлены в виде выпадающего списка <select>. Можно выбрать только один вариант.

Поле c выпадающим списком в метабоксе

Регистрация поля через код:

array(
	'type'            => 'select', // Тип поля. Обязательный.
	'name'            => 'field_name', // Ключ поля. Обязательный.
	'label'           => 'Выпадающий список', // Заголовок поля.
	'choices'         => array( // Массив с вариантами выбора.
		'key_name_1' => 'Название варианта 1',
		'key_name_2' => 'Название варианта 2',
	),
	'default'         => '', // Значение по умолчанию.
	'instruction'     => '', // Текст над полем.
	'notes'           => '', // Текст под полем.
),
меню

Файл

Поле для выбора файла. Кликнув по кнопке, открывается стандартная медиабиблиотека, где можно загрузить или выбрать уже загруженный файл.

Создание поля c выбором файла
Поле c выбором файла в метабоксе

Не поддерживает свойство "Значение по умолчанию".

Регистрация поля через код:

array(
	'type'        => 'file', // Тип поля. Обязательный.
	'name'        => 'field_name', // Ключ поля. Обязательный.
	'label'       => 'Поле с выбором файла', // Заголовок поля.
	'instruction' => '', // Текст над полем.
	'notes'       => '', // Текст под полем.
),
меню

Изображение

Поле, аналогичное полю "Файл", только в медиабиблиотеке будут отображаться картинки.

Создание поля c выбором изображения
Поле c выбором изображения в метабоксе

К списку общих свойств добавлены следующие свойства:

Размер предпросмотра
Определяет какого размера будут выведена картинка в метабоксе при её выборе.

Регистрация поля через код:

array(
	'type'        => 'image', // Тип поля. Обязательный.
	'name'        => 'field_name', // Ключ поля. Обязательный.
	'label'       => 'Поле с выбором изображения', // Заголовок поля.
	'size'        => 'full', // Размер изображения в метабоксе.
	'instruction' => '', // Текст над полем.
	'notes'       => '', // Текст под полем.
),
меню

WYSIWYG редактор

Визуальный редактор позволит разметить контент также, если бы вы писали статью.

Создание поля c визуальным редактором
Поле c выбором изображения в метабоксе

Регистрация поля через код:

array(
	'type'        => 'wysiwyg', // Тип поля. Обязательный.
	'name'        => 'field_name', // Ключ поля. Обязательный.
	'label'       => 'Поле с визуальным редактором', // Заголовок поля.
	'default'     => '', // Значение по умолчанию.
	'instruction' => '', // Текст над полем.
	'notes'       => '', // Текст под полем.
),
меню

Выбор цвета

Поле позволяет выбрать цвет с помощью пипетки. Это поле также называет Color Picker.

Создания поля c выбором цвета
Поле c выбором цвета в метабоксе

Регистрация поля через код:

array(
	'type'        => 'colorpicker', // Тип поля. Обязательный.
	'name'        => 'field_name', // Ключ поля. Обязательный.
	'label'       => 'Поле с выбором цвета', // Заголовок поля.
	'default'     => '', // Значение по умолчанию.
	'instruction' => '', // Текст над полем.
	'notes'       => '', // Текст под полем.
),
меню

Выбор даты

Поле позволяет выбрать дату с помощью календаря или написать вручную. Это поле также называет Data Picker.

Создание поля c выбором даты
Поле c выбором даты в метабоксе

К списку общих свойств добавлены следующие свойства:

Формат даты
В каком формате будет приматься и сохраняться дата, подробнее о параметре dateFormat.
Максимальная дата
Какую максимальную дату разрешено выбрать, подробнее о параметре maxData.
Минимальная дата
Какую минимальную дату разрешено выбрать, подробнее о параметре minData.

Регистрация поля через код:

array(
	'type'        => 'datepicker', // Тип поля. Обязательный.
	'name'        => 'field_name', // Ключ поля. Обязательный.
	'label'       => 'Поле с выбором даты', // Заголовок поля.
	'date_format' => '', // Формат даты.
	'max_date'    => '', // Максимальная дата.
	'min_date'    => '', // Минимальная дата.
	'default'     => '', // Значение по умолчанию.
	'instruction' => '', // Текст над полем.
	'notes'       => '', // Текст под полем.
),
меню

Связанные записи

Поле позволяет выбирать из списка указанных типов постов нужные вам записи (записи, страницы, продукты и так далее).

Создание поля c выбором связанных записей
Поле c выбором связанных записей в метабоксе

К списку общих свойств добавлены следующие свойства:

Типы записей
Список из флажков, позволяющий выбрать записи какого типа выводить в списке.
Максимальное количество выбираемых элементов
Сколько можно выбрать элементов из списка. Если указать, к примеру, 3, то более 3 записей пользователь не сможет выбрать.

Регистрация поля через код:

array(
	'type'        => 'relation', // Тип поля. Обязательный.
	'name'        => 'field_name', // Ключ поля. Обязательный.
	'label'       => 'Поле с выбором связанных записей', // Заголовок поля.
	'post-type'   => array(), // Типы записей.
	'limit'       => 0, // Максимальное количество выбираемых элементов.
	'instruction' => '', // Текст над полем.
	'notes'       => '', // Текст под полем.
),
меню

Связанные термины

Поле позволяет выбирать из списка указанных таксономий нужные вам термины (рубрики, метки и так далее). Поле аналогично полю "Связанные записи", только вместо свойства "Типы записей" отображается свойство "Таксономии" соответственно.

array(
	'type'        => 'taxonomy', // Тип поля. Обязательный.
	'name'        => 'field_name', // Ключ поля. Обязательный.
	'label'       => 'Поле с выбором связанных терминов', // Заголовок поля.
	'taxonomy'    => array(), // Таксономии.
	'limit'       => 0, // Максимальное количество выбираемых элементов.
	'instruction' => '', // Текст над полем.
	'notes'       => '', // Текст под полем.
),
меню

Получение значения полей

Создавать поля можно в админке без программирования, но получение значений полей и их обработка невозможна без него, поэтому в этом разделе вы найдете примеры, как это сделать.

Smart Custom Fields сохраняет метаданные стандартно:

  • записей в таблицу *_postmeta,
  • терминов в таблицу *_termmeta,
  • пользователей в таблицу *_usermeta,
  • страниц настроек в таблицу *_options.

Из этого следует, что значения полей можно получить с помощью стандартной WordPress функции get_metadata() или её производных. При этом, ключ метаполя указывается такой-же (без каких либо префиксов): например, если мы указали ключ my_field, то получить поле можно так: get_post_meta( 25, 'my_field', 1 );.

Это рекомендуемый способ, так как если вы решите убрать плагин или заменить его подобным - переписывать код придётся меньше или вообще не придётся.

Но если таких действий в будущем не планируется, то можно воспользоваться специальными функциями плагина, которые делают получение метаданных более удобным.

меню

Метаданные записей

В цикле ID записи можно не передавать, тогда методы возьмут ID текущей записи.

// Этот метод получает метаданные любого поля.
$metadata = SCF::get( 'field-name', $post_id );

// Этот метод получает метаданные любой группы полей.
$metadata = SCF::get( 'group-name', $post_id );

// Этот метод получает все метаданные записи.
$metadata = SCF::gets($post_id);

Пусть мы создали текстовое поле с ключом mood (настроение) для записей, тогда чтобы вывести на экран значение этого поля в шаблоне записи (к примеру, в single.php) надо написать:

echo SCF::get( 'mood' ) // К примеру, выведет "Отличное"

Пусть мы создали повторяемое текстовое поле с ключом item, а группе дали имя ingredients, тогда:

// Получим метаданные по ключу поля
$metadata = SCF::get( 'item' );

/*
print_r( $metadata );
Получим, к примеру, массив
Array
(
	[0] => Огурцы
	[1] => Помидоры
	[2] => Соль
)
*/

// Выведем на экран
foreach ( $metadata as $meta ){
	echo $meta;
}

// Получим метаданные по имени группы
$metadata = SCF::get( 'ingredients' );

/*
print_r( $metadata );
Получим, к примеру, массив
Array
(
	[0] => Array
		(
			[item] => Огурцы
		)

	[1] => Array
		(
			[item] => Помидоры
		)

	[2] => Array
		(
			[item] => Соль
		)

)
*/

// Выведем на экран
foreach ( $metadata as $meta ) {
	echo $meta['item'];
}

// Получим все группы с полями
$metadata = SCF::gets();

/*
print_r( $metadata );
Получим, к примеру, массив. Заметьте, что в примере у нас лишь одна группа "ingredients", но ведь вы можете создать их больше.
Array
(
	[ingredients] => Array
		(
			[0] => Array
				(
					[item] => Огурцы
				)

			[1] => Array
				(
					[item] => Помидоры
				)

			[2] => Array
				(
					[item] => Соль
				)

		)

)
*/

// Выведем на экран
foreach ( $metadata as $meta ) {
	foreach ( $meta as $item ) {
		echo $item['item'];
	}
}

Ниже будут примеры получения метаданных у других сущностей WordPress с похожими методами и структурой возвращаемых данных.

меню

Метаданные пользователей

// Этот метод получает любые метаданные пользователя по ключу.
$user_meta = SCF::get_user_meta( $user_id, 'field-name' );

// Этот метод получает любые метаданные пользователя по имени группы.
// В массив будут включены все метаданные, относящиеся к указанной группе.
$user_meta = SCF::get_user_meta( $user_id, 'group-name' );

// Этот метод получает все метаданные пользователя.
$user_meta = SCF::get_user_meta( $user_id );

Метаданные терминов

// Этот метод получает любые метаданные термина по ключу.
SCF::get_term_meta( $term_id, $taxonomy 'field-name' );

// Этот метод получает любые метаданные термина по имени группы.
// В массив будут включены все метаданные, относящиеся к указанной группе.
SCF::get_term_meta( $term_id, $taxonomy, 'group-name' );

// Этот метод получает все метаданные термина.
SCF::get_term_meta( $term_id, $taxonomy );

Метаданные произвольной страницы настроек

Регистрация страницы настроек осуществляется методом SCF::add_options_page(), который принимает те же значения, что и функция add_menu_page(). Регистрация должна осуществляться на хуке init, например зарегистрируем две страницы настроек:

add_action( 'init', function () {
	SCF::add_options_page( 'Управление сайтом', 'Управление сайтом', 'manage_options', 'my-theme-settings' );
	SCF::add_options_page( 'Настройки моего плагина', 'Настройки моего плагина', 'manage_options', 'my-plugin-settings' );
} );

После регистрации страницы настроек она станет доступна для выбора при создании полей в метабоксе "Условия отображения (страница настроек)" и к ней можно привязать произвольные поля или группы полей.

// Этот метод получает любые метаданные страницы настроек по ключу поля.
SCF::get_option_meta( $menu_slug, 'field-name' );

// Этот метод получает метаданные группы полей страницы настроек.
// В массив будут включены все метаданные, относящиеся к указанной группе.
SCF::get_option_meta( $menu_slug, 'group-name' );

// Этот метод получает все метаданные страницы настроек.
SCF::get_option_meta( $menu_slug );
меню

Создание своих полей

Пример создания поля с вводом числа на основе поля "Текст":

class Smart_Custom_Fields_Field_Number extends Smart_Custom_Fields_Field_Text {
	/**
	 * Set the required items
	 *
	 * @return array
	 */
	protected function init() {
		return array(
			'type'         => 'number',
			'display-name' => 'Число',
			'optgroup'     => 'basic-fields',
		);
	}

	/**
	 * Getting the field
	 *
	 * @param int $index
	 * @param string $value
	 * @return string html
	 */
	public function get_field( $index, $value ) {
		$name     = $this->get_field_name_in_editor( $index );
		$disabled = $this->get_disable_attribute( $index );
		return sprintf(
			'<input type="number" name="%s" value="%s" class="widefat" %s />',
			esc_attr( $name ),
			esc_attr( $value ),
			disabled( true, $disabled, false )
		);
	}
}

function scf_add_number_field() {
	new Smart_Custom_Fields_Field_Number();
}

add_action( 'init', 'scf_add_number_field' );
меню

Похожие плагины

  • Meta Box - крутой плагин для создания метаполей ;
  • Carbon Fields - не менее крутой и полностью бесплатный;
  • Advanced Custom Fields - один из самых популярных и многофункциональных;
  • Custom Field Suite - хороший плагин для создания метаполей;
  • И ещё огромное количество плагинов по работе с метаполями в репозитории WordPress.
12 комментов
Полезные 1 Все
  • Гога cайт: www.utoweb.com

    Спасибо! Надо будет попробовать!

  • Кирилл cайт: pdnx.ru

    Чем он лучше ACF?

    -1
    Ответить3 месяца назад #
  • @ Евгений

    Подскажите, пожалуйста, а где можно еще документацию к плагину почитать?
    Так по нему скудно все в интернете, а на гитхабе плагина - так совсем скучно, на ютубе тоже тишина, кроме беспантового ролика.

    -1
    Ответить3 месяца назад #
    • campusboy3080 cайт: www.youtube.com/c/wpplus

      А что ты хочешь почитать? Всё в целом в статье - как добавить поля, как получить значения. Даже и не знаю, что ещё можно тут написать smile скоро ещё видео буду делать по каким-нибудь стандартным задачам, связанным с метаполями на основе этого плагина.

      1
      Ответить3 месяца назад #
  • @ Евгений

    Может кто сталкивался с задачей по расширению типов полей? Например, возникла необходимость тип number задать, а вот как это сделать?)

    Ответить3 месяца назад #
    • campusboy3080 cайт: www.youtube.com/c/wpplus
      class Smart_Custom_Fields_Field_Number extends Smart_Custom_Fields_Field_Text {
      	/**
      	 * Set the required items
      	 *
      	 * @return array
      	 */
      	protected function init() {
      		return array(
      			'type'         => 'number',
      			'display-name' => 'Число',
      			'optgroup'     => 'basic-fields',
      		);
      	}
      
      	/**
      	 * Getting the field
      	 *
      	 * @param int $index
      	 * @param string $value
      	 * @return string html
      	 */
      	public function get_field( $index, $value ) {
      		$name     = $this->get_field_name_in_editor( $index );
      		$disabled = $this->get_disable_attribute( $index );
      		return sprintf(
      			'<input type="number" name="%s" value="%s" class="widefat" %s />',
      			esc_attr( $name ),
      			esc_attr( $value ),
      			disabled( true, $disabled, false )
      		);
      	}
      }
      
      function scf_add_number_field() {
      	new Smart_Custom_Fields_Field_Number();
      }
      
      add_action( 'init', 'scf_add_number_field' );
      2
      Ответить3 месяца назад #
      • @ Евгений

        да, спасибо за ответ, не надеялся на быстрый ответ тут, и сделал сам так же smile

        Ответить3 месяца назад #
  • @ Евгений

    или галерею изображений нужно сделать на этом плагине, тоже вопрос, если тип для загрузки ограничен загрузкой одного фото

    -1
    Ответить3 месяца назад #
    • campusboy3080 cайт: www.youtube.com/c/wpplus

      Для этого можно использовать поле "Изображение" с опцией "Повтор".

      2
      Ответить3 месяца назад #
      • @ Евгений

        повтором к сожалению, нельзя, т.к. уже повтор используется. По сути нужен повтор в повторе сделать

        Ответить3 месяца назад #
  • @ Евгений

    Спасибо за отличную статью! Со всем разобрался!

    Ответить2 месяца назад #
Здравствуйте, !     Войти . Зарегистрироваться