Вопрос или проблема
Я использую Gravity Forms в сочетании с пользовательским типом записи под названием “cursussen”. Я создал шаблон формы, который дублирую и обновляю каждый раз, когда создается новая пользовательская запись. Я хочу обновить некоторые поля формы на основе введенных данных, когда пользовательская запись создается из админки.
“Все” работает нормально… но единственное, что у меня не получается, это обновить правильные значения в форме. Ниже вы можете увидеть пример моего кода.
// Слушаем публикацию нового поста курса
function create_new_form($new_status, $old_status, $post) {
$post_title = $post->title;
// Проверяем, был ли пост опубликован
if('publish' === $new_status && 'publish' !== $old_status && $post->post_type === 'cursussen') {
// Создаем форму
function vhh_add_form($form) {
$form_id = 2; // Стандартная форма
$form = GFAPI::get_form($form_id);
$form['title'] = $post_title;
$result = GFAPI::add_form( $form );
return $result;
}
vhh_add_form();
}
}
Я использую это действие
add_action( 'transition_post_status', 'create_new_form', 10, 3);
Я думаю, проблема заключается в объекте $post.. это потому, что действие срабатывает до того, как все данные поста сохранены?
Большое спасибо заранее!
Я нашел собственное решение. Я использовал действие publish_post вместо transition_post_status.
$this->loader->add_action( 'publish_cursussen', $plugin_admin, 'save_cursus_meta', 10, 2);
Проблема раньше заключалась в том, что данные еще не были сохранены.. с этой новой функцией я могу получить ID, а с помощью этого ID — заголовок.
public function add_new_form( $cursus_title ){
$form_id = 2; // Стандартная форма
$form = GFAPI::get_form($form_id);
$form['title'] = $cursus_title;
$form['limitEntriesCount'] = 100;
$result = GFAPI::add_form( $form );
return $result;
}
public function save_cursus_meta( $ID, $post ){
$post_type = get_post_type($ID);
$cursus_title = get_the_title($ID);
// Если это не пост 'book', не обновляйте его.
if ( "cursussen" != $post_type) return;
$myPost = get_post($ID);
if( $myPost->post_modified_gmt == $myPost->post_date_gmt ){
$this->add_new_form($cursus_title);
}else{
return;
}
}
Надеюсь, это поможет кому-то в будущем!
Ответ или решение
Ваш вопрос касается создания пользовательского типа записи и обновления полей формы Gravity Forms на основе данных, введенных при создании этой записи. Прежде всего, вы на правильном пути, и ваше решение с использованием действия publish_post
вместо transition_post_status
— правильный подход для решения проблемы с временем выполнения.
Вот более детализированный ответ на вашу проблему:
-
Зачем использовать
publish_post
:
Действиеtransition_post_status
вызывается во время смены статуса поста и может происходить до завершения записи всех данных. Это означает, что некоторые данные могут еще не быть доступны, когда выполняется ваш код. Поэтому замена на использованиеpublish_cursussen
(что является более специфичным действием для вашего пользовательского типа записи) гарантирует, что все данные поста уже сохранены. -
Использование правильного идентификатора:
Используяsave_cursus_meta
, вы можете получить ID записанного поста и все его данные, такие как заголовок с помощью функцииget_the_title()
. Это позволяет вам уверенно обновлять поля формы. -
Обновление формы Gravity Forms:
Ваша функцияadd_new_form
может выглядеть следующим образом, чтобы гарантировать, что вы корректно обновляете все необходимые поля в форме:
public function add_new_form($cursus_title){
$form_id = 2; // Стандартная форма
$form = GFAPI::get_form($form_id);
// Изменяем заголовок формы
$form['title'] = $cursus_title;
// Дополнительные поля можно обновить по мере необходимости
// Например, если нужно обновить максимальное количество записей
$form['limitEntriesCount'] = 100;
// Сохраняем обновленную форму
$result = GFAPI::update_form($form); // используется update_form вместо add_form
return $result;
}
-
Обработка метаданных:
В вашей функцииsave_cursus_meta
, проверка, когда запись была обновлена, правильна. Это хорошая практика, чтобы избежать дублирования данных. После этой проверки вы вызываетеadd_new_form
. Убедитесь, что ваша логика обработки отвечает всем вашим требованиям по обновлению формы только в нужных случаях. -
Общий пример кода:
add_action('publish_cursussen', 'save_cursus_meta', 10, 2);
public function save_cursus_meta($ID, $post){
$post_type = get_post_type($ID);
if ("cursussen" !== $post_type) return;
$cursus_title = get_the_title($ID);
$myPost = get_post($ID);
// Проверка, что пост только что создан
if ($myPost->post_modified_gmt == $myPost->post_date_gmt) {
$this->add_new_form($cursus_title);
}
}
Это решение решает вашу исходную задачу с обновлением формы на основании данных, вводимых в пользовательский тип записи при его создании. Оно более надежно, поскольку работает с окончательными данными и позволяет эффективно обновлять вашу форму в Gravity Forms. Надеюсь, этот ответ будет полезен для вас и других людей, сталкивающихся с подобной проблемой в будущем!