WordPress как на ладони
Новые WordPress шаблоны Недорогой хостинг для сайтов на WordPress: wordpress.jino.ru

Carbon Fields 1.6 — контейнеры

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

Ниже описаны все возможные контейнеры 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 3060youtube.com/c/wpplus
Создатель YouTube канала wp-plus, на котором делюсь своим опытом. Активный пользователь wp-kama.ru. WordPress-разработчик. Разработка сайтов и лендингов. Доработка существующих проектов. Сопровождение ресурсов.
Редакторы: Kama 7019
38 комментов
Полезные 1 Вопросы 2 Все
  • Заюзал уже плагин! Всё просто супер! Но есть пожелания по контейнерам, для них есть $type, $title... но почему бы еще не добавить $name, который и был бы уникальным значением а не $title. К примеру я хочу для разных типов записей создать контейнер с $title - "Настройки", но не получается, ошибка ! Тут явно напрашивается уникальный параметр $name smile

    1
    Ответить1.4 год назад #
    • campusboy3060 cайт: www.youtube.com/c/wpplus

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

      1
      Ответить1.4 год назад #
    • 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..
      	));
      Ответить1.3 год назад #
      • campusboy3060 cайт: www.youtube.com/c/wpplus

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

        1
        Ответить1.3 год назад #
        • Anton Vakulenko cайт: wordpress.org/plugins/carbon-fields

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

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

    Ответить1.3 год назад #
    • campusboy3060 cайт: www.youtube.com/c/wpplus

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

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

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

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

        Ответить1.3 год назад #
        • campusboy3060 cайт: www.youtube.com/c/wpplus

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

          Подытожу:

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

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

          Ответить1.3 год назад #
  • Tier-x

    Можно ли сделать таб в табе?

    Ответить1.1 год назад #
  • Замечание по контейнеру Widget. smile
    В конструкторе класса должен быть вызван метод setup с ПЯТЬЮ параметрами : rtfm
    setup( $widget_id, $title, $description, $fields, $classname )
    то есть нужно указать id виджета don-t_mention

  • Не получается ничего. ( Пытаюсь делать по приведённым тут примерам. Взяла для начала этот:

    use Carbon_Fields\Container;
    use Carbon_Fields\Field;
    
    Container::make('post_meta', 'Custom Data')
    	->show_on_post_type('post')
    	->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'),
    	));

    Только изменила page на post (у меня пока нет страниц на сайте, только записи). Я поняла, что указывать тип записи post не обязательно, но пока пусть будет. Потом мне нужно будет ограничить вывод по рубрике. Тем более, всё равно, этот код у меня не работает. И ещё я убрала из кода первые две строки, поскольку они уже есть. И есть один контейнер, который выводится в админке в качестве раздела. Код слямзила тут же (спасибо!) и переделала немного. Так вот, у того куска кода есть обёртка

    add_action( 'carbon_fields_register_fields', 'crb_attach_theme_options' );
    function crb_attach_theme_options() 
    {тут код}

    И вот так оно работает. А в коде, приведённом в самом начале подобной обёртки нет. И из документации я не могу понять, нужна обёртка вообще или нет. И какая. Простите. Просто, везде примеры без обёртки.

    • Отвечу сама себе. Вот такой код работает

      add_action( 'carbon_fields_register_fields', 'crb_attach_post_meta' );
      function crb_attach_post_meta() {
      	Container::make( 'post_meta', __( 'Post Options', 'crb' ) )
      		->where( 'post_type', '=', 'post' )
      		->add_fields( array(
      			Field::make( 'text', 'venue_seats', 'Seats' ),
      			Field::make( 'text', 'venue_adress', 'Adress' ),
      			Field::make( 'map', 'venue_location', 'Map' )
      		->set_help_text( 'drag and drop the pin on the map to select location' )
      		) );
      }

      Но и тут проблемы. Во-первых, если указать имена полей на кириллице, например

      Field::make( 'text', 'venue_seats', 'Места' ),

      То вывод сразу ломается. Ерунда, конечно, можно жить и с английскими именами, но это странно. Потому что в другом примере кириллические символы в названии не приводили к краху.
      Во-вторых, проблема с картой. Я так и не поняла, как указать масштаб. В оф гайде про это написано, но как и куда вставлять непонятно. Скорее всего, это я тупка, но и тупкам нужно как-то жить. ) И как указывать лкацию, кроме как переставляя маркер, тоже непонятно. Да, поле для поиска по адресу есть, но оно не работает.
      В общем, пока всё грустно.

      • campusboy3060 cайт: www.youtube.com/c/wpplus

        У меня никогда с этим проблем не было. Что-то делаете не так. О каком выводе речь? В админке или во фронте? Вставил Ваш код и работает как часы. Чуть переделал. Вставлять в самое начало functions.php:

        use Carbon_Fields\Container;
        use Carbon_Fields\Field;
        
        add_action( 'carbon_fields_register_fields', 'crb_attach_post_meta' );
        function crb_attach_post_meta() {
        	Container::make( 'post_meta', 'me_post_options', 'Опции записи' )
        			 ->where( 'post_type', '=', 'post' )
        			 ->add_fields( array(
        				 Field::make( 'text', 'venue_seats', 'Места' ),
        				 Field::make( 'text', 'venue_adress', 'Адресс' ),
        				 Field::make( 'map', 'venue_location', 'Карта' )
        						->set_help_text( 'Перетащите значок на карте для выбора расположения' )
        						->set_position(40.346544, -101.645507, 18) // Долгота / Широта / Увеличение
        			 ) );
        }

        Получилось:

        Всё нормально. А то что не отработал метод set_position(), то этому есть объяснение. Заглядываю в консоль браузера и бац:

        В старых версиях ключ к API был внутри самого CF (хотя в старой доке пишут, что и там надо). В новой версии его нет, надо брать у Гугла свой личный и подставлять. В оф. доке это написано. И указана причина, почему теперь так.

        2
      • На карте есть поиск - Search. Туда вставляете координаты места и маркер сразу туда устанавливается. А потом запоминается и выводится должно соответствующими функциями. Это я уже понял. Но предустановки места ->set_position() у меня тоже не заработали. Carbon - после плагинов общеизвестных, на которых доходил до какого-то места и все или останавливалось или валилось... последняя надежда. Делаю сайт, указание места, описание места и пр. это основная его фишка.

        • Я так и не подружилась с картой. Во-первых, поиск там неактивный, во всяком случае, у меня. Просто неактивный значок лупы. Искать по координатам, вот, реально, задолбёшься и, всё равно, за ними нужно переться в приложение гуглокарты. Для себя я нашла более простой способ с лучшим результатом. Получить код из гуглокарт (раз уж мы, всё равно, вынуждены к ним обращаться), вставить изменяемый кусок в обычное поле textarea, вывести его в нужном месте в оболочке от гугла. Так и проще. для меня быстрее, и вместе с картой, выводится табличка с адресом, ссылками на отзывы и прочей мишурой. Плюс контроль размеров iframe есть. Их, при желании, тоже можно запихнуть в кастомные поля.
          Пример кода:

          <iframe src="https://www.google.com/maps/embed?pb=
          <?php echo carbon_get_the_post_meta('crb_location'); ?>
          " width="100%" height="500" frameborder="0" style="border:0" allowfullscreen>
          </iframe>

          Во фронтэнде https://drive.google.com/file/d/1NYPhsprzbw_Vildne8qQLUcaNkpM64_7/view?usp=sharing

          Если нет нужды в каком-то особом интерактиве, который можно (наверное) соорудить с полем map CF, то можете попробовать сделать что-то подобное. Так можно и яндекс карты выводить, если они предпочтительнее.

          • Поиск у меня активный. Может версия? Я устанавливал карбон через композер в тему сразу и неделю тому. И в моем случае человек идет с GPS-навигатора. Всеравно вручную "вбивать" цифры. Просто хочу при выборе страны, уже увеличить её на карте ему "под руку" визуально. Да, и высота фрейма - хотелось бы ставить свою, конечно... Делаю чтоб отзывы уже на сайте чтоб хранились, их пользователи вводят при размещении места в базу. Стилизированные... Ну и конечно надо было все это во фронтенде... smile Вводить данные через поля. Но "чайник" есть "чайник". На данном этапе не осилю. Через плагины Custom Field Suite и Advanced Custom Fields я пробовал. Потратив кучу времени в одном не нашел того что надо, другой: на каком-то этапе пропали (рассыпались) наработки и я понял что громадный, на все случаи жизни плагин - не для меня.

          • campusboy3060 cайт: www.youtube.com/c/wpplus

            Я также делал: карту в конструкторе самого Google и вставлял в textarea. Иногда это выгодно. Но и поле map использовал. Хоть лупа и не активна, но по Enter центрирует в нужном месте.

            Проблема с map реальна. У меня не работает метод set_position() ни без ключа, ни с ним. И это печально pardon

            1
            • campusboy3060 cайт: www.youtube.com/c/wpplus

              Но поиск по issue часто даёт отличные результаты smile

              Теперь надо использовать метод set_default_value().

              Например:

              Field::make("map", "crb_company_location", "Местоположение")
              		 ->set_default_value( array(
              			 'value' => '55.80938,49.11438',
              			 'lat' => 55.80938,
              			 'lng' => 49.11438,
              			 'zoom' => 10,
              			 'address' => '',
              		 ) )

              Но такой подход мне не нравится. Если поле никто не заполнял, то данные из массива будут записаны в базу. А с set_position() такого раньше было. Отписал разрабам, надеюсь они учтут этот момент.

              1
              • Я этот код искал целый день. Он уже стоял у меня в шаблоне, но при очередном копи-пасте "потерялся". smile И я уже почти поверил что его не было... smile В принципе ничего не смыслю в программировании... чайник т.е.. который возомнил себя... но как сделать чтоб "вместо цифр там стояли переменные"? Методом "тыка" я много "перетыкал", но трудно искать кошку в темной комнате... и обидно если окажется... smile

    • campusboy3060 cайт: www.youtube.com/c/wpplus

      Столько хотел сказать, но пожалуй ограничусьmosking

      Все примеры, как тут, так и на оф. сайте идут без обертки:

      dd_action( 'carbon_fields_register_fields', 'crb_attach_theme_options' );
      function crb_attach_theme_options() 
      {тут код}

      потому что она указана в водных статьях (как установить и как применить). Так как это обёртка должна быть ВСЕГДА и считается, что вы прочли вводную статью - её не пишут. Не пишут, чтобы не быть попугаями, чтобы не раздувать статью копипастом. Тем более обычно пишут обертку, а внутри кучу контейнеров расписывают, ну или инклудят, если они логически разбиты по отдельным. Потому примеры без обёртки удобнее: зашли, скопировали, вставили к себе - готово. Ничего лишнего. Если Вы решли пользоваться такими "программисткими" штукачами, то придётся внимательно читать ОТ и ДО доку, чтобы не было проблем и достигнуть максимальной эффективности, ради которой эта библиотека создавалась. Я другого пути просто не знаю smile Давно это понял, потому трачу на изучение времени больше большинства ребят, зато быстрее потом работаю, так как минимум ошибок и непоняток в работе получается.

      2
      • Спасибо! Ключ Google я вставила этим кодом:

        add_filter( 'carbon_fields_map_field_api_key', 'crb_get_gmaps_api_key' );
        function crb_get_gmaps_api_key( $current_key ) {
        	return 'ключ';
        }

        Так что, как бы, должно работать. Но не работает. Я понимаю, что обёртка предполагается. Но, тогда, я не понимаю другого. Зачем перед почти каждым кодом пишут это:

        use Carbon_Fields\Container;
        use Carbon_Fields\Field;

        Это же тожно нужно писать только один раз. Зачем же повторяются? Или эти строки нужно писать перед каждым фильтром? Запуталась...

        1
        • campusboy3060 cайт: www.youtube.com/c/wpplus

          Насчёт ключа более ничего не могу сказать, не использую. Смотрите в консоль браузера, может ошибки какие.

          Насчёт повторов с use - так раньше было в оф. доке, я тоже себе так перенес. Понимаете... просто у большинства контейнеров используется:

          use Carbon_Fields\Container;
          use Carbon_Fields\Field;

          Но взять допустим контейнер "Виджет", там уже:

          use Carbon_Fields\Widget;
          use Carbon_Fields\Field;

          Чтобы никто не ошибся - пишут. А обёртка во всех случаях одинаковая. Поэтому про неё 1 раз сказали вначале и всё.

          Сожалею, что Ваш опыт с WordPress начался с таких казусов. Но стоит сказать, что подобные плагины/библиотеки рассчитаны на более менее зрелого разработчика. А Вы взяли и с ходу окунулись в разработку, толком не зная ни сам движок, ни программирования в целом. Вот и не получается. Хотя не исключаю баги CF. Раз мне они не попадались, не значит, что их нет. Могу лишь Вам предложить попробовать другие решения для работы с произвольными полями, с более "дружелюбным" подходом, к примеру Advanced Custom Fields, там вообще из админки контейнеры и поля делаются. Так же есть Meta Box, о нём мы сейчас ведем цикл мануалов. Meta Box немного напоминает CF, то есть там тоже кодом решается вопрос, но всё-таки вместо объектов там более привычные массивы. Устанавливается как плагин, подключается легко (чем-то похоже подключение как у CF, но без всяких use). Имеет огромное число полей под все случаи жизни. Выбор за вами. Если и эти решения не устраивают, то есть сайт со списком большинства крутых плагинов и библиотек для WP-разработчиков.

          1
          • Хех... Не хочется бросать. Библиотека то хорошая, судя по описанию на ней кучу всего полезного можно сделать. Но с картами прям беда. Не работает по адресу хоть тресни. Но ACF, например, вместо карты мне вообще ошибку показывает. Да и визуальный конструктор, имхо, менее удобен. И, всё же, use надо писать перед каждым фильтром? Я правильно поняла?
            Я уже заметила, что талантливые программисты, зачастую, совершенно не умеют писать доки. ) Понятно, что зубрам подробности и не нужны, но есть же и простые пользователи. Я сама столкнулась с подобным, когда писала серию уроков по фотошопу. Одни жаловались, что слишком подробно, зато новички были в восторге. Собственно, для них и писалось.

            • campusboy3060 cайт: www.youtube.com/c/wpplus

              Программисты умеют писать нормальные доки, этот сайт тому доказательство. Другое дело, что люди пытаются что-то делать, не умея программировать. Каждый разработчик должен дать уроки php?) Нет же. А бывают мало пишут, потому что некогда. Они сосредоточены на самом продукте. Спасибо за то что есть.

              И, всё же, use надо писать перед каждым фильтром? Я правильно поняла?

              Фуф... вот и дошли до преподавания php. Варианты.

              Первый. Файл functions.php:

              use Carbon_Fields\Container; // или use Carbon_Fields\Widget; для Виджетов
              use Carbon_Fields\Field;
              
              add_action( 'carbon_fields_register_fields', function () {
              // Подключение файлов с контейнерами
              
              // или сразу начинают описываться контейнеры, ведь не обязательно это делать в отдельных файлах
              } );
              

              В подключаемых файлах, где описываете контейнеры, можно уже не указывать пространство имён - оно уже указано ведь выше.

              Второй. Файл functions.php:

              add_action( 'carbon_fields_register_fields', function () {
              // Подключение файлов с контейнерами
              } );
              

              В подключаемом файле, где описываете контейнер(ы), в начале указываете пространство имён (то что с use), потом только объявляете контейнер(ы). Если файлов несколько с контейнерами, то в КАЖДОМ из них объявляете пространство имён.

              Третий. Файл functions.php:

              // Инклудите файл, где лежит обёртка. Относительно этого "центрального файла" дальше снова работает первые два метода.

              Почитайте о хуках в WordPress и про использование пространств имен.

              2
              • Спасибо Вам большое, что возитесь тут со мной. Немного расстроившись из-за своей тупизны, попробовала, по Вашему совету, поставить Meta Box. Да, вроде бы, попроще. Но, как я поняла, если мне нужно вывести поля для записей только из одной какой-то категории, то мне нужно купить плагин. Верно? И поиск по адресу на карте там точно так же не работает. Только таскать руками маркер.
                Про доки. Конечно, спасибо, что хоть что-то есть. Но, реально, часто это так написано, что без пол-литра не разберёшься. К примеру, недавно читала описание к псевдоклассу ::any. Русский перевод, на который я натолкнулась первым, мне пришлось перечитывать раз 5, изучать примеры, и, всё равно, остались вопросы, причём существенные. Благо, после я нашла оригинал на английском, и даже учитывая, что его я знаю крайне паршиво, мне хватило одного прочтения, чтобы понять. Это ни коем образом не относится к Вам, у Вас читать удобнее, чем в официальном гайде, который тоже видно, что написан не на отвяжись, а люди старались. Просто вы все такие умные, что вам даже не понять сложностей новичков. Например, при описании установки через композер, нигде даже не упоминается, что это самостоятельная утилита, и нет ссылки на её скачивание.

                • campusboy3060 cайт: www.youtube.com/c/wpplus

                  Но, как я поняла, если мне нужно вывести поля для записей только из одной какой-то категории, то мне нужно купить плагин. Верно?

                  Судя по всему Да.

                  1
                  • Значит, придётся мне как-то выкручиваться с CF. Спасибо вам ещё раз! Извините, что достала Вас вопросами.

                    Кстати, оповещения на мыло так и не приходят.

                    1
  • Не виноватая я! Что ж я могу поделать, если я копирую один в один, а оно не работает.
    Вот смотрите, я подключила в пользовательский файл виджеты. И начальный код теперь выглядит так:

    use Carbon_Fields\Container;
    use Carbon_Fields\Field;
    use Carbon_Fields\Widget;

    В functions.php добавила код add_action( 'widgets_init', 'load_widgets' );.
    Потом я тупо скопировала код с офсайта, нет, я, конечно, сначала написала нужный мне, и только после того, как всё обломилось, решила тестить на готовом. В общем, как только вставляю код виджета, сайт вообще не грузится. Ошибок не объявляет.
    У меня дочерняя тема, и у родительской есть пара своих виджетов. Я понадеялась, что их отключение поможет решить проблему, но напрасно.
    Явно я где-то портачу. Есть ли шанс понять где?

    И простите, пожалуйста! Я понимаю, что задолбала вопросами. Просто, это первый случай, когда неудачи у меня на каждом шагу. Обычно, я нахожу решение проблемы в сети, либо решаю её самостоятельно. А тут прям засада какая-то. И актуальной инфы мало, помимо того, что её, к сожалению, мало вообще.

    • campusboy3060 cайт: www.youtube.com/c/wpplus

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

      У меня по оф. доке тоже новая версия не запустилась. Но вот так заработало:

      use Carbon_Fields\Widget;
      use Carbon_Fields\Field;
      
      function load_widgets() {
      	class ThemeWidgetExample extends Widget {
      		// Register widget function. Must have the same name as the class
      		function __construct() {
      			$this->setup( 'theme_widget_example', 'Theme Widget - Example', 'Displays a block with title/text', array(
      				Field::make( 'text', 'title', 'Title' )->set_default_value( 'Hello World!') ,
      				Field::make( 'textarea', 'content', 'Content' )->set_default_value( 'Lorem Ipsum dolor sit amet' )
      			) );
      		}
      
      		// Called when rendering the widget in the front-end
      		function front_end( $args, $instance ) {
      			echo $args['before_title'] . $instance['title'] . $args['after_title'];
      			echo '<p>' . $instance['content'] . '</p>';
      		}
      	}
      
      	register_widget( 'ThemeWidgetExample' );
      }
      
      add_action( 'widgets_init', 'load_widgets' );

      В общем, как только вставляю код виджета, сайт вообще не грузится. Ошибок не объявляет.

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

      И актуальной инфы мало, помимо того, что её, к сожалению, мало вообще.

      Господи, какой инфы вам ещё надо? Какой? Может разберётесь в Carbon и поделитесь с сообществом актуальной (актуальнее оф. док-ции) информацией? smile Было бы круто!

      2
      • Заработало! Спасибо огромное! Вы меня опять спасли. ) Буду разбираться дальше.
        Про информацию я непонятно написала, просто. Не сердитесь. ) Я имела в виду, что, помимо оф. гайда и Вашего потрясающего сайта, источников информации мало. Народных почти нет. Что есть, в большинстве своём, относится к старым версиям. Странная, на самом деле, ситуация. Плагин шикарный: гибкий, многофункциональный, но то ли им мало пользуются, то ли для мозговитых людей он настолько простой, что у них и вопросов не возникает.

  • И снова проблема с кириллицей. Причём, внезапно. Работало, работало и вдруг отвалилось. Код нового раздела в админке. Вы мне давали уже правильный, огромное спасибо. Но ВП опять капризничает. Вот такая ошибка Fatal error: Call to a member function add_tab() on a non-object in 'путь до темы'\inc\fields.php on line 10
    Код прежний:

    add_action( 'carbon_fields_register_fields', 'cg_theme_options' );
    function cg_theme_options() 
    {Container::make( 'theme_options', 'Пульт' )
    		 ->add_tab( 'Контакты', array(
    			 Field::make( 'text', 'cg_tw', 'Твиттер' ),
    		 ) )
    		 ->add_tab( 'Подключения', array(
    			 Field::make( 'textarea', 'vk_group', 'VK Группа' ),
    		 ) )
    		 ->add_tab( 'СЕО', array(
    			 Field::make( 'header_scripts', 'header_google_analytics', 'Код счётчика Гугл.Аналитикс' ),
    		 ) );
    }

    Все остальные кастомные поля с кириллицей в названиях полей работают без проблем.

    • campusboy3060 cайт: www.youtube.com/c/wpplus

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

      Container::make( 'theme_options', 'Пульт' )

      лучше

      Container::make( 'theme_options', 'pult', 'Пульт' )
      2
  • По координатам хочу определить страну. Здесь есть пример. Думал через скрытое поле (пустое), а потом через "// Делаем свои дела" изменить на нужное или есть что попроще?
    Только вот тоже: есть ли возможность сделать текстовое(например) поле скрытым? Или пускай человек пишет в поле что хочет, а исправит скрипт?
    Спасибо.

  • Bosssaite

    здравствуйте

    как правильно добавить дополнительную строку
    а именно Field::make('text', 'night-meals', 'Год рождения на документе?')

    		Field::make('select', 'set_tovar', 'Категория Пропажи')
    			->set_options(array('0' => 'Выберите тип Пропажи'))
    		->set_required(true)
    			->add_options(array(
    				'documentudl' => 'Документы, удостоверяющие личность',
    				'no' => 'Автодокументы',
    				'0' => 'Выберите тип Пропажи',
    			)),
    
    			 Field::make('text', 'night-meals', 'ФИО на документе?')
    
    			 Field::make('text', 'night-meals', 'Год рождения на документе?')
    				  ->set_conditional_logic(array(
    					  'relation' => 'AND',
    					  array(
    						  'field' => 'set_tovar',
    						  'value' => 'documentudl',
    					  )
    				  )),
    
    			 Field::make('text', 'night-meals-not', 'Почему?')
    				  ->set_conditional_logic(array(
    					  'relation' => 'AND',
    					  array(
    						  'field' => 'set_tovar',
    						  'value' => 'no',
    					  )
    				  )),
Здравствуйте, !     Войти . Зарегистрироваться