ACF. Редактирование данных до их записи в БД.

Современный сайт на WordPress сложно представить без плагина Advanced Custom Fields, данный плагин позволяет организовать работу с Custom Fields максимально удобно для пользователя. Этот плагин довольно прост в настройке, но иногда приходится сталкиваться с нестандартными задачами. Одна из таких задач — вставка в запись данных из полей Custom Fields.

Как извлечь данные из формы WordPress до их записи в БД?

Для начала, можно просмотреть все данные, что отправляются из формы после публикации записи, т.е. после нажатия кнопки Опубликовать/Publish. Для этого в файле functions.php создадим фильтр wp_insert_post_data, который будет вызван перед вставкой или обновлением данных в БД. Суть функции — var_dump($_POST) с выводом данных в файл, который будет находится в стандартной uploads директории WordPress. Для вывода var_dump() придётся включить буферизацию.

Я не буду публиковать всё содержимое файла, только некоторые фрагменты, т.к. данных в $_POST предостаточно.

Данная операция позволяет убедиться, что данные действительно передаются на сервер. Интересны названия переменных полей Custom Fields — они уникальны, например, $_POST[«fields»][«field_5aae6a65e2741»] и в них нет даже упоминания о названиях-псевдонимах. Стоит отметить, что при просмотре содержимого директории uploads можно будет увидеть не один, а два или три файла, .т.к. WordPress делает автосохранение записи и фильтр может «успеть» сработать несколько раз. На первый взгляд, можно поработать с $_POST, извлечь все необходимые данные и сохранить их в «теле» записи, но это обманчивый путь.

Для работы с введёнными в форму данными у ACF существует подходящий для этих целей action — acf/save_post . В документации написано, что он вызывается во время сохранения $_POST данных. То, что нужно. Есть 2 варианта вызова этого action: с высоким и низким приоритетом:

В первом случае мы сможем работать с данными ассоциативного массива $_POST, а во втором — со стандартными функциями ACF.

Для первого варианта документация по ACF предлагает воспользоваться следующей функцией:

Во втором случае данные уже сохранены и их можно обрабатывать с помощью стандартных ACF функций:

Это два стандартных примера, которые можно найти в документации.

Как вставить в тело записи данные из Custom Fields?

Пример.

Я предлагаю не обрабатывать данные до их записи в БД, а поработать с ними уже после их внесения в БД. Результат от этого не измениться, но делать обработку проще. Используем тот же action — acf/save_post