advanced custom fields update_field для типа поля: Таксономия

5 янв. 2014 г., 21:25:48
Просмотры: 15.3K
Голосов: 6

Мне нужно вставить запись через 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 и вручную

Я нашел только одну другую ссылку на то же имя поля в таблице 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?

1
Комментарии

Стоит ли мне использовать для этого http://codex.wordpress.org/Function_Reference/wp_set_object_terms ?

Q Studio Q Studio
5 янв. 2014 г. 23:09:24
Все ответы на вопрос 3
1

Мне нужно добавить оба 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 );
6 янв. 2014 г. 11:47:36
Комментарии

4 часа искал решение, ваш вариант сработал! Огромное спасибо!!!!

Louis XIV Louis XIV
20 февр. 2015 г. 03:22:54
0

Я обнаружил, что функция 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, оно всё равно преобразует значение обратно в строку).

10 апр. 2015 г. 02:02:55
0

Обязательно добавляйте префикс 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 минут. ‍♂️

25 июн. 2020 г. 15:28:24