Вопрос или проблема
Используя 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()
. Она требует специфического подхода к идентификации строк и обновлению значений.
Алгоритм решения проблемы
-
Использование хука
acf/save_post
: Вам нужно убедиться, что вы корректно используете этот хук. Он срабатывает каждый раз, когда сохраняется пост, и это именно то время, когда можно обновить ваши ACF поля. -
Получение текущих данных повторителя: Перед обновлением полей вам необходимо извлечь существующие данные повторителя, чтобы корректно обновить нужные строки.
-
Корректное использование функции
update_sub_field()
илиupdate_row()
: Вместоupdate_row()
, рекомендуется использоватьupdate_sub_field()
, чтобы обновить конкретное подполе внутри повторителя. -
Безопасность: Важно проверять, не является ли сохраненный пост автосохранением и проверять, имеет ли текущая сессия право на внесение изменений.
Пример кода
Вот пример кода, который демонстрирует процесс обновления поля 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
каждый раз при сохранении поста. Не забудьте протестировать код на тестовом сайте, прежде чем внедрять изменения в рабочее окружение.