WordPress как на ладони
Наставник Трепачёв Д.П., phphtml.net wordpress jino

Контейнеры в Carbon Fields

Контейнер содержит в себе несколько произвольных полей и параметров как их отображать. Они выводятся в разных частях в зависимости от их типа и параметров отображения.

Ниже описаны все возможные контейнеры Carbon Fields и их опции. В примерах создания контейнера есть примеры создания полей этого контейнера, так как без них он не имеет смысла.

Подробное описание каждого доступного поля контейнера Carbon Fields вынесено в отдельную статью.

Оглавление:

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

Тут описана общая логика использования контейнеров. Она справедлива для всех типов контейнеров, которые описаны ниже.

Чтобы создать новый контейнер, используется метод make():

Container::make( $type, $title );
$type(строка) (обязательный)
Тип контейнера, определяющий предназначение группы полей и место отображения полей (в постах, таксономиях и т.д., см. ниже).
$title(строка) (обязательный)
Имя контейнера. Должно быть уникально в пределах WordPress.

Пример

Код создаст в постах типа page (страницы) поле с картой Google, поле с выбором произвольного виджета и поле для выбора изображения из медиабиблиотеки

use Carbon_Fields\Container;
use Carbon_Fields\Field;

Container::make('post_meta', 'Custom Data')
	->show_on_post_type('page')
	->add_fields(array(
		Field::make('map', 'crb_location')->set_position(37.423156, -122.084917, 14),
		Field::make('choose_sidebar', 'crb_custom_sidebar'),
		Field::make('image', 'crb_photo'),
	));

к началу

Post Meta (произвольные поля, метаполя)

Контейнер для расширения страницы редактирования постов (записи, страницы, произвольные типы постов). Введенные значения хранятся для каждого поста отдельно и добавляются по принципу работы функции add_post_meta.

Параметры отображения

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

Типы постов

Для одного типа записи:

->show_on_post_type('page')

Для нескольких типов записей:

->show_on_post_type(array('page', 'my_custom_post_type', 'post'))

Страницы и подстраницы

Отображение группы полей для отдельных страниц определяется путём (slug) или ID страницы

// Общий вид
->show_on_page( $page_path|$page_id )
// ID любой страницы
->show_on_page(17)
// Путь (slug) родительской страницы
->show_on_page('parent-page')
// Путь (slug родительской + slug её самой) подстраницы
->show_on_page('parent-page/sub-page')

Отображение группы полей для всех дочерних страниц определяет slug родительской страницы

->show_on_page_children('parent-page')

Шаблоны страниц

Отображение группы полей на страницах, использующих определенный шаблон

$template_path - это путь к файлу шаблона (или файлам)

// Общий вид
->show_on_template($template_path)
// Один шаблон в корне папки с темой
->show_on_template('about_us.php')
// Один шаблон в произвольной папке относительно папки с темой
->show_on_template('templates/contact.php')
// Несколько шаблонов
->show_on_template( array('about_us.php', 'templates/contact.php') )

Так же можно скрыть контейнер на страницах, использующих определенный шаблон(ы). Используется метод hide_on_template точно также, как и show_on_template.

->hide_on_template($template_path)

Форматы постов

Отображение группы полей в зависимости от формата поста (aside, chat, gallery, link, image, quote, status, video, audio).

// Общий вид
->show_on_post_format($post_format)
// Отображение контейнера в постах формата "Видео"
->show_on_post_format('video')
// Отображение контейнера в постах формата "Видео" или "Аудио"
->show_on_post_format( array( 'image', 'video' ) )

Вложенность

Отображать группу полей в иерархических постах в зависимости от глубины вложенности:

$level - это уровень вложенности, начиная от 1 и увеличивающийся при переходе вглубь иерархического дерева. На примере страниц:

// Общий вид
->show_on_level($level)
// Отобразить контейнер на родительских страницах (parent-pages)
->show_on_level(1)
// Отобразить контейнер на странице, вложенной в родительскую страницу (parent-pages/sub-page)
->show_on_level(2)
// Отобразить контейнер на странице, вложенной в другую страницу, которая вложена в родительскую страницу (parent-pages/sub-page/sub-sub-page)
->show_on_level(3)

Рубрики и произвольные таксономии

Группу полей можно отобразить в отдельной рубрике, указав её slug:

// Общий вид
->show_on_category( $category_slug )
// Частный случай
->show_on_category('news')

или для произвольного элемента таксономии:

// Общий вид
->show_on_taxonomy_term( $term_slug, $taxonomy )
// аналоги примера выше
->show_on_taxonomy_term('news', 'category')
// Произвольный терм (таксономия fruits с термом apple)
->show_on_taxonomy_term('apple', 'fruits')
к началу

Позиционирование контейнера

Подробную информацию о параметрах позиции можно найти в функции add_meta_box.

Контекст

Место где должен показываться блок: normal (по умолчанию), advanced или side

->set_context('normal')

Приоритет

Приоритет блока для показа выше или ниже остальных блоков: high (по умолчанию), core, default или low

->set_priority('high')

Примеры

Получить значение поля можно с помощью функции:

carbon_get_post_meta( $id, $name, $type = null )
$id(число) (обязательный)
ID поста, произвольные поля которого нужно получить.
$name(строка) (обязательный)
Название опции, значение которого нужно получить.
$type(строка)
Если нужно получить значение сложного поля (содержит в себе массив данных), то укажите complex.

Создадим контейнер для записей

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

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

В пользовательском файле:

use Carbon_Fields\Container;
use Carbon_Fields\Field;

Container::make( 'post_meta', 'Author\'s note' )
	 ->show_on_post_type('post') // этот метод можно не писать, так как show_on_post_type('post') по умолчанию
		 ->add_fields(array(
			 Field::make('text', 'crb_author_description'),
			 Field::make('complex', 'crb_places')->add_fields(array(
				 Field::make('text', 'title'),
				 Field::make('image', 'photo')->set_value_type('url')
			 ))
		 ));

В шаблоне темы:

echo carbon_get_post_meta(get_the_ID(), 'crb_author_description');

$slides = carbon_get_post_meta(get_the_ID(), 'crb_places', 'complex');

if ( $slides ) {
	foreach ($slides as $slide) {
		echo '<p>' . $slide['title'] . '</p>';
		echo '<img src=" '. $slide['photo'] . '">';
	}
}

Если шаблон отображения метаполей используется в цикле, то вместо carbon_get_post_meta() можно использовать carbon_get_the_post_meta(), чтобы не указывать ID поста:

echo carbon_get_the_post_meta('crb_author_description');

$slides = carbon_get_the_post_meta('crb_places', 'complex');

Читайте подробнее о том, что такое цикл в WordPress

к началу

Хуки

После сохранения произвольных полей Carbon Fields вызывает хук carbon_after_save_post_meta, благодаря которому можно совершить какие-то действия:

add_action('carbon_after_save_post_meta', 'crb_after_save_event');
function crb_after_save_event( $post_id ) {
	if ( get_post_type($post_id) == 'post' ) {
		// Делаем свои дела
	}
}

Theme Options (настройки темы)

Для создания страниц настроек, где задействуется вся мощь API настроек (опций) WordPress, используются контейнеры настроек темы.

Одна страница с настройками

По умолчанию, в панели админки появится пункт Theme Options, который будет вести на главную страницу настроек:

use Carbon_Fields\Container;
use Carbon_Fields\Field;

Container::make( 'theme_options', 'Theme Options' )
	->add_fields(array(
		Field::make('text', 'crb_facebook_url'),
		Field::make('textarea', 'crb_footer_text')
	));

Данная страница будет иметь slug admin.php?page=crbn-theme-options.php и выглядеть так:

Создание страницы настроек темы или плагина

Если использовать кириллицу, например make('theme_options', 'Пульт'), то slug страницы настроек примет вид admin.php?page=crbn-Пульт.php.

к началу

Несколько страниц с настройками

Можно создать несколько страниц с настройками, причем не важно, будут ли они входить в состав пунктов самого WordPress или произвольных (например страниц плагинов).

use Carbon_Fields\Container;
use Carbon_Fields\Field;

// Родительская страница настроек
Container::make( 'theme_options', 'Basic Options' )
		 ->add_fields(array(
			 Field::make('header_scripts', 'crb_header_script'),
			 Field::make('footer_scripts', 'crb_footer_script'),
		 ));

// Подстраница настроек, входящая в страницу 'Basic Options'
Container::make( 'theme_options', 'Social Links' )
		 ->set_page_parent('Basic Options')  // Название родительской страницы настроек
		 ->add_fields(array(
			Field::make('text', 'crb_facebook_link'),
			Field::make('text', 'crb_twitter_link')
		));

// Добавление подпункта (подстраницы) в раздел "Внешний вид"
Container::make( 'theme_options', 'Customize Background' )
		 ->set_page_parent('themes.php') // slug страницы "Внешний вид" в админке
		 ->add_fields(array(
			Field::make('color', 'crb_background_color'),
			Field::make('image', 'crb_background_image')
		));

Чтобы добавить вложенную страницу настроек, используется метод

set_page_parent( $parent )
$parent

Название родительской страницы настроек, если она создавалась через Carbon Fields

ID (он же slug в данном случае) страницы верхнего уровня в сайдбаре админки. Является параметром $parent_slug у add_submenu_page().

к началу

Права доступа к страницам настроек

По умолчанию доступ к страницам настроек имеют пользователи с возможностью edit_themes. Чтобы изменить этот параметр, используйте метод:

set_page_permissions( $permission )
$permission
роль/возможность пользователя. Полный список возможностей смотрите в описании параметра $capability у функции current_user_can(). Так понятно, кому будут доступны страницы настроек в зависимости от установленного права.

Иконка для родительского пункта меню

Изменить иконку родительского пункта меню можно с помощью метода:

set_icon( $icon )
$icon
класс от иконочного шрифта dashicons или путь к иконке-картинке.
use Carbon_Fields\Container;
use Carbon_Fields\Field;

Container::make( 'theme_options', 'Basic Options' )
	->set_icon('dashicons-carrot')
	->add_fields(array(
		Field::make('text', 'crb_test_field'),
	));

Напомню, что иконки можно указывать только родительским пунктам меню!

Вывод значений

Чтобы вывести значения полей настроек (опций) используется функция

carbon_get_theme_option( $name, $type = null )
$name(строка) (обязательный)
Название произвольного поля, значение которого нужно получить.
$type(строка)
Если нужно получить значение сложного поля (содержит в себе массив данных), то укажите complex.

Пример

<p>Копирайт <?php echo carbon_get_theme_option('crb_copyright'); ?></p>
<p>
	Адреса офисов компании:
	<?php 
	$address_lines = carbon_get_theme_option('crb_addresses', 'complex');
	foreach ($address_lines as $line) {
		echo $line . '<br/>';
	}
	?>
<p>
к началу

Хук после сохранения опций

Как и в случае с Post Meta, после сохранения опций темы вызывается хук carbon_after_save_theme_options, который позволяет изменять данные или делать что-то еще после сохранения.

Term Meta (таксономии)

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

Метаданные терминов сохраняются в базе в таблице $wpdb->termmeta

Напомню, что произвольные таксономии легко создаются плагином Custom Post Type UI или с помощью функции register_taxonomy.

к началу

Пример создания метаполей таксономии

use Carbon_Fields\Container;
use Carbon_Fields\Field;

Container::make( 'term_meta', 'Настройки Term' )
		 ->show_on_taxonomy( 'category' ) // По умолчанию, можно не писать
		 ->add_fields( array(
			 Field::make( 'color', 'title_color', 'Цвет заголовка' ),
			 Field::make( 'image', 'thumb', 'Миниатюра' ),
		 ) );

На странице таксономии category (рубрики) теперь будут отображаться два поля: выбор цвета и загрузка миниатюры.

Тут мы добавили два поля:

  • Значения поля для выбора цвета используем, как цвет заголовка рубрики.
  • Значение поля для картинки используем как миниатюру рубрики.

Для прикрепления метаполей к конкретной таксономии, использовался метод

show_on_taxonomy( $taxonomy )
$taxonomy(строка/массив) (обязательный)
Название таксономии, которое указывается в функции register_taxonomy параметром $taxonomy или массив названий таксономий.
По умолчанию: category

Специально для создания миниатюр у терминов таксономий, есть отдельный, хороший код миниатюры для элементов таксономий.

к началу

Видимость по вложенности

Можно указать на каком уровне вложенности таксономии показывать контейнер с помощью метода

show_on_level( $level )
$level
уровень вложенности таксономии
// Общий вид
->show_on_level($level)
// Показать только в родительских таксономиях (1 уровень вложенности) (Фрукты)
->show_on_level(1)
// Показать только в таксономиях 2 уровня (Фрукты->Яблоки / Фрукты->Груши / Фрукты->Сливы),
->show_on_level(2)
// Показать только в таксономиях 3 уровня (Фрукты->Яблоки->Сорта / Фрукты->Яблоки->Рецепты / Фрукты->Яблоки->Болезни)
->show_on_level(3)
к началу

Вывод значений полей

Для получения значений полей контейнера используется функция

carbon_get_term_meta( $term_id, $name, $type = null )
$term_id(число) (обязательный)
ID таксономии
$name(строка) (обязательный)
Название произвольного поля, значение которого нужно получить.
$type(строка)
Если нужно получить значение сложного поля (содержит в себе массив данных), то укажите complex.

Пример вывода метаполей таксономий

<?php
// Получаем ID таксономии
$term_id = get_queried_object_id();

// Получаем значение поля для ввода цвета
$term_title_color = carbon_get_term_meta( $term_id, 'crb_title_color' );

// получим ID картинки из метаполя термина
$term_thumbnail_id = carbon_get_term_meta( $term_id, 'crb_thumb');

// ссылка на полный размер картинки по ID вложения
$term_thumbnail_url = wp_get_attachment_image_url( $term_thumbnail_id, 'full' );
?>

<!-- выводим миниатюру рубрики на экран -->
<img src="<?php echo $term_thumbnail_url; ?>" alt="" />

<!-- задаём стиль оформления заголовка рубрики -->
<style>
	h1{
		color: <?php echo $term_title_color; ?>;
	}
</style>
к началу

Хук после сохранения метаполей терминов

Как и в случае с Post Meta, после сохранения данных таксономии вызывается хук carbon_after_save_term_meta, который позволяет делать что-либо после сохранения метаданных. Хук передает параметр $term_id, который содержит ID текущего термина таксономии.

User Meta (пользователи)

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

Пример создания контейнера

Создадим контейнер на странице создания/редактирования пользователя, состоящий из двух полей:

  • названия города проживания
  • и улицы с номером дома
use Carbon_Fields\Container;
use Carbon_Fields\Field;

Container::make( 'user_meta', 'Address' )
		 ->add_fields(array(
			 Field::make('text', 'crb_city', 'City'),
			 Field::make('text', 'crb_street', 'Street'),
		 ));

Видимость на основе роли пользователя

По умолчанию контейнер виден всем пользователям, но с помощью метода show_on_user_role() можно точно указать, кому будет виден контейнер.

show_on_user_role( $role )
$role(строка/массив)
Роль пользователей или массив ролей.

Пример указания роли

// Общий вид
->show_on_user_role($role)
// Показать контейнер только при добавлении/редактировании пользователя с ролью редактора
->show_on_user_role('editor')
  • О ролях и возможностях пользователя читайте в описании к функции current_user_can.

  • Если роль не соответствует заявленной, заголовок контейнера всё равно отображается.

  • Если указать контейнеру отображать поля для subscriber (подписчика) и зайти на страницу добавления нового пользователя, то WordPress по умолчанию в выпадающем списке ролей отображает "Подписчик", что не даёт javascript плагина отработать должным образом и поля контейнера не видны. Приходится выбрать другую роль, а затем снова выбрать "Подписчик", чтобы поля отобразились.
к началу

Вывод значений метаполей юзера

Для получения значений полей контейнера используется функция

carbon_get_user_meta( $user_id, $name, $type = null )
$user_id(число) (обязательный)
ID пользователя.
$name(строка) (обязательный)
Название произвольного поля, значение которого нужно получить.
$type(строка)
Если нужно получить значение сложного поля (содержит в себе массив данных), то укажите complex.

Пример

<!-- Простое поле -->
<p>Author address: <?php echo carbon_get_user_meta(get_the_author_meta('ID'), 'crb_street'); ?></p>

<!-- Сложное (комплексное) поле -->
<?php 
$phone_numbers = carbon_get_user_meta(get_the_author_meta('ID'), 'crb_phone_numbers', 'complex');
foreach ($phone_numbers as $phone) {
	echo $phone['country_code'] . '-' . $phone['number'];
}
?>
к началу

Хук

Как и в случае с Post Meta, после сохранения данных пользователя вызывается хук carbon_after_save_user_meta, который позволяет производить любые операции после того как данные были сохранены. В вызываемую функцию передается переменная $user_id, содержащая ID пользователя.

Comment Meta (комментарии)

Контейнер Comment Meta позволяет добавлять метаданные на странице редактирования комментария. Данные для каждого комментария сохраняются в таблицу wp_commentmeta см. add_comment_meta.

Пример создания метаполей комментария

use Carbon_Fields\Container;
use Carbon_Fields\Field;

Container::make( 'comment_meta', 'Comment Information' )
	->add_fields(array(
		Field::make('text', 'crb_comment_rating', 'Comment Rating'),
		Field::make('text', 'crb_comment_additional_info', 'Additional Comment Information'),
	));

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

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

Вывод значений полей

Для получения значений полей контейнера используется функция:

carbon_get_comment_meta( $comment_id, $name, $type = null )
$comment_id(число) (обязательный)
ID комментария.
$name(строка) (обязательный)
Название произвольного поля, значение которого нужно получить.
$type(строка)
Если нужно получить значение сложного поля (содержит в себе массив данных), то укажите complex.

Пример

$comments = get_comments(array(
	'post_id' => get_the_ID(),
));

foreach ( $comments as $comment ) {
	$comment_additional_info = carbon_get_comment_meta($comment->comment_ID, 'crb_comment_additional_info');
	$comment_rating = carbon_get_comment_meta($comment->comment_ID, 'crb_comment_rating');

	if ( !empty($comment_additional_info) ) {
		echo $comment->comment_ID . ' info: '. $comment_additional_info;
	}

	if ( !empty($comment_rating) ) {
		echo 'Rating: ' . $comment_rating;
	}
}
к началу

Widgets (виджеты)

Контейнеры для виджетов используются для создания своих виджетов с настройками. Каждый виджет определяется как PHP класс. Пользовательский класс виджета должен расширять класс Widget и реализовать методы __construct() и front_end().

В конструкторе класса должен быть вызван метод

setup( $name, $description, $fields, $classname )
$name(строка) (обязательный)
Имя виджета, отображаемое в админке.
$description(строка) (обязательный)
Описание виджета, отображаемое в админке.
$fields(массив) (обязательный)
Массив полей.
$classname(строка)
Укажите атрибут собственного класса для виджета.

Создание контейнера для виджета

<?php
use Carbon_Fields\Widget;
use Carbon_Fields\Field;

class AboutMeWidget extends Widget {

	// Создание контейнера (виджета) и полей
	function __construct() {
		$this->setup(
			'Обо мне',
			'Расскажите о себе, добавив заголовок, фотографию и любой контент',
			array(
				Field::make( 'text', 'title', 'Заголовок' ),
				Field::make( 'image', 'photo', 'Фото' ),
				Field::make( 'rich_text', 'content', 'Контент' )
			),
			'my-css-class-for-widget' );

		$this->print_wrappers = false;
	}

	// Отображение информации во фронт-энде
	function front_end( $args, $instance ) {

		if ( ! empty( $instance['title'] ) ) {
			echo $args['before_title'] . $instance['title'] . $args['after_title'];
		}

		if ( ! empty( $instance['photo'] ) ) {
			$photo_url = wp_get_attachment_image_url( $instance['photo'], 'full' );
			echo "<img class='post-thumbnail' src='$photo_url' alt='' />";
		}

		if ( ! empty( $instance['content'] ) ) {
			echo wpautop( $instance['content'] );
		}

	}
}

// Сообщаем о нашем виджете движку
add_action( 'widgets_init', 'load_widgets' );
function load_widgets() {
	register_widget( 'AboutMeWidget' );
}

Метод front_end( $args, $instance ) отвечает за HTML код виджета во внешней части сайта. Здесь у вас есть доступ ко всем значениям виджета, определенных в конструкторе через экземпляр класса $instance.

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

Параметры виджета

Параметры виджета (например, ширину) можно настроить, добавив определение $form_options в начале класса виджета. Пример:

protected $form_options = array(
	'width' => 500
);

Теперь виджет при разворачивании будет занимать 500px по ширине, а не ширину панели виджетов.

Если нужно отключить оболочку виджета по умолчанию, которые идут в боковой панели, в свойстве $this->print_wrappers нужно указать false. Делается это в методе __construct(). Пример:

function __construct() {
	$this->setup('Widget Title', __('Widget Description'), array(
		Field::make('text', 'title', 'Title')->set_default_value('Hello World!'),
	));

	$this->print_wrappers = false;
}

Создание виджетов в Carbon Fields очень похоже на стандартное создание виджетов в WordPress. см. register_widget()

к началу

Nav Menu (меню)

Контейнеры меню используются для расширения экранов редактирования меню дополнительными полями. Произвольные поля хранятся отдельно как для постов в таблице wp_postmeta.

Контейнеры меню не поддерживают следующий функционал:

  • Сложные (комплексные) произвольные поля.
  • Параметры видимости: все контейнеры видны во всех пунктах меню.
  • Позиционирование: контейнеры выводятся в порядке их инициализации.
use Carbon_Fields\Container;
use Carbon_Fields\Field;

Container::make('nav_menu', 'Мои настройки меню')
		 ->add_fields(array(
			 Field::make('color', 'color', 'Цвет'),
		 ));

Вывод значений

Значения каждого пункта меню могут быть получены с помощью уже известной нам функции:

carbon_get_post_meta( $nav_menu_item_ID, $name )
$nav_menu_item_ID(строка) (обязательный)
ID пункта меню.
$name(строка) (обязательный)
Имя поля.

Напомню, что каждый пункт меню является записью типа nav_menu_item со статусом publish (опубликовано). Поэтому дополнительные данные пункта меню хранятся в произвольных полях.

к началу

Произвольный Walkers или Walker Filters

Чтобы использовать значения из Меню, нужно использовать пользовательский Walker или фильтр по умолчанию, расположенный по адресу wp-includes/nav-menu-template.php.

Пример Walkers

/**
 * Location:
 *  wp-includes/nav-menu-template.php
 *  source: Walker_Nav_Menu
 */
class Crb_Main_Menu_Walker extends Walker_Nav_Menu {
	public function start_el( &$output, $item, $depth = 0, $args = array(), $id = 0 ) {
		if ( isset( $args->item_spacing ) && 'discard' === $args->item_spacing ) {
			$t = '';
			$n = '';
		} else {
			$t = "\t";
			$n = "\n";
		}
		$indent = ( $depth ) ? str_repeat( $t, $depth ) : '';

		$classes = empty( $item->classes ) ? array() : (array) $item->classes;
		$classes[] = 'menu-item-' . $item->ID;

		$args = apply_filters( 'nav_menu_item_args', $args, $item, $depth );

		$class_names = join( ' ', apply_filters( 'nav_menu_css_class', array_filter( $classes ), $item, $args, $depth ) );
		$class_names = $class_names ? ' class="' . esc_attr( $class_names ) . '"' : '';

		$id = apply_filters( 'nav_menu_item_id', 'menu-item-'. $item->ID, $item, $args, $depth );
		$id = $id ? ' id="' . esc_attr( $id ) . '"' : '';

		$output .= $indent . '<li' . $id . $class_names .'>';

		$atts = array();
		$atts['title']  = ! empty( $item->attr_title ) ? $item->attr_title : '';
		$atts['target'] = ! empty( $item->target )     ? $item->target     : '';
		$atts['rel']    = ! empty( $item->xfn )        ? $item->xfn        : '';
		$atts['href']   = ! empty( $item->url )        ? $item->url        : '';

		// Добавить пользовательский цвет ссылкам
		$crb_color = carbon_get_post_meta($item->ID, 'color');
		$atts['style'] = ! empty( $crb_color ) ? 'color: ' . $crb_color . '; ' : '';
		// --- END ---

		$atts = apply_filters( 'nav_menu_link_attributes', $atts, $item, $args, $depth );

		$attributes = '';
		foreach ( $atts as $attr => $value ) {
			if ( ! empty( $value ) ) {
				$value = ( 'href' === $attr ) ? esc_url( $value ) : esc_attr( $value );
				$attributes .= ' ' . $attr . '="' . $value . '"';
			}
		}

		$title = apply_filters( 'the_title', $item->title, $item->ID );
		$title = apply_filters( 'nav_menu_item_title', $title, $item, $args, $depth );

		$item_output = $args->before;
		$item_output .= '<a'. $attributes .'>';
		$item_output .= $args->link_before . $title . $args->link_after;
		$item_output .= '</a>';
		$item_output .= $args->after;

		$output .= apply_filters( 'walker_nav_menu_start_el', $item_output, $item, $depth, $args );
	}

} // Walker_Nav_Menu

Пример фильтра, делающий то же самое

// Добавить пользовательский цвет ссылкам
add_filter('nav_menu_link_attributes', 'crb_nav_menu_link_attributes', 10, 4);
function crb_nav_menu_link_attributes($atts, $item, $args, $depth) {
	$crb_color = carbon_get_post_meta($item->ID, 'color');
	$atts['style'] = ! empty( $crb_color ) ? 'color: ' . $crb_color . '; ' : '';

	return $atts;
}

Оба приведенных выше примера сформируют следующий html-код:

<div class="menu-main-menu-container">
	<ul id="menu-main-menu" class="menu">
		<li id="menu-item-23" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-23">
			<a href="#" style="color: #2020f3; ">Sample Page</a>
		</li>
		<li id="menu-item-24" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-24">
			<a href="#" style="color: #f94c4c; ">Sample Page</a>
		</li>
		<li id="menu-item-26" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-26">
			<a href="#" style="color: #81d742; ">Sample Page</a>
		</li>
	</ul>
</div>
к началу

Tabs (вкладки)

Carbon Fields позволяет с помощью метода add_tab() распределять произвольные поля по вкладкам.

use Carbon_Fields\Container;
use Carbon_Fields\Field;

Container::make('post_meta', 'Настройки записи')
		 ->show_on_post_type( 'page' )
		 ->add_tab('Любимые вещи автора статьи', array(
			 Field::make('text', '_crb_first_name', 'Фраза'),
			 Field::make('image', '_crb_last_name', 'Картина'),
			 Field::make('file', '_crb_position', 'Песня'),
		 ))
		 ->add_tab('Извещения', array(
			 Field::make('text', '_crb_email', 'Электронная почта'),
			 Field::make('text', '_crb_phone', 'Номер телефона'),
		 ));
campusboy 1712wp-plus.ru
WordPress-разработчик. Разработка сайтов и лендингов. Доработка существующих проектов. Сопровождение ресурсов.
Контейнеры в Carbon Fields 10 комментариев
  • Заюзал уже плагин! Всё просто супер! Но есть пожелания по контейнерам, для них есть $type, $title... но почему бы еще не добавить $name, который и был бы уникальным значением а не $title. К примеру я хочу для разных типов записей создать контейнер с $title - "Настройки", но не получается, ошибка ! Тут явно напрашивается уникальный параметр $name smile

    1
    Ответить2 месяца назад #
    • campusboy1712 cайт: wp-plus.ru

      Ну вот решили разрабы, что так нормально. Carbon расширяем, если знаешь ООП, то можешь доработать smile

      1
      Ответить2 месяца назад #
    • Anton Vakulenko cайт: wordpress.org/plugins/carbon-fields

      Вы можете использовать один и тот же контейнер для нескольких post types используя
      ->show_on_post_type() метод.

      Пример:

      Container::make('post_meta', 'Settings')
      	->show_on_post_type(array('page', 'post','custom_post_type1', 'custom_post_type2', etc.))
      	->add_fields(array(
      		Field::make('text', 'field_1'),
      		Field::make('text', 'field_2'),
      		etc..
      	));
      Ответитьмесяц назад #
      • campusboy1712 cайт: wp-plus.ru

        Настройки для записи могут быть одни, а для страницы другие и тому подобное, так что, увы, такое решение не подойдет. Тут нужно использовать условия. При отображении, к примеру, страниц - подставляется один массив полей, а для записей - другой. Не совсем удобно, зато будет работать smile

        1
        Ответитьмесяц назад #
        • Anton Vakulenko cайт: wordpress.org/plugins/carbon-fields

          Да, все верно. В этом случае можно создать функцию, которая будет генерировать различные наборы полей в зависимости от post type.

          Ответитьмесяц назад #
  • Добрый день. Подскажите пожалуйста, как вывести поле на определенной странице. Например у меня есть страницы Контакты и Наши сотрудники. Необходимо что бы в редактировании каждой страницы были разные поля. Заранее спасибо.

    Ответитьмесяц назад #
    • campusboy1712 cайт: wp-plus.ru

      Привет. Читаем внимательнее:
      Post Meta -> Параметры отображения -> Страницы и подстраницы

      1
      Ответитьмесяц назад #
      • Еще заметил такую неисправность, у опций темы url странный получается admin.php?page=.php#!- , из за этого при сохранении через раз вылетает ошибка "Вам не разрешено" чего то там делать(точно не помню). Вот так контейнер объявлен:

        Container::make( 'theme_options', 'Настройка шаблона' )

        Не сталкивались с таким?

        Ответить28 дней назад #
        • campusboy1712 cайт: wp-plus.ru

          Сталкивался. Библиотека зарубежная и разработчики не учли момент использования двухбайтовых символов. В целом, об этой проблемы я им сообщал и предложил решение, которое было включено на тот момент. Решение было таким - название ссылки пропускать через специальный WP хук, на который обычно подвязываются плагины транслитерации, к примеру Cyr to Lat enhanced и подобные. Сейчас они чуть переделали, но смысл остался тот же, так что перекачайте себе файл Theme_Options_Container.php и замените старый.

          Подытожу:

          • У Вас должен быть установлен плагин транслетирации
          • Должен быть обновлен файл Theme_Options_Container.php.

          После этих процедур есть вероятность, что все сохраненные данные в этом контейнере не подхватятся, ведь урл изменится. В общем, поэкспериментируйте.

          Ответить28 дней назад #

Здравствуйте, !

Ваш комментарий