Контейнеры
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')
В версии CF 1.6 нельзя указать несколько рубрик в данном методе. Такая возможность появилась с версии CF 2.0.
Позиционирование контейнера
Подробную информацию о параметрах позиции можно найти в функции 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', 'Номер телефона'), ));