advanced custom fields update_field для типа поля: Таксономия
Мне нужно вставить запись через wp_insert_post и затем добавить соответствующие post_meta - однако админка WP была кастомизирована с помощью отличного плагина ACF.
Я знаю, что могу использовать add_post_meta таким образом:
add_post_meta( $post_id, 'q_key_type', $q_key_type );
Однако, чтобы ACF работал корректно, необходимо также использовать функцию "update_field" - вот так:
update_field( "field_52c737a413e07", $q_key_type, $post_id );
Этот метод работает нормально, но я не могу зарегистрировать объект Таксономии корректно - я могу сохранить значение с помощью add_post_meta - при просмотре новой записи Таксономия не распознается - значение пустое, хотя в таблице postmeta значение сохраняется правильно - отсутствует правильное распознавание поля.
Я могу сохранять поля типа "Текст" и "Пользователь" корректно, используя эти два метода.
Вот изображение двух строк в таблице post_meta - первые две созданы ACF - последние две вручную - они выглядят идентично:
Я нашел только одну другую ссылку на то же имя поля в таблице post_meta - она содержит массив со следующими данными - что, похоже, является настройками поля для ACF:
Array (
[key] => field_52c737a413e07
[label] => Тип
[name] => q_key_type
[type] => taxonomy
[instructions] =>
[required] => 0
[taxonomy] => q_key_type
[field_type] => select
[allow_null] => 0
[load_save_terms] => 1
[return_format] => object
[conditional_logic] => Array (
[status] => 0
[rules] => Array (
[0] => Array (
[field] => null
[operator] => ==
[value] =>
)
)
[allorany] => all
)
[order_no] => 3
)
Итак, вопрос - где еще ACF сохраняет данные таксономии - я не могу найти ничего в таблицах terms?

Мне нужно добавить оба post_meta:
add_post_meta( $insert_q_key_id, 'q_key_type', (int)$q_key_type ); // Тип Q Key
И для ACF:
update_field( "field_52c737a413e07", (int)$q_key_type, $insert_q_key_id ); // Тип Q Key
Остальная часть задачи "должна" покрываться функцией wp_set_object_terms:
wp_set_object_terms( $insert_q_key_id, (int)$q_key_type, 'q_key_type', true );
Однако эта функция недоступна в нужный момент - поэтому решением было создать простую замену этой функции:
/**
* Простая замена wp_set_object_terms, так как функция недоступна при вызове API
*
* @since 0.4
* @global Object $wpdb
* @param integer $object_id
* @param integer $tt_id
* @return Mixed ID вставленной строки при успехе | Ложь при ошибке
*/
public function q_wp_set_object_terms( $object_id = null, $tt_id = null )
{
if ( ! $object_id || ! $tt_id ) { return false; }
global $wpdb;
if ( $wpdb->insert( $wpdb->term_relationships, array( 'object_id' => (int)$object_id, 'term_taxonomy_id' => (int)$tt_id ) ) ) {
return $wpdb->insert_id;
}
// если не получилось ##
return false;
}
Которую я могу вызвать используя статический экземпляр класса (так как метод является частью отдельного класса в моем случае...):
Q_Key::q_wp_set_object_terms ( $insert_q_key_id, (int)$q_key_type );

Я обнаружил, что функция update_field()
отлично справляется с этой задачей, не знаю, обновляли ли её с тех пор. Главное, на что нужно обратить внимание - если у вас поле с единичным выбором (select) или допускающее множественный выбор, то для последнего нужно передавать массив ID таксономий.
Пример:
$field_key = 'field_xxxxxxxxxxxxxx'; // ключ вашего поля таксономии
$idarray = array("$termid->term_id"); // используем массив для передачи нескольких ID терминов. Обратите внимание, что term_id в кавычках, так как должен быть строкой
$postid = ''; // ID вашей записи
update_field($field_key, $idarray, $postid);
Функция update_field()
автоматически обработает сериализацию в зависимости от настроек поля, так что вам не о чем беспокоиться.
Я использовал этот метод для обновления как единичных, так и множественных полей таксономий в одной записи, и проверил, что затем могу запрашивать эти результаты рекомендуемыми в ACF способами - значит данные точно сохраняются корректно.
ПРИМЕЧАНИЕ: важно помнить, что я преобразовал term_id в строку, заключив его в кавычки - ACF хранит ID как строки в сериализованных массивах, поэтому это необходимо, иначе рекомендуемые способы запроса этих данных не сработают (и когда вы позже отредактируете поле через wp-admin, оно всё равно преобразует значение обратно в строку).

Обязательно добавляйте префикс ID термина вашей пользовательской таксономии при использовании функции update_field()
.
Пример:
$post_id = "event_4"; // event (пользовательская таксономия) ID термина = 4
update_field( 'my_field', 'my_value', $post_id );
Отличная документация ACF рассказывает об этом в разделе 'Обновление значения из разных объектов': https://www.advancedcustomfields.com/resources/update_field/
ACF обрабатывает все действия, связанные с созданием и синхронизацией пользовательских полей. Не нужно воссоздавать это самостоятельно с помощью add_post_meta()
и т.д.
Я потратил часы, разбираясь в этом, мне бы очень пригодилось уведомление RTFM! каждые 10 минут. ♂️
