Часть 1. Немного текстов Чаще всего в сети публикуются материалы по начальному уровню работы с Wordpress. В лучшем случае обсуждаются документированные возможности самого Wordpress и различных его плагинов.
Я придерживаюсь позиции, что работа с документацией и использование документированных возможностей — инструментов, которые вам дал разработчик — является приоритетом в разработке.
Однако иногда документированных возможностей недостаточно, и данная статья появилась как ответ на этот случай.
Advanced Custom Fields (ACF) — один из популярных плагинов WordPress. Основная задача — создание блоков дополнительной информации для Постов, Страниц и Товаров.
Плагин настолько популярен, что вопросы о нем включаются в список MustKnow в различных интервью.
Ничего не имею против самого плагина — это очень удобный инструмент с широкими возможностями.
Он имеет встроенную возможность отображать редактирование статьи во внешнем интерфейсе.
Позволяет создавать поля на основе условий и связывать поля с нужными сообщениями.
Например, для новостного сайта вы решаете создать в блоке спортивных новостей дополнительный тег с указанием вида спорта, чтобы не забыть это сделать, вы создаете поле выбора, которое появится при выборе раздела «Спорт».
категорию и потребовать ее заполнения.
Конечно, одного примера недостаточно, чтобы описать стандартные возможности ACF. ACF используется в самых разных случаях, вы можете найти документацию плагина.
Для тех, кто еще не освоил иностранные языки, есть хорошая сайт с документацией на русском языке .
В моем случае не было достаточно документированных инструментов и мне пришлось иметь дело с устройством ACF.
Часть 2. Получение полей ACF
Итак, от прелюдии к действию.Постановка задачи - выносим редактирование товаров на фронтенд, при этом редактирование должно включать в себя возможность редактирования полей ACF, связанных с товаром, по условиям категории.
То есть при добавлении товара у менеджера должна быть возможность (или обязанность) заполнить информацию, относящуюся к категории товара.
Например, в категории «Фрукты» появляется поле «Разновидность», а в категории «Телефоны» — поле «Бренд» и так далее.
Если работать через административную панель, то задача тривиальна.
Но у вашего менеджера есть ограничения — его никто не собирался пускать в административную панель.
Поэтому функционал административной панели у вас отключен.
Стандартная функциональность ACF не предоставляет возможности запроса по условиям.
Поля отображаются вместе с идентификатором сообщения.
Это связано с особенностями сохранения в базе данных.
Условие «Категория товара» не привязано к сохраняемой информации.
Поэтому начинаем искать поля и условия.
Самая популярная таблица базы данных — записи, что обусловлено широким набором инструментов, разработанных для этой таблицы.
Здесь хранятся наши поля.
Для полей ACF зарезервировано два типа записей — в столбце «post_type» мы находим поля типов «acf-field-group» и «acf-field».
Первый тип записей, как следует из названия, отвечает за группу полей, второй тип записей отвечает непосредственно за поле.
Связь между ними происходит через поле post_parent.
Теперь, когда мы знаем, где находятся наши поля, нам нужно понять условия.
Мы не планировали оформлять поля списком, тем более что это наша основная задача — оформлять поля по условию.
Вся необходимая нам информация содержится в столбце post_content.
Он хранит условия и значения в формате сериализованного массива.
Причем условия выдачи привязаны к группе полей, поэтому для разбора условий нужно получить данные по группе, которые выглядят примерно так:
Вы будете проверять по своим условиям, для понимания всей этой ерунды выделю важные в этой сфере моменты:a:12:{s:8:"location";a:1: {i:0;a:1: {i:0;a:3 {s:5:"param";s:13:"post_taxonomy";s:8:"operator";s:2:"==";s:5:"value";s:27:"product_cat:fruit";} } } s:8:"position";s:6:"normal";s:5:"style";s:7:"default";s:15:"label_placement";s:4:"left";s:21:"instruction_placement";s:5:"label";s:14:"hide_on_screen";s:0:"";s:11:"description";s:0:"";s:18:"acfe_display_title";s:0:"";s:13:"acfe_autosync";s:0:"";s:9:"acfe_form";i:0;s:9:"acfe_meta";s:0:"";s:9:"acfe_note";s:0:""; }
s:5:"param";s:13:"post_taxonomy";s:8:"operator";s:2:"==";s:5:"value";s:27:"product_cat:fruit";
Вот вся информация, которая нам нужна:
- параметр условия «post_taxonomy»;
- значение согласно условию должно быть "==";
- ну и само значение «product_cat:fruit»;
Поля выбираем с помощью столбца post_parent. У нас есть имена и идентификаторы полей, но мы пока не знаем типы полей и связанные с ними условия.
Вернемся к данным поля post_content, теперь наши данные выглядят немного иначе: a:10:
{s:4:"type";s:4:"text";s:12:"instructions";s:0:"";s:8:"required";i:1;s:17:"conditional_logic";i:0;s:7:"wrapper";a:3:
{s:5:"width";s:0:"";s:5:"class";s:0:"";s:2:"id";s:0:"";}
s:13:"default_value";s:0:"";s:11:"placeholder";s:0:"";s:7:"prepend";s:0:"";s:6:"append";s:0:"";s:9:"maxlength";s:0:"";}
Здесь для нас упакована информация, относящаяся к отображаемому полю:
- тип поля – «текст»;
- обязательный – «обязательный»;
- класс, длина, значение по умолчанию, заполнитель и т. д.
Часть 3. Сохранение информации
Но остается еще один вопрос – что делать с полученной информацией? Поэтому нам необходимо понять, как хранится информация ACF. Для дополнительной информации и возможных настроек поста в Wordpress предусмотрена специальная таблица мета-постов.В нем хранится самая разнообразная информация и, конечно, разработчики ACF воспользовались этой возможностью.
Но следует отметить, что они не использовали прямой подход. Типичная запись в таблице postmeta состоит из 4 полей — уникальный ключ в базе данных (порядковый номер записи), ID поста, с которым связано поле, идентификатор (по которому разработчик получает поле с помощью метода get_post_meta( ) функция) и значение.
В принципе этого достаточно, чтобы иметь соответствующую информацию.
Но разработчики ACF разделили задачу на две составляющие: При сохранении данных ACF делается запись с именем и значением поля.
ключ _sort содержит ссылку на post_name поля ACF из таблицы сообщений, а запись с ключом сортировки (без подчеркивания) сохраняет значение поля.
Вот и все.
Надеюсь, что полученные знания помогут вам в вашем развитии.
Всем удачи! Теги: #backend #php #MySQL #бэкэнд-программирование #разработка #wordpress #CMS #плагины WordPress #плагин #acfs #бэкэнд-разработка
-
Михаил Фридман Вложил $200 Млн В Uber
19 Oct, 24 -
Микроспутник Kicksat
19 Oct, 24