Как я могу обновить поле ACF в повторителе при сохранении записи?

Вопрос или проблема

Используя Advanced Custom Fields, у меня есть повторяющееся поле (domain_assets), в котором есть два текстовых поля (registered_domain и ssl_expiration), а также подповторяющее поле (service). Я пытаюсь динамически установить текстовое поле ‘ssl_expiration’ всякий раз, когда пост сохраняется, используя комбинацию хука ‘acf/save_post‘ вместе с функцией ‘update_row()‘, но это, похоже, не работает для меня.

вставьте описание изображения здесь
вставьте описание изображения здесь

Вот что у меня есть…

add_action('acf/save_post', 'set_domain_ssl_expiration');
function set_domain_ssl_expiration($post_id){
    if (have_rows('domain_assets')) :
        while( have_rows('domain_assets') ) : the_row();
            $domain = get_sub_field('registered_domain');
            if (!empty($domain)) :
                  update_row('ssl_expiration', 3, get_ssl_info($domain, 'validTo_time_t'), $post_id);
            endif;
          endwhile;
    endif;
}

Я получаю новое значение поля ssl_expiration из функции с именем get_ssl_info(), которую я здесь не включаю. Она использует cURL для чтения информации о SSL-сертификате и возврата данных на основе данного параметра.

Когда я распечатываю значения переменных ‘$post_id‘ и ‘$domain‘, вместе с выводом функции “get_ssl_info($domain, ‘validTo_time_t’)” и отправляю их в error_log внутри функции обратного вызова хука, я получаю правильные значения для каждой. Даже когда у меня есть несколько доменов, сохраненных в посте, правильные значения для каждой из переменных отправляются в error_log для каждого соответствующего домена.

Чтобы на всякий случай, я решил добавить оператор, чтобы распечатать вывод ‘get_rows()’, сразу после оператора while, и подтвердил, что действительно, каждая из строк повторителя ‘domain_assets’ распечатывается, включая пустое поле ssl_expiration. Учитывая тот факт, что все остальные вещи работают, как должны, мне кажется, что это что-то связано с функцией ‘update_row()’, но я не вижу, в чем проблема.

Я действительно не уверен, что попробовать в этот момент. Независимо от того, сохраняю ли я новый настраиваемый пост или обновляю существующий, текстовое поле ‘ssl_expiration’ по-прежнему остается пустым. Что я упускаю?

Пожалуйста, попробуйте это, у меня работает:

$value[] = array( 
    //поле данных ключа
    'field_6433b7964ee2b' => 'image',    
    //'field_644b7312b7e8f' => 'https://vimeo.com/76979871000',
    'field_6433b7bb4ee2c' => '301'
);

$value[] = array( 
    'field_6433b7964ee2b' => 'vimeo',
    'field_644b7312b7e8f' => 'https://vimeo.com/76979871000',
);

//поле данных ключа     
update_field( 'field_6433b77b4ee2a', $value, $new_page_id );

Ответ или решение

Для обновления поля ssl_expiration в повторителе ACF после сохранения поста в WordPress, вам следует учитывать несколько важных аспектов. Основная проблема в вашем коде заключается в неправильном использовании функции update_row(). Она требует специфического подхода к идентификации строк и обновлению значений.

Алгоритм решения проблемы

  1. Использование хука acf/save_post: Вам нужно убедиться, что вы корректно используете этот хук. Он срабатывает каждый раз, когда сохраняется пост, и это именно то время, когда можно обновить ваши ACF поля.

  2. Получение текущих данных повторителя: Перед обновлением полей вам необходимо извлечь существующие данные повторителя, чтобы корректно обновить нужные строки.

  3. Корректное использование функции update_sub_field() или update_row(): Вместо update_row(), рекомендуется использовать update_sub_field(), чтобы обновить конкретное подполе внутри повторителя.

  4. Безопасность: Важно проверять, не является ли сохраненный пост автосохранением и проверять, имеет ли текущая сессия право на внесение изменений.

Пример кода

Вот пример кода, который демонстрирует процесс обновления поля ssl_expiration:

add_action('acf/save_post', 'set_domain_ssl_expiration');

function set_domain_ssl_expiration($post_id) {
    // Проверяем, является ли это автосохранением
    if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) {
        return;
    }

    // Проверка, является ли пост актуальным для обновления
    if (get_post_type($post_id) !== 'your_post_type') {
        return;
    }

    // Получаем данные повторителя
    if (have_rows('domain_assets', $post_id)) {
        while (have_rows('domain_assets', $post_id)) {
            the_row();
            // Получаем зарегистрированный домен
            $domain = get_sub_field('registered_domain');
            if (!empty($domain)) {
                // Получаем данные SSL
                $ssl_expiration = get_ssl_info($domain, 'validTo_time_t');
                // Обновляем поле ssl_expiration
                update_sub_field('ssl_expiration', $ssl_expiration, $post_id);
            }
        }
    }
}

Пояснения к коду

  • Код начинается с добавления действия для хука acf/save_post. Функция set_domain_ssl_expiration будет выполнена всякий раз, когда пост сохраняется.
  • Мы проверяем, не было ли это автосохранение, чтобы избежать ненужных обновлений.
  • Затем проверяем тип поста, чтобы убедиться, что мы обновляем только нужные посты (замените 'your_post_type' на актуальный тип вашего поста).
  • С помощью функции have_rows() извлекаем данные повторителя. Далее проходим по его строкам с помощью цикла while.
  • Внутри цикла получаем значение домена и проверяем, чтобы оно не было пустым.
  • Мы получаем срок действия SSL и обновляем поле ssl_expiration с помощью update_sub_field(), передавая нужные параметры.

Заключение

Обновление значений полей в ACF может быть неочевидным, особенно с учетом вложенных полей. Убедитесь, что вы используете правильный подход к извлечению и обновлению данных. Данный код должен корректно обновлять поле ssl_expiration каждый раз при сохранении поста. Не забудьте протестировать код на тестовом сайте, прежде чем внедрять изменения в рабочее окружение.

Оцените материал
Добавить комментарий

Капча загружается...